پرامپتنویسی چیست و چرا برای برنامهنویسان مهم است؟
پرامپتنویسی یعنی طراحی متنی که مدل زبانی را به نتیجهی دلخواه و قابلتکرار میرساند. برای یک برنامهنویس دو کاربرد دارد: گفتگو با دستیار کدنویسی در کار روزانه و نوشتن پرامپتهایی که درون محصول اجرا میشوند، مثلاً در یک چتبات مبتنی بر مدل زبانی.
ذهنیت درست این است که مدل را یک همکار بسیار سریع ولی بدون زمینه در نظر بگیرید. چیزی را که برای شما بدیهی است نمیداند: نسخهی فریمورک، قراردادهای تیم، یا اینکه خروجی قرار است توسط یک تابع تجزیه شود. هر کدام را باید صریح بنویسید.
ساختار یک پرامپت قوی
بیشتر پرامپتهای ضعیف یک یا چند جزء زیر را ندارند. لازم نیست همیشه هر چهار بخش را بنویسید، اما اگر نتیجه نامناسب بود، اول ببینید کدام جزء گم شده است.
| جزء | کارکرد | نمونه |
|---|---|---|
| نقش | سطح تخصص و لحن را تعیین میکند | «بازبین ارشد TypeScript هستی» |
| زمینه | اطلاعاتی که مدل ندارد | «پروژه با React 18 و Vite است» |
| وظیفه | یک کار مشخص و قابلسنجش | «فقط باگهای مربوط به async را پیدا کن» |
| قالب خروجی | شکل دقیق پاسخ | «فهرست JSON با فیلدهای line و issue» |
مقایسه کنید. پرامپت مبهم: «این تابع را بهتر کن». پرامپت دقیق:
You are a senior Node.js reviewer.
Context: Node 20, ESM modules, no external dependencies allowed.
Task: Refactor the function below for readability. Do not change its behaviour or its signature.
Output: 1) the refactored code in one code block, 2) a bullet list of at most 3 changes you made.
<code>
{{FUNCTION_SOURCE}}
</code>جداکردن داده از دستور با برچسبهایی مثل <code> هم خوانایی را بالا میبرد و هم خطر اجرای ناخواستهی دستورهای داخل متن را کم میکند.

خروجی ساختاریافته برای استفاده در کد
وقتی خروجی مدل وارد برنامهی شما میشود، متن آزاد دردسر است. قالب را صریح بخواهید، یک نمونه نشان دهید و همیشه پیش از استفاده اعتبارسنجی کنید؛ مدل گاهی یک جملهی مقدماتی اضافه میکند یا کلیدی را جا میاندازد.
const prompt = [
"Classify the support ticket. Reply with JSON only, no prose:",
'{"category": "billing|bug|feature|other", "urgent": true|false}',
"Ticket: " + ticketText
].join("\n");
function parseTicket(text) {
const start = text.indexOf("{"), end = text.lastIndexOf("}");
const data = JSON.parse(text.slice(start, end + 1));
const ok = ["billing", "bug", "feature", "other"].includes(data.category)
&& typeof data.urgent === "boolean";
if (!ok) throw new Error("Invalid model output");
return data;
}الگوهایی که واقعاً جواب میدهند
مثالهای چندتایی (few-shot)
دو یا سه نمونهی ورودی و خروجی، سبک و قالب را بهتر از چند پاراگراف توضیح منتقل میکنند. نمونهها را متنوع انتخاب کنید و یک مورد مرزی هم بگنجانید تا مدل فقط یک الگو را تقلید نکند.
اول فکر کردن، بعد جواب دادن
برای مسئلههای چندمرحلهای (دیباگ، محاسبه، طراحی) از مدل بخواهید ابتدا مرحلهها یا فرضیهها را فهرست کند و بعد نتیجه بدهد. اگر فقط جواب نهایی را لازم دارید، خروجی را در دو بخش جدا بخواهید و بخش استدلال را نمایش ندهید.
تقسیم کار بزرگ
یک پرامپت غولپیکر برای «کل ماژول پرداخت را بنویس» معمولاً نتیجهی ضعیفی دارد. بهتر است زنجیرهای از گامهای کوچک بسازید: طراحی، رابطها، پیادهسازی، تست. خروجی هر گام را بررسی کنید و به گام بعد بدهید.
بازخورد خطا
وقتی کد تولیدشده خطا میدهد، پیام کامل خطا و خروجی تست را همراه کد بفرستید و تنها همان بخش را بخواهید اصلاح شود. توضیح «کار نمیکند» اطلاعاتی نمیدهد.
اشتباههای رایج و راه اصلاح
| اشتباه | علامت | اصلاح |
|---|---|---|
| درخواست مبهم | پاسخ کلی و پر از حاشیه | وظیفهی مشخص و معیار پایان بنویسید |
| نبود زمینه | API یا نسخهی اشتباه | نسخه، فایلهای مرتبط و محدودیتها را بدهید |
| دستورهای متناقض | گاهی این و گاهی آن | اولویت را صریح بنویسید یا یکی را حذف کنید |
| منفیگویی زیاد | همان چیزی که نخواستهاید ظاهر میشود | بهجای «نکن»، بگویید چه کنید |
| بدون اعتبارسنجی | خرابی گاهبهگاه در تولید | خروجی را تجزیه و بررسی کنید |
یک باور غلط رایج: «پرامپت طولانیتر همیشه بهتر است». طول بیهدف، دستورها را در هم میریزد؛ مهم دقت است، نه تعداد کلمه.
پرامپت را مثل کد نگهداری کنید
پرامپتهایی که در محصول اجرا میشوند بخشی از منطق برنامهاند. آنها را در مخزن نگه دارید، با شناسهی نسخهی مشخص و در فایلهای جدا از کد، و هر تغییر را با یک مجموعهی تست ثابت بسنجید.
// prompts/classify-ticket.v3.js
export const classifyTicket = {
version: "v3",
system: "Classify support tickets. Reply with JSON only.",
examples: [
{ in: "I was charged twice", out: '{"category":"billing","urgent":true}' },
{ in: "Dark mode please", out: '{"category":"feature","urgent":false}' }
]
};برای ساختن مجموعهی تست و اندازهگیری، همان روش ارزیابی که در مقالهی ساخت چتبات آمده قابلاستفاده است. اگر پرامپتها در گردشکارهای کسبوکاری اجرا میشوند، اتوماسیون با هوش مصنوعی را هم ببینید.
چکلیست پیش از ارسال پرامپت
- وظیفه یک جملهی روشن و قابلسنجش است.
- زمینهی لازم (نسخه، فایل، محدودیت) نوشته شده است.
- قالب خروجی و در صورت نیاز یک نمونه مشخص است.
- داده و دستور با جداکننده از هم جدا شدهاند.
- برای خروجی ماشینی، اعتبارسنجی و مسیر خطا وجود دارد.
- نتیجه با چند ورودی واقعی، نه فقط یک نمونه، آزموده شده است.
برای ادغام این عادتها در فرایند کل تیم، مقالهی هوش مصنوعی در توسعهی نرمافزار سیاستهای عملی را پیشنهاد میکند. مستندات رسمی ارائهدهندهها هم منبع خوبی برای جزئیات هر مدل است؛ برای مثال مستندات جاوااسکریپت در MDN برای کار با JSON در کد.
پرسشهای متداول
پرامپت خوب برای کدنویسی چه ویژگیهایی دارد؟
وظیفهی مشخص، زمینهی فنی (زبان، نسخه، فایلهای مرتبط)، محدودیتها و قالب خروجی روشن دارد. اگر لازم باشد یک نمونهی ورودی و خروجی هم اضافه میشود. هدف این است که مدل مجبور به حدس زدن نشود.
few-shot چیست و کی استفاده میشود؟
یعنی چند نمونهی ورودی و خروجی را داخل پرامپت میگذارید. وقتی قالب یا سبک خاصی میخواهید، مثلاً طبقهبندی یا استخراج داده، معمولاً از توضیح متنی طولانی مؤثرتر است.
چطور مطمئن شوم خروجی مدل JSON معتبر است؟
قالب را صریح بخواهید، از حالت خروجی ساختاریافتهی ارائهدهنده در صورت وجود استفاده کنید، و همیشه خروجی را تجزیه و اعتبارسنجی کنید. در صورت خطا یک بار با پیام خطا دوباره درخواست بدهید.
آیا یک پرامپت روی همهی مدلها یکسان کار میکند؟
نه. مدلها در پیروی از دستور، طول پاسخ و حساسیت به قالب تفاوت دارند. هنگام تغییر مدل، پرامپتها را دوباره با مجموعهی تست ثابت اجرا و در صورت لزوم تنظیم کنید.

دیدگاهها
هنوز دیدگاهی ثبت نشده است. اولین نفر باشید.