در عصر کنونی که هوش مصنوعی (AI) به طور فزایندهای در حوزههای مختلف از جمله توسعه نرمافزار نفوذ کرده است، توانایی برقراری ارتباط مؤثر با مدلهای هوش مصنوعی از طریق پرامپتهای دقیق و کارآمد به یک مهارت حیاتی تبدیل شده است. این راهنما به عنوان یک منبع جامع برای توسعهدهندگان نرمافزار طراحی شده است تا اصول و تکنیکهای لازم برای نوشتن پرامپتهای مؤثر را فرا بگیرند و از قدرت مدلهای هوش مصنوعی مانند ChatGPT و Copilot در گردش کار توسعه خود بهرهمند شوند. هدف این راهنما، ارائه یک رویکرد گامبهگام و کاربردی است که نه تنها مفاهیم اساسی Prompt Engineering را پوشش میدهد، بلکه با ارائه مثالهای شفاف و کاربردی، درک عمیقتری از این حوزه را برای دانشجویان و متخصصان نرمافزار فراهم میسازد.

نشان دهنده فرآیندی برای طراحی و بهینهسازی پرامپتهای ورودی به مدلهای هوش مصنوعی است تا بتوان خروجی مطلوب و بهینهای را از آنها دریافت کرد. به عبارت دیگر، این هنر و علمِ ساختن درخواستهایی است که مدل هوش مصنوعی را به سمت تولید پاسخهای دقیق، مرتبط و مفید هدایت میکند. در حوزه نرمافزار، Prompt Engineering کاربردهای گستردهای دارد. توسعهدهندگان میتوانند از این تکنیک برای تولید قطعه کد، رفع اشکال (دیباگ)، ایجاد مستندات فنی، تحلیل دادهها و انجام سایر وظایف مهندسی نرمافزار به طور مؤثر استفاده کنند.
برای مثال، یک توسعهدهنده میتواند با نوشتن یک پرامپت مناسب، از یک مدل هوش مصنوعی بخواهد که تابعی را به زبان JavaScript برای اعتبارسنجی ایمیل تولید کند، یا قطعه کدی را برای یافتن باگ در یک اسکریپت Node.js پیشنهاد دهد.
مدلهای هوش مصنوعی پیشرفته، از جمله مدلهای زبان بزرگ (LLMs) مانند ChatGPT و ابزارهای برنامه نویسی مبتنی بر هوش مصنوعی مانند GitHub Copilot، به شدت به کیفیت پرامپتهای ورودی وابستهاند. این مدلها بر اساس الگوها و اطلاعات عظیمی که در طول آموزش خود کسب کردهاند، پاسخ میدهند. بنابراین، هرچه پرامپت دقیقتر، شفافتر و با جزئیات بیشتری ارائه شود، احتمال دریافت خروجی باکیفیتتر، مرتبطتر و دقیقتر افزایش مییابد. در مقابل، پرامپتهای مبهم یا ناقص میتوانند منجر به پاسخهای نادرست، غیرمفید یا نیازمند اصلاح دستی شوند. با تسلط بر مهارت پرامپت نویسی، توسعه دهندگان میتوانند زمان و تلاش مورد نیاز برای دستیابی به نتایج مطلوب را به طور چشمگیری کاهش دهند و از قابلیتهای هوش مصنوعی به نحو احسن بهره ببرند.
برای نوشتن پرامپتهای مؤثر و کارآمد، رعایت یک سری اصول و قوانین کلیدی ضروری است. در ادامه به تشریح این اصول به همراه مثالهای کاربردی میپردازیم:
۱. شفافیت و جزئیات دقیق
یکی از مهمترین اصول در نگارش پرامپت، ارائه درخواستها با حداکثر شفافیت و جزئیات ممکن است. هرچه درخواست شما واضحتر و دقیقتر باشد، مدل هوش مصنوعی بهتر میتواند منظور شما را درک کند و پاسخ مناسبی ارائه دهد.
مثال غلط:
"کدی برای مرتبسازی لیست بنویس."
این پرامپت بسیار کلی است و مشخص نمیکند که چه نوع لیستی، با چه زبانی و با استفاده از چه الگوریتمی باید مرتب شود.
مثال صحیح:
"یک تابع در Python بنویس که یک لیست از اعداد صحیح را با استفاده از الگوریتم Merge Sort مرتب کند. خروجی باید یک لیست مرتبشده باشد."
این پرامپت به طور دقیق نوع دادهها (اعداد صحیح)، زبان برنامهنویسی (Python) و الگوریتم مورد نظر (Merge Sort) را مشخص کرده است. همچنین، فرمت خروجی نیز تعیین شده است. این سطح از جزئیات به مدل هوش مصنوعی کمک میکند تا دقیقاً همان چیزی را تولید کند که مورد نیاز است.
برای توسعهدهندگان جاوااسکریپت هنگام درخواست کد JavaScript، حتماً نسخه ECMAScript مورد نظر (ES6 به بعد)، استفاده از کتابخانهها یا فریمورکهای خاص (مانند React، Angular، Vue.js) و نحوه تعامل کد با محیط (مرورگر یا Node.js) را مشخص کنید.
۲. مشخص کردن نقش و زمینه تخصصی
با تعیین نقش و زمینه تخصصی برای مدل هوش مصنوعی، میتوانید لحن، سطح دانش و نوع پاسخ دریافتی را کنترل کنید. وقتی به مدل میگویید که به عنوان یک متخصص در یک زمینه خاص عمل کند، پاسخهای آن متناسب با دانش و دیدگاه آن حوزه خواهد بود.
مثال:
"فرض کن که یک مهندس DevOps هستی و میخواهی یک اسکریپت Bash برای مانیتورینگ مصرف CPU سرور بنویسی. کد را همراه با توضیحات ارائه کن."
در این پرامپت، نقش "مهندس DevOps" به مدل داده شده است. این امر باعث میشود که مدل با در نظر گرفتن ملاحظات مربوط به عملکرد سرور، کارایی و استانداردهای DevOps، اسکریپت را تولید کند و توضیحات مرتبط را نیز ارائه دهد.
برای توسعهدهندگان جاوااسکریپت میتوانید از پرامپتهایی مانند:
"به عنوان یک توسعهدهنده ارشد React، بهترین روشها برای مدیریت state در یک کامپوننت پیچیده را توضیح بده." یا "فرض کن یک متخصص امنیت وب هستی و آسیبپذیریهای احتمالی در قطعه کد JavaScript زیر را بررسی کن." استفاده کنید.
۳. محدود کردن دامنه پاسخ
برای جلوگیری از دریافت پاسخهای طولانی، نامربوط یا خارج از موضوع، بهتر است دامنه پاسخ مدل را محدود کنید. با مشخص کردن دقیقاً آنچه میخواهید، میتوانید اطمینان حاصل کنید که خروجی دریافتی متمرکز و مفید است.
مثال:
"کدی در JavaScript برای محاسبه میانگین یک آرایه عددی بنویس. از متدهای built-in استفاده کن."
این پرامپت نه تنها زبان برنامهنویسی و هدف را مشخص میکند، بلکه استفاده از متدهای داخلی JavaScript را نیز الزامی میکند. این محدودیت از ارائه راهحلهای پیچیدهتر یا استفاده از کتابخانههای خارجی جلوگیری میکند.
۴. استفاده از قالبهای استاندارد
هنگامی که نیاز به دریافت اطلاعات ساختاریافته دارید، استفاده از قالبهای استاندارد در پرامپت میتواند بسیار مفید باشد. با مشخص کردن قالب خروجی مورد نظر (مانند JSON، XML، لیستهای نشانهگذاری شده و غیره)، میتوانید پردازش و استفاده از پاسخ مدل را آسانتر کنید.
مثال:
"کدی در Python برای پردازش دادههای JSON بنویس. ابتدا داده را از یک فایل بخوان، سپس مقدار یک کلید خاص را در همه ورودیها استخراج کن."
این پرامپت به طور ضمنی انتظار دریافت کدی را دارد که با ساختار داده JSON کار میکند. اگر نیاز به خروجی در قالب JSON داشتید، میتوانستید به طور صریح آن را در پرامپت ذکر کنید.
برای توسعهدهندگان جاوااسکریپت اگر میخواهید دادهها را در قالب JSON دریافت کنید، میتوانید از پرامپتهایی مانند "خروجی را به صورت یک شیء JSON برگردان که شامل لیست تمام توابع و توضیحات مربوط به آنها در قطعه کد زیر باشد." استفاده کنید.
۵. استفاده از Constraints و Examples
اعمال محدودیتها (Constraints) و ارائه نمونههای ورودی/خروجی میتواند به مدل هوش مصنوعی در درک بهتر انتظارات شما کمک کند و دقت پاسخها را افزایش دهد. محدودیتها میتوانند شامل ممنوعیت استفاده از تکنولوژیهای خاص، الزام به رعایت استانداردهای کدنویسی معین یا محدودیت در طول پاسخ باشند. نمونهها (Examples) با نشان دادن ورودیهای مورد انتظار و خروجیهای متناظر، به مدل کمک میکنند تا الگوها را یاد بگیرد و پاسخهای مشابهی تولید کند.
مثال:
"یک تابع در Python برای بررسی عدد اول بنویس. تابع باید مقدار True را برای اعداد اول و False را برای غیر اول برگرداند. نمونه ورودی/خروجی:
is_prime(7) # خروجی: True is_prime(10) # خروجی: False
در این مثال، نه تنها هدف تابع مشخص شده است، بلکه نمونههای ورودی و خروجی مورد انتظار نیز ارائه شده است. این امر به مدل کمک میکند تا دقیقاً متوجه شود که تابع باید چگونه عمل کند.
برای توسعهدهندگان جاوااسکریپت میتوانید از پرامپتهایی مانند
"یک تابع JavaScript بنویس که دو عدد را به عنوان ورودی بگیرد و بزرگترین مقسومعلیه مشترک (GCD) آنها را برگرداند. از حلقه while استفاده نکن. نمونه ورودی/خروجی: gcd(12, 18) باید 6 برگرداند."
استفاده کنید.
علاوه بر اصول اساسی، تکنیکهای پیشرفتهتری نیز وجود دارند که میتوانند به بهبود کیفیت و دقت پاسخهای مدلهای هوش مصنوعی کمک کنند.
۱. استفاده از Chain of Thought برای بهبود استدلال
تکنیک Chain of Thought شامل درخواست از مدل برای توضیح گامبهگام فرایند تفکر خود برای رسیدن به پاسخ نهایی است. این روش به ویژه برای مسائل پیچیده و استدلالی مفید است، زیرا به شما امکان میدهد منطق مدل را بررسی کنید و در صورت وجود اشتباه، آن را اصلاح کنید.
مثال:
"گامبهگام توضیح بده که چگونه الگوریتم Dijkstra برای یافتن کوتاهترین مسیر در یک گراف وزندار عمل میکند."
با این پرامپت، مدل نه تنها نتیجه نهایی (کوتاهترین مسیر) را ارائه میدهد، بلکه مراحل اجرای الگوریتم و منطق پشت هر مرحله را نیز توضیح میدهد.
۲. تکنیک Few-shot Prompting برای ارائه نمونههای ورودی
در تکنیک Few-shot Prompting، شما چند نمونه از ورودی و خروجی مورد نظر خود را در پرامپت ارائه میدهید. این کار به مدل کمک میکند تا الگوها را یاد بگیرد و پاسخهای مشابهی برای ورودیهای جدید تولید کند. این تکنیک به ویژه زمانی مفید است که ورودی شما پیچیده است و تعریف دقیق آن با کلمات دشوار است.
مثال:
"با توجه به مثالهای زیر، قالببندی JSON را حفظ کن و دادههای مشابه تولید کن:"
```
"data": [
{ "userId": 1, "id": 1, "title": "delectus aut autem", "completed": false },
{ "userId": 2, "id": 2, "title": "delectus", "completed": true }
]
```
در این مثال، دو نمونه از ساختار JSON مورد نظر ارائه شده است. مدل با توجه به این نمونهها، میتواند دادههای مشابه با همان قالببندی تولید کند.
۳. فرآیند Iterative Refinement برای اصلاح پاسخها
فرآیند Iterative Refinement شامل تعامل چندباره با مدل برای بهبود پاسخهای آن است. اگر پاسخ اولیه مدل کاملاً رضایتبخش نبود، میتوانید با ارائه پرامپتهای بعدی که شامل بازخورد و درخواستهای اصلاحی هستند، مدل را به سمت پاسخ مطلوب هدایت کنید.
مثال:
"یک نسخه از کد زیر را ارائه بده که هم از نظر کارایی بهینهتر باشد و هم خوانایی بهتری داشته باشد."
در این مثال، پس از دریافت یک قطعه کد، کاربر درخواست میکند که نسخه بهبودیافته آن با تمرکز بر کارایی و خوانایی ارائه شود.
۴. استفاده از System Instructions برای دقت بالاتر
تکنیک System Instructions به شما امکان میدهند تا رفتارهای کلی مدل را قبل از ارائه پرامپت اصلی تنظیم کنید. این دستورالعملها میتوانند شامل تعیین نقش مدل، لحن پاسخ، یا محدودیتهای خاص در نحوه پاسخگویی باشند.
مثال:
'به عنوان یک متخصص امنیت سایبری، آسیبپذیریهای احتمالی کد زیر را بررسی کن و پیشنهادهایی برای بهبود بده.'
دستورالعمل "به عنوان یک متخصص امنیت سایبری" باعث میشود که مدل با دیدگاه و دانش یک متخصص امنیتی به کد نگاه کند و آسیبپذیریهای مربوطه را شناسایی کند.
برای به حداکثر رساندن اثربخشی پرامپتهای خود، توجه به نکات عملی زیر نیز حائز اهمیت است:
۱. تست و ارزیابی خروجی
همیشه چندین نسخه از پرامپت خود را با تغییرات جزئی تست کنید و خروجیهای مختلف را ارزیابی کنید. بررسی کنید که آیا خروجی دریافتی مطابق انتظار و بدون تناقض است. این فرآیند به شما کمک میکند تا بهترین ساختار و کلمات را برای پرامپتهای خود پیدا کنید.
۲. استفاده از Multi-turn Prompting برای مکالمات پیچیده
برای مسائل پیچیدهتر که نیاز به چندین مرحله استدلال دارند، بهتر است پرامپت را به چندین سوال یا درخواست کوچکتر تقسیم کنید. این کار به مدل کمک میکند تا درک بهتری از مسئله پیدا کند و پاسخهای دقیقتری ارائه دهد. شما میتوانید بر اساس پاسخهای قبلی مدل، پرامپتهای بعدی را تنظیم کنید.
۳. استفاده از پارامترهای تنظیمات مدل (مثلاً Temperature، Max Tokens) اگر قابل ویرایش باشند
پارامترهای مدل مانند Temperature و Max Tokens میتوانند بر خلاقیت و طول پاسخهای مدل تأثیر بگذارند. مقدار Temperature پایینتر (مثلاً 0.2) معمولاً خروجی دقیقتر و قابل پیشبینیتری میدهد. مقدار Max Tokens را نیز میتوانید برای محدود کردن طول پاسخها و جلوگیری از تولید خروجیهای بیش از حد طولانی تنظیم کنید.