عنوان:

‫مهندسی پرامپت کارآمد برای کوپایلت در SQL Server Management Studio


نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۳/۱۱ ۱۰:۴۴
آدرس: www.dntips.ir
کوپایلت در SQL Server Management Studio (SSMS) یک ابزار هوش مصنوعی پیشرفته است که برای یاری رساندن به کاربران در مدیریت و توسعه پایگاه‌های داده SQL Server طراحی شده است. این دستیار هوشمند می‌تواند برای طیف وسیعی از متخصصان، از جمله مدیران و توسعه‌دهندگان پایگاه داده، مدیران برنامه، تحلیلگران کسب‌وکار و سایر نقش‌های مرتبط، مفید واقع شود و به صرفه‌جویی در زمان و افزایش کارایی در گردش کار آن‌ها کمک کند. کوپایلت قادر است به پرسش‌ها در مورد پایگاه‌های داده در SQL Server، Azure SQL Database، Azure SQL Managed Instance و SQL Database در Fabric پاسخ دهد. علاوه بر این، می‌تواند در نوشتن کوئری‌های Transact-SQL (T-SQL) با استفاده از زبان طبیعی (NL2SQL) یاری رساند و در زمینه پیام‌های خطا، مستندسازی، تشریح و اصلاح کوئری‌های T-SQL نیز کمک‌کننده باشد. هدف این مقاله، ارائه یک راهنمای جامع برای پرامپت‌نویسی (Prompt Engineering) مؤثر جهت بهره‌برداری حداکثری از قابلیت‌های کوپایلت در SSMS برای توسعه‌دهندگان .NET است.

شروع کار با کوپایلت: کاوش پایگاه داده و تعاملات اولیه
یکی از کاربردهای اولیه کوپایلت، کاوش و دریافت اطلاعات سریع در مورد پایگاه داده و محیط فعلی است. کاربران می‌توانند هرگونه سؤالی را به هر ترتیبی در پنجره چت جانبی (sidecar chat) از کوپایلت بپرسند. به عنوان مثال، سؤالاتی نظیر "این SQL چه نسخه‌ای است؟" یا "پایگاه‌های داده موجود در این نمونه (instance) را لیست کن" به سرعت پاسخ داده می‌شوند. همچنین می‌توان اطلاعات جزئی‌تری مانند "تنظیمات پیکربندی سرور که از مقدار پیش‌فرض تغییر کرده‌اند را در قالب جدول با ذکر تنظیم و مقدار فعلی لیست کن" ، "چگونه بفهمم چه کسانی به این پایگاه داده متصل هستند؟" ، "حالت سازگاری (compatibility mode) برای این پایگاه داده چیست؟" ، "بزرگترین جدول در پایگاه داده کدام است؟" ، "کدام ستون‌ها آدرس‌های ایمیل را ذخیره می‌کنند؟" ، "چه تعداد مشتری داریم و در کجا قرار دارند؟" و حتی "آیا هیچ یک از کارهای SQL Agent در هفته گذشته ناموفق بوده‌اند و اگر چنین است، کدام‌ها؟" را مطرح کرد.

تعاملات پیشرفته با کوپایلت: تجارب چند نوبتی و اسکریپت‌نویسی T-SQL
کوپایلت از تجارب چند نوبتی (multi-turn experience) پشتیبانی می‌کند، به این معنی که می‌توانید مجموعه‌ای از سؤالات را بپرسید که هر سؤال بعدی به پاسخ قبلی مرتبط است یا در ادامه آن مطرح می‌شود. برای مثال، می‌توانید بپرسید: "حالت سازگاری برای این پایگاه داده چیست؟" ، سپس ادامه دهید: "آخرین حالت سازگاری موجود برای این نسخه از SQL چیست؟" ، "چگونه حالت سازگاری را تغییر دهم؟" ، "این تغییر چگونه بر عملکرد کوئری تأثیر خواهد گذاشت؟" و در نهایت "دستورالعمل‌های گام به گام برای آزمایش تغییر در حالت سازگاری برای یک کوئری بدون تغییر حالت سازگاری برای کل پایگاه داده را به من بده".

این تجارب چند نوبتی می‌تواند با درخواست تولید اسکریپت نیز همراه شود. به عنوان مثال، یک مکالمه می‌تواند با سؤال "پشتیبان‌گیری از پایگاه داده (database backup) چیست؟" آغاز شود و با پرسش‌هایی مانند "تفاوت بین پشتیبان‌گیری کامل (full backup) و پشتیبان‌گیری از لاگ (log backup) چیست؟" ، "چگونه یک پشتیبان‌گیری از پایگاه داده ایجاد کنم؟" ، "آیا پایگاه داده من به پشتیبان‌گیری از لاگ تراکنش‌ها (transaction log backup) نیاز دارد؟" ، "چگونه یک پشتیبان‌گیری از لاگ تراکنش‌ها ایجاد کنم؟" ادامه یابد و در نهایت به درخواست "اسکریپت پشتیبان‌گیری از پایگاه داده را ایجاد کن" و حتی "چگونه پشتیبان‌گیری‌ها را خودکار کنم؟" و "اگر نقطه بازیابی هدف (RPO) 30 دقیقه باشد، برنامه پشتیبان‌گیری من باید چگونه باشد؟" و "اسکریپت ایجاد کارهای SQL Agent برای برنامه پشتیبان‌گیری توصیه‌شده را ایجاد کن" منجر شود.

راهنمایی کوپایلت برای Transact-SQL: نوشتن و توسعه کوئری
کوپایلت در SSMS می‌تواند در نوشتن T-SQL از طریق پرامپت‌هایی که شما ارائه می‌دهید (زبان طبیعی به T-SQL یا NLtoSQL) در چت جانبی کمک کند. اگرچه کوپایلت بر اساس اتصال ویرایشگر کوئری شما دارای زمینه (context) است، اما در حال حاضر دسترسی مستقیمی به ویرایشگر کوئری ندارد. این بدان معناست که تایپ کردن در یک ویرایشگر خالی، کمکی از کوپایلت را فراخوانی نمی‌کند و همچنین نمی‌تواند مستقیماً از ویرایشگر بخواند (اگر چیزی را هایلایت کرده باشید) یا چیزی را در آن کپی کند.
نمونه‌هایی از درخواست‌های NL_to_SQL شامل: "یک کوئری برای بازگرداندن اطلاعات فروش هفته گذشته بنویس" ، "یک کوئری برای یافتن تمام مشتریانی که در جولای 2024 سفارشاتی با مجموع بیش از 1000 دلار ثبت کرده‌اند و بر اساس مجموع نزولی مرتب شده‌اند، بنویس" ، یا "کوئری تغییر ستون ReferenceID در جدول Tickets از INT به VARCHAR(25) را بنویس".
علاوه بر نوشتن کوئری، می‌توانید برای توسعه آن نیز به صورت چند نوبتی از کوپایلت کمک بگیرید. به عنوان مثال: "چه تعداد مشتری در سال 2023 بیش از 100000 دلار هزینه کرده‌اند؟" ، سپس "کوئری‌ای که برای یافتن این اطلاعات اجرا کردی را به من بده" ، و ادامه دهید "کوئری داخلی را تغییر بده تا شناسه مشتری، نام مشتری و مجموع هزینه شده را انتخاب کند و آن را بر اساس مجموع هزینه شده به صورت نزولی مرتب کند" و "فراموش کردم که می‌خواهم ایالتی که شرکت در آن قرار دارد را در خروجی لحاظ کنم، لطفاً کوئری را برای افزودن آن به‌روزرسانی کن".

حالت‌های اجرایی کوپایلت: از خواندن تا توسعه پایگاه داده
به طور پیش‌فرض، کوپایلت در حالت فقط خواندنی (read-only mode) کار می‌کند و تنها کوئری‌هایی را اجرا می‌کند که داده‌ها را می‌خوانند. با این حال، می‌توان با استفاده از دستور /rwa در چت، حالت را به خواندن/نوشتن با تأیید (Read/Write with Approval) تغییر داد. پس از تغییر حالت با دستور /rwa ، می‌توانید از کوپایلت بخواهید کارهایی مانند به‌روزرسانی آمارهایی (statistics) که قدیمی شده‌اند را انجام دهد. ممکن است نیاز باشد جزئیات بیشتری ارائه دهید، مثلاً: "لیست نام آمارهایی که بیش از یک هفته به‌روز نشده‌اند و بیش از 10% تغییر داده برای تمام جداول در پایگاه داده داشته‌اند را ارائه بده". کوپایلت آمارها را لیست کرده و از شما می‌پرسد که آیا می‌خواهید آن‌ها را به‌روز کنید. اگر نپرسید، می‌توانید به او بگویید که آمارها را به‌روز کند. سپس کوپایلت T-SQL مربوط به به‌روزرسانی را ارائه داده و گزینه‌ای برای انتخاب Run یا Cancel می‌دهد. با انتخاب Run، کوپایلت آمارها را به‌روز می‌کند.

برای توسعه مستقیم اشیاء پایگاه داده، می‌توانید از حالت خواندن/نوشتن (Read/Write mode) استفاده کنید که با دستور /rw فعال می‌شود. پس از وارد کردن /rw ، می‌توانید از کوپایلت بخواهید مجموعه‌ای از جداول را برای پایگاه داده ایجاد کند. به عنوان مثال: "ما در حال طراحی یک پایگاه داده برای یک شرکت خیالی به نام Contoso Wireless هستیم. آن‌ها شبیه به شرکت‌های بی‌سیم موجود هستند و تلفن‌های همراه، لوازم جانبی، طرح‌های تلفن، شارژر، هدست و موارد دیگر می‌فروشند. آیا می‌توانی چند جدول پیشنهاد دهی که از برنامه من پشتیبانی کنند؟ این برنامه از مرور وب‌سایت، ایجاد سفارش، پرداخت قبوض، ردیابی فعالیت مشتری، ردیابی استفاده و غیره پشتیبانی خواهد کرد. لطفاً اسکریپت‌هایی برای ایجاد تمام جداولی که مناسب می‌دانی ارائه بده و مطمئن شو که هر جدول یک ایندکس کلاستر شده (clustered index) برای کلید اصلی (primary key) خود دارد".
در ادامه می‌توانید برای ایجاد ایندکس‌های دیگر نیز کمک بگیرید: "آیا ایندکس‌هایی وجود دارد که فکر می‌کنی بر اساس انواع کوئری‌هایی که برای یافتن داده‌ها اجرا خواهیم کرد، به آن‌ها نیاز دارم؟".
همچنین کوپایلت می‌تواند در تولید داده‌های نمونه یاری رساند: "ما نیاز به تولید داده برای هر یک از جداول داریم. هر جدول باید 100 تا 1000 ردیف داشته باشد. داده‌ها باید واقعی باشند (نمی‌توانیم نام‌ها، محصولات و غیره را تکرار کنیم). آیا می‌توانی در تولید اسکریپت برای آن کمک کنی؟ مشکلی نیست اگر اسکریپت‌ها طولانی باشند. تنوع در داده‌ها مهم‌تر از داشتن یک اسکریپت کوتاه است. برای جدول مشتریان، از ترکیبی از 50 نام کوچک و 50 نام خانوادگی و همچنین از 30 ترکیب مختلف شهر/ایالت استفاده کن".
همیشه به یاد داشته باشید که اسکریپت‌های تولید شده توسط هوش مصنوعی را قبل از اجرا بررسی کنید، زیرا ممکن است اشتباهاتی داشته باشند.

بهترین شیوه‌ها برای پرامپت‌نویسی کارآمد در کوپایلت SSMS
هدف اصلی کوپایلت در SSMS، تسریع بهره‌وری شما در گردش کارتان، از جمله نوشتن و ویرایش T-SQL است. برای بهره‌مندی حداکثری، تنها فعال کردن آن کافی نیست، بلکه باید یاد بگیرید چگونه به طور مؤثر با آن همکاری کنید. کوپایلت، مانند هر همکار دیگری، زمانی بهترین عملکرد را دارد که دستورالعمل‌های واضح و زمینه مناسب به آن داده شود. استفاده بهینه از پنجره چت نیز کیفیت تجربه شما را با کوپایلت در SSMS افزایش می‌دهد.

یک نکته مهم این است که پنجره چت را به عنوان پنجره نتایج تلقی نکنید. وقتی از کوپایلت در مورد اسکیمای (schema) یا داده‌های خود سؤال می‌کنید، ممکن است مستقیماً یک کوئری را اجرا کند تا اطلاعات را در پنجره چت به شما بازگرداند. کوپایلت تعداد ردیف‌های بازگردانده شده توسط یک کوئری را قبل از اجرا تعیین نمی‌کند، و اگر کوئری 1000 ردیف بازگرداند، سعی می‌کند آن اطلاعات را در چت نمایش دهد. مجموعه نتایج بزرگ در پنجره چت به راحتی قابل خواندن نیستند و نمی‌توان آن‌ها را دستکاری کرد. اغلب بهتر است از کوپایلت بخواهید کوئری مورد نیاز برای بازگرداندن اطلاعات را بنویسد؛ این کار تعامل و تجربه بهتری را ایجاد می‌کند.

یکی از ناامیدی‌های رایج کاربران در مورد کوپایلت‌ها، عدم ثبات در پاسخ‌ها است. پاسخ‌های هوش مصنوعی می‌توانند ناسازگار باشند زیرا به صورت احتمالی (probabilistically) و نه قطعی (deterministically) تولید می‌شوند. این بدان معناست که حتی وقتی یک سؤال مشابه پرسیده می‌شود، مدل ممکن است مجموعه‌ای از کلمات یا ساختار جملات متفاوت اما همچنان قابل قبول را بر اساس تغییرات ظریف در زمینه، پیکربندی یا تصادفی بودن داخلی انتخاب کند. علاوه بر این، مدل‌های هوش مصنوعی تفاسیر بالقوه زیادی از یک پرامپت را می‌سنجند، بنابراین تغییرات کوچک در عبارت‌بندی یا زمان‌بندی می‌تواند منجر به نتایج متفاوتی شود. این تنوع بخشی از چیزی است که هوش مصنوعی را بسیار انعطاف‌پذیر و قدرتمند می‌کند، اما اگر پرامپت‌ها بهینه ساخته نشوند، می‌تواند منجر به نتایج غیرقابل پیش‌بینی شود.

نوشتن پرامپت برای تعامل با هوش مصنوعی، هم هنر است و هم علم، دقیقاً مانند بهینه‌سازی عملکرد (performance tuning). نیازی نیست یک مهندس پرامپت (prompt engineer) باشید تا پرامپت‌های خوبی بنویسید ، اما باید از دستورالعمل‌های کلی هنگام تعامل با هوش مصنوعی آگاه باشید. به عنوان مثال، اگر بپرسید "داغ‌ترین جداول در پایگاه داده را پیدا کن"، کوپایلت ممکن است متوجه نشود که در این زمینه، "داغ‌ترین" جداول به معنای شلوغ‌ترین یا فعال‌ترین جداول است. در عوض، امتحان کنید: "10 جدول برتر در پایگاه داده که بیشترین خواندن (reads) را داشته‌اند، لیست کن".

توصیه‌های کلی برای نوشتن پرامپت عبارتند از:
  • از زبان طبیعی استفاده کنید: نیازی به استفاده از واژگان تخصصی نیست، اما سعی کنید از عبارات غیررسمی، زبان کوچه‌بازاری (slang) و اصطلاحات تخصصی نامفهوم (jargon) خودداری کنید.
  • واضح و مشخص باشید: جزئیات کافی ارائه دهید تا کوپایلت به وضوح بداند چه می‌خواهید.
  • زمینه (Context) ارائه دهید: کوپایلت در SSMS بر اساس اتصال ویرایشگر کوئری، زمینه پایگاه داده را دارد، اما می‌توانید زمینه اضافی مانند یک بازه زمانی یا اشیاء خاص پایگاه داده را نیز ارائه دهید.
  • از مثال‌ها استفاده کنید: بر اساس پاسخ‌های قبلی ادامه دهید، مانند "کوئری قبلی را طوری تغییر بده که نتایج را بر اساس CustomerID مرتب کند".
  • فرمت خروجی را تعریف کنید: کوپایلت می‌تواند اطلاعات را در قالب متن، جدول یا لیست ارائه دهد. او برای شما انتخاب می‌کند، اما شما می‌توانید به طور خاص درخواست کنید که اطلاعات در فرمت دلخواه بازگردانده شوند.

کوئیز
کدام یک از موارد زیر، یکی از توصیه‌های کلیدی برای نوشتن پرامپت مؤثر برای کوپایلت در SSMS نیست؟
الف) استفاده از زبان طبیعی و پرهیز از اصطلاحات کوچه‌بازاری.
ب) واضح و مشخص بودن و ارائه جزئیات کافی.
ج) ارائه زمینه و چارچوب، مانند بازه زمانی یا اشیاء خاص پایگاه داده.
د) استفاده حداکثری از اصطلاحات فنی پیچیده برای نمایش دانش فنی.


نتیجه‌گیری
کوپایلت در SSMS ابزاری قدرتمند برای توسعه‌دهندگان .NET و سایر متخصصان پایگاه داده است که می‌تواند بهره‌وری را به طور قابل توجهی افزایش دهد. با این حال، دستیابی به پتانسیل کامل آن مستلزم درک نحوه تعامل مؤثر با این دستیار هوشمند است. مهندسی پرامپت دقیق، شامل استفاده از زبان طبیعی واضح، ارائه زمینه کافی، تعریف فرمت خروجی مطلوب و بهره‌گیری از تجارب چند نوبتی، کلید دریافت پاسخ‌های دقیق، مرتبط و مفید از کوپایلت است. با رعایت بهترین شیوه‌های ذکر شده، توسعه‌دهندگان می‌توانند از کوپایلت نه تنها برای دریافت پاسخ به سؤالات، بلکه به عنوان یک همکار فعال در فرآیند توسعه و مدیریت پایگاه داده استفاده کنند و در نهایت کدهای T-SQL با کیفیت‌تری را با سرعت بیشتری تولید نمایند.


پاسخ کوئیز
د) استفاده حداکثری از اصطلاحات فنی پیچیده برای نمایش دانش فنی. (توصیه شده است که از زبان طبیعی استفاده شود و از اصطلاحات تخصصی نامفهوم پرهیز گردد)


مشاهده مطلب اصلی