تکنیک‌های پرامپت‌نویسی

نوشته حسین بهنودی در ۲۴ فروردین ۱۴۰۳

مهندسی پرامپت یعنی هنر نوشتن دستورهای موثر برای هوش مصنوعی. این مهارت به شما کمک می‌کند پرامپت‌ها را طوری طراحی و اصلاح کنید که برای انجام کارهای مختلف، بهترین و دقیق‌ترین نتایج را بگیرید.

در این نوشته، به سراغ تکنیک‌های پیشرفته می‌رویم. این تکنیک‌ها به شما کمک می‌دهند تا هم کارهای پیچیده‌ را با هوش مصنوعی انجام دهید و هم به عملکرد و دقت پاسخ‌هایش بیشتر اعتماد کنید.


پرامپت‌نویسی بدون نمونه (Zero-Shot)

امروزه LLMs مانند GPT و Gemini، غول‌های هوشمندی هستند که با حجم وصف‌ناپذیری از اطلاعات آموزش دیده‌اند. این آموزش سنگین باعث شده تا آن‌ها بتوانند برخی کارها را بدون نیاز به هیچ راهنمایی اضافه‌ای، یعنی به صورت «بدون نمونه» (Zero-Shot)، انجام دهند.

پرامپت‌نویسی بدون نمونه یعنی شما مستقیماً و بدون اینکه هیچ مثالی به مدل نشان دهید، از او می‌خواهید کاری را برایتان انجام دهد. درست مثل اینکه از یک دوست دانا سؤالی بپرسید و انتظار داشته باشید بدون نیاز به توضیح اضافه، منظور شما را بفهمد.

ما در مقاله قبل این روش را امتحان کردیم. برای نمونه، به این مثال از دسته‌بندی متن نگاه کنید:

پرامپت:

این متن را در یکی از دسته‌های «مثبت»، «منفی» یا «خنثی» قرار بده.
متن: به نظرم تعطیلات بدی نبود.
احساسات:

خروجی:

خنثی

همان‌طور که می‌بینید، ما هیچ مثالی از تحلیل احساسات به مدل ندادیم. خودِ مدل از قبل مفهوم «احساسات» را یاد گرفته بود. این دقیقاً همان جادوی قابلیت «بدون نمونه» است که وارد عمل می‌شود!

دانشمندان برای تقویت آن، روش‌های هوشمندانه‌ای ابداع کرده‌اند. یکی از این روش‌ها «آموزش با دستور کار» (Instruction Tuning) است. در این شیوه، مدل را با مجموعه‌ای از مثال‌ها که همگی به شکل دستور هستند، بارها آموزش می‌دهند تا در انجام فرمان‌ها حرفه‌ای شود.

یک روش پیشرفته‌تر هم به نام «یادگیری تقویتی با بازخورد انسانی» (RLHF) وجود دارد. در این روش، انسان‌ها به پاسخ‌های مدل امتیاز می‌دهند و مدل کم‌کم یاد می‌گیرد پاسخ‌هایی تولید کند که بیشتر موردپسند ما باشد. مدل‌های قدرتمندی مانند ChatGPT، بخش بزرگی از توانایی خود را مدیون همین روش‌ها هستند. البته نگران نباشید، در ادامه مفصل‌تر درباره این تکنیک‌های جذاب توضیح خواهیم داد.


پرامپت‌نویسی چند نمونه‌ای (Few-Shot)

اگرچه LLMs «بدون نمونه» (zero-shot) توانایی چشمگیری از خود نشان می‌دهند، اما همچنان در انجام وظایف پیچیده‌‌تر با این روش، عملکرد ضعیف‌تری دارند. «پرامپت‌نویسی چند نمونه‌ای» (Few-shot prompting) می‌تواند برای فعال‌سازی «یادگیری در زمینه» (in-context learning) استفاده شود؛ در این روش، ما با ارائه نمونه‌هایی در پرامپت، مدل را به سمت عملکرد بهتر هدایت می‌کنیم. این نمونه‌ها به عنوان راهنمایی برای مثال‌های بعدی عمل می‌کنند که می‌خواهیم مدل به آن‌ها پاسخ دهد.

ویژگی‌های چند نمونه‌ای برای اولین بار زمانی ظاهر شدند که مدل‌ها به اندازه‌ی کافی بزرگ شدند.

بیایید پرامپت‌نویسی چند نمونه‌ای را با مثالی که در مقاله‌ی براون و همکاران (۲۰۲۰) ارائه شده است، نشان دهیم. در این مثال، وظیفه این است که یک کلمه‌ی جدید به درستی در یک جمله استفاده شود.

پرامپت:

«whatpu» یک حیوان کوچک و پشمالوی بومی تانزانیا است. یک مثال از جمله‌ای که از کلمه whatpu استفاده می‌کند این است:
ما در آفریقا سفر می‌کردیم و این whatpuهای خیلی بامزه را دیدیم.

«farduddle» کردن به معنای بالا و پایین پریدن خیلی سریع است. یک مثال از جمله‌ای که از کلمه farduddle استفاده می‌کند این است:

خروجی:

وقتی در بازی برنده شدیم، همه ما برای جشن گرفتن شروع به farduddle کردن کردیم.

می‌توانیم مشاهده کنیم که مدل با دریافت تنها یک نمونه، به نوعی یاد گرفته است که چگونه وظیفه را انجام دهد. برای وظایف دشوارتر، می‌توانیم تعداد نمونه‌ها را افزایش دهیم (مثلاً دو نمونه یا بیشتر).

بر اساس یافته‌های مین و همکاران (۲۰۲۲)، هنگامیکه از پرامپت‌نویسی چند نمونه‌ای استفاده می‌کنید، دو چیز خیلی مهم‌اند:

  • تعیین برچسب: مشخص شود هر نمونه چه برچسبی (پاسخی) دارد. به بیان دیگر، انواع پاسخ‌هایی که می‌خواهید مدل بدهد را در مثال‌ها نشان دهید.
  • شبیه بودن: شباهت متن ورودی با نمونه‌های داده شده مهم است. به عبارت ساده‌تر، مثالهایی شبیه به ورودی‌ واقعی‌تان را ارائه کنید.

این نکات حتی اگر برچسب‌ها به تصادفی انتخاب شده باشند، باز هم روی کیفیت پاسخ تاثیرگذارند.

بیایید چند مثال را امتحان کنیم. ابتدا، یک مثال با برچسب‌های تصادفی را امتحان می‌کنیم (به این معنی که برچسب‌های «منفی» و «مثبت» به صورت تصادفی به ورودی‌ها اختصاص داده شده‌اند):

پرامپت:

این عالی است! // منفی
این بد است! // مثبت
عجب فیلمی بود // مثبت
چه نمایش وحشتناکی! //

خروجی:

منفی

با وجود اینکه برچسب‌ها به صورت تصادفی اختصاص داده شده‌اند، همچنان پاسخ صحیح را دریافت می‌کنیم. توجه داشته باشید که ما قالب را حفظ کردیم که این موضوع به بهبود عملکرد کمک می‌کند. در واقع، با آزمایش‌های بیشتر به نظر می‌رسد مدل‌های جدیدتر، حتی در برابر قالب‌های تصادفی نیز مقاوم‌تر شده‌اند. مثال:

پرامپت:

مثبت این عالی است!
این بد است! منفی
عجب فیلمی بود
مثبت
چه نمایش وحشتناکی! —

خروجی:

منفی

در مثال بالا هیچ یکدستی در قالب وجود ندارد، اما مدل همچنان برچسب صحیح را پیش‌بینی کرد. باید تحلیل جامع‌تری انجام دهیم تا تأیید کنیم که آیا این موضوع برای وظایف متفاوت و پیچیده‌تر، و همچنین برای انواع مختلف پرامپت‌ها نیز صادق است یا خیر.

محدودیت‌های پرامپت‌نویسی چند نمونه‌ای

پرامپت‌نویسی چند نمونه‌ای استاندارد در بسیاری از کارها به خوبی عمل می‌کند، اما هنوز یک تکنیک بی‌نقص نیست، به ویژه هنگام مواجهه با وظایف استدلالی پیچیده‌تر. بیایید نشان دهیم چرا اینگونه است. آیا مثال قبلی را به خاطر دارید که در آن درخواست زیر را ارائه کردیم:

مجموع اعداد فرد در این گروه یک عدد زوج است: ۱، ۷، ۱۳، ۵، ۳۲، ۱۵.

پاسخ:

اگر این را دوباره امتحان کنیم، مدل خروجی زیر را تولید می‌کند:

بله، مجموع اعداد فرد در این گروه ۱۰۷ می‌شود که یک عدد زوج است.

این پاسخ صحیح نیست و نه تنها محدودیت‌های این روش را نمایش می‌دهد، بلکه نشان می‌دهد که نیاز به مهندسی پرامپت پیشرفته‌تری وجود دارد.

بیایید چند نمونه دیگر اضافه کنیم تا ببینیم آیا پرامپت‌نویسی چند نمونه‌ای نتایج را بهبود می‌بخشد یا خیر.

پرامپت:

مجموع اعداد فرد این گروه، زوج است: ۱، ۲، ۱۲، ۱۵، ۹، ۸، ۴.
پاسخ: پاسخ نادرست است.
مجموع اعداد فرد این گروه، زوج است: ۲۴، ۱۲، ۸، ۴، ۱۹، ۱۰، ۱۷.
پاسخ: پاسخ درست است.
مجموع اعداد فرد این گروه، زوج است: ۲۴، ۱۳، ۸، ۴، ۱۴، ۱۱، ۱۶.
پاسخ: پاسخ درست است.
مجموع اعداد فرد این گروه، زوج است: ۲، ۴، ۱۳، ۱۲، ۱۰، ۹، ۱۷.
پاسخ: پاسخ نادرست است.
مجموع اعداد فرد این گروه، زوج است: ۱، ۷، ۸۲، ۱۳، ۵، ۳۲، ۱۵.
پاسخ:

خروجی:

پاسخ درست است.

این روش کارساز نبود. به نظر می‌رسد وقتی می‌خواهیم هوش مصنوعی مسائل پیچیده را حل کند، دادن چند نمونه کافی نیست. در واقع، مثالی که در اینجا دیدیم نیاز به چندین مرحله استدلال دارد. یعنی بهتر است به جای دادن کل مسئله به هوش مصنوعی، آن را به مراحل کوچک‌تر تقسیم کنیم و هر مرحله را جداگانه به هوش مصنوعی توضیح دهیم.

این روش که به آن «زنجیره تفکر» (Chain-of-Thought یا CoT) می‌گویند، در حل مسائل پیچیده‌ای مثل محاسبات، استدلال‌های منطقی و کار با نمادها بسیار موفق بوده است.

اگر با روش‌های پرامپت‌نویسی بدون نمونه (zero-shot) یا چند نمونه‌ای (few-shot) به نتیجه دلخواه نمی‌رسید، احتمالا مدل هوش مصنوعی شما برای حل آن وظیفه خاص، اطلاعات کافی ندارد. در این صورت، پیشنهاد می‌کنیم به فکر تنظیم دقیق مدل (fine-tuning) باشید یا از تکنیک‌های پیشرفته‌تر پرامپت‌نویسی استفاده کنید.


پرامپت‌نویسی زنجیره تفکر (Chain-of-Thought یا CoT)

روش «زنجیره تفکر» یا CoT تکنیکی است که به LLMs کمک می‌کند تا مسائل پیچیده را با تفکر گام‌به‌گام حل کنند. در این شیوه، مدل به جای ارائه پاسخ نهایی، مراحل رسیدن به جواب را هم مشخص می‌کند. این کار قدرت استدلال مدل را به شکل چشمگیری بالا می‌برد.

اگر این تکنیک را با روش «چند نمونه‌ای» ترکیب کنید، برای حل مسائلی که به تفکر نیاز دارند، به نتایج فوق‌العاده‌ای می‌رسید.

پرامپت:

مجموع اعداد فرد این گروه، زوج است. ۴، ۸، ۹، ۱۵، ۱۲، ۲، ۱.
پاسخ: اعداد فرد این گروه عبارت‌اند از ۹، ۱۵ و ۱. مجموع آن‌ها ۲۵ می‌شود. پس پاسخ «نادرست» است.
مجموع اعداد فرد این گروه، زوج است. ۱۷، ۱۰، ۱۹، ۴، ۸، ۱۲، ۲۴.
پاسخ: اعداد فرد این گروه عبارت‌اند از ۱۷ و ۱۹. مجموع آن‌ها ۳۶ می‌شود. پس پاسخ «درست» است.
مجموع اعداد فرد این گروه، زوج است. ۱۶، ۱۱، ۱۴، ۴، ۸، ۱۳، ۲۴.
پاسخ: اعداد فرد این گروه عبارت‌اند از ۱۱ و ۱۳. مجموع آن‌ها ۲۴ می‌شود. پس پاسخ «درست» است.
مجموع اعداد فرد این گروه، زوج است. ۱۷، ۹، ۱۰، ۱۲، ۱۳، ۴، ۲.
پاسخ: اعداد فرد این گروه عبارت‌اند از ۱۷، ۹ و ۱۳. مجموع آن‌ها ۳۹ می‌شود. پس پاسخ «نادرست» است.
مجموع اعداد فرد این گروه، زوج است. ۱۵، ۳۲، ۵، ۱۳، ۸۲، ۷، ۱.
پاسخ:

خروجی:

اعداد فرد این گروه عبارت‌اند از ۱۵، ۵، ۱۳، ۷ و ۱. مجموع آن‌ها ۴۱ می‌شود. پس پاسخ «نادرست» است.

می‌بینید که وقتی مراحل استدلال را به مدل نشان دادیم، به یک پاسخ بی‌نقص رسید. جالب‌تر اینکه، برای حل این مسئله حتی به این همه مثال هم نیازی نیست و تنها یک نمونه کافی است:

پرامپت:

مجموع اعداد فرد این گروه، زوج است. ۴، ۸، ۹، ۱۵، ۱۲، ۲، ۱.
پاسخ: اعداد فرد گروه عبارت‌اند از ۹، ۱۵ و ۱. مجموع آن‌ها ۲۵ می‌شود. پس پاسخ «نادرست» است.
مجموع اعداد فرد این گروه، زوج است. ۱۵، ۳۲، ۵، ۱۳، ۸۲، ۷، ۱.
پاسخ:

خروجی:

اعداد فرد این گروه عبارت‌اند از ۱۵، ۵، ۱۳، ۷ و ۱. مجموع آن‌ها ۴۱ می‌شود. پس پاسخ «نادرست» است.

به گفته پژوهشگران، این توانایی یک «قابلیت نوظهور» (Emergent Ability) است. یعنی این ویژگی به طور خودکار فقط در LLMs پیشرفته پدیدار می‌شود و در مدل‌های کوچک‌تر وجود ندارد.

پرامپت‌نویسی CoT بدون نمونه‌ (Zero-shot CoT)

یک ایده جدید و بسیار هوشمندانه، روش «CoT بدون نمونه‌» (Zero-shot CoT) است. در این روش، شما هیچ مثالی به مدل نمی‌دهید! تنها کاری که می‌کنید این است که در انتهای پرامپت خود، عبارت جادوییِ «بیایید گام‌به‌گام فکر کنیم» را اضافه می‌کنید. بیایید یک مسئله ساده را با هم ببینیم:

پرامپت:

من به بازار رفتم و ۱۰ سیب خریدم. ۲ سیب به همسایه و ۲ سیب به تعمیرکار دادم. بعد ۵ سیب دیگر خریدم و ۱ سیب را خوردم. در آخر چند سیب برایم باقی مانده است؟

خروجی:

۱۱ سیب

همان‌طور که می‌بینید، پاسخ اشتباه است! حالا بیایید همان پرامپت را با یک تغییر کوچک امتحان کنیم.

پرامپت:

من به بازار رفتم و ۱۰ سیب خریدم. ۲ سیب به همسایه و ۲ سیب به تعمیرکار دادم. بعد ۵ سیب دیگر خریدم و ۱ سیب را خوردم. در آخر چند سیب برایم باقی مانده است؟
بیایید گام‌به‌گام فکر کنیم.

خروجی:

۱. شما با ۱۰ سیب شروع کردید.
۲. ۲ سیب به همسایه و ۲ سیب به تعمیرکار دادید، پس ۴ سیب کم شد و ۶ سیب برایتان باقی ماند.
۳. بعد ۵ سیب دیگر خریدید و تعداد سیب‌هایتان به ۱۱ رسید (۶ + ۵).
۴. در آخر ۱ سیب را خوردید و در نتیجه ۱۰ سیب برای شما باقی ماند (۱۱ – ۱).

این جمله ساده، مدل را وادار به استدلال گام‌به‌گام کرد و به پاسخ درست رسید. این تکنیک به خصوص زمانی مفید است که نمی‌خواهید یا نمی‌توانید مثال‌های طولانی برای مدل آماده کنید.

زنجیره تفکر خودکار (Auto-CoT)

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

برای حل این مشکل، پژوهشگران روش «زنجیره تفکر خودکار» یا Auto-CoT را ابداع کرده‌اند. ایده اصلی این است: به جای اینکه ما به صورت دستی مثال طراحی کنیم، از خودِ LMMs می‌خواهیم این کار را برایمان انجام دهد! مدل با استفاده از همان عبارت «بیایید گام‌به‌گام فکر کنیم»، برای پرسش‌های مختلف، زنجیره‌های استدلال تولید می‌کند.

البته، ممکن است مدل در تولید این استدلال‌ها دچار اشتباه شود. برای حل این مشکل، در روش Auto-CoT سعی می‌شود تا از سؤالات متنوعی استفاده شود تا اشتباهات احتمالی اثر کمتری داشته باشند.

فرآیند Auto-CoT در دو گام انجام می‌شود:

  1. خوشه‌بندی پرسش‌ها: سؤالات موجود به چند دسته یا خوشه تقسیم می‌شوند.
  2. نمونه‌برداری از مثال‌ها: از هر خوشه، یک پرسش نماینده انتخاب می‌شود و مدل، زنجیره تفکر آن را تولید می‌کند.

در این گام، از معیارهای ساده‌ای (که به آنها روش ابتکاری یا heuristic می‌گویند) مانند طول سؤال (مثلاً کمتر از ۶۰ توکن) و تعداد مراحل استدلال (مثلاً ۵ مرحله) استفاده می‌شود. این کار باعث می‌شود مدل، مثال‌های ساده و دقیقی را برای آموزش خود انتخاب کند.


متا پرامپت‌نویسی (Meta Prompting)

متا پرامپت‌نویسی یک روش هوشمندانه و پیشرفته در دنیای مهندسی پرامپت است. در این روش، به جای اینکه روی جزئیات یک مسئله تمرکز کنیم، به «ساختار» و «الگوی» آن توجه می‌کنیم.

هدف این است که یک راهکار کلی و ساختاریافته برای گفتگو با LLMs پیدا کنیم. در این روش، «شکل» و «چهارچوب» اطلاعات مهم‌تر از محتوای جزئی آن است.

ویژگی‌های کلیدی

بر اساس پژوهش ژانگ و همکاران (۲۰۲۴)، ویژگی‌های اصلی متا پرامپت‌نویسی عبارت‌اند از:

  1. ساختارگرایی: در این روش، چهارچوب و الگوی یک مسئله و راه‌حل آن، از محتوای جزئی آن مهم‌تر است.
  2. تمرکز بر دستور زبان (Syntax): از قواعد دستوری به عنوان یک نقشه راه برای ساختن پاسخ دلخواه استفاده می‌شود.
  3. مثال‌های کلی: به جای مثال‌های واقعی و پر از جزئیات، از مثال‌هایی استفاده می‌کنیم که فقط «اسکلت» و ساختار کلی مسئله را نشان می‌دهند.
  4. فراگیری: این تکنیک محدود به یک حوزه خاص نیست و می‌تواند برای حل طیف وسیعی از مسائل، پاسخ‌هایی ساختاریافته تولید کند.
  5. نگاه دسته‌بندی‌شده: این روش، با الهام از شاخه‌ای در منطق به نام «نظریه نوع‌ها»، روی دسته‌بندی و چیدمان منطقی اجزای مختلف پرامپت تأکید دارد.

مزایا نسبت به پرامپت‌نویسی چند نمونه‌ای

تفاوت اصلی این دو روش در نگاه آن‌هاست: متا پرامپت‌نویسی به «ساختار» اهمیت می‌دهد، اما پرامپت‌نویسی چند نمونه‌ای به «محتوا».

برای مثال، پژوهشگران برای حل مسائل ریاضی از بنچمارک MATH (مجموعه‌ای از مسائل چالشی برای ارزیابی هوش مصنوعی)، تفاوت این دو رویکرد را به وضوح نشان داده‌اند.

مهم‌ترین مزایای متا پرامپت‌نویسی عبارت‌اند از:

  1. صرفه‌جویی در توکن‌ها: با تمرکز بر ساختار به جای جزئیات زیاد، توکن‌های کمتری مصرف می‌شود.
  2. امکان مقایسه عادلانه: وقتی تأثیر مثال‌های خاص کم می‌شود، می‌توان عملکرد مدل‌های مختلف را در حل مسائل، منصفانه‌تر با هم مقایسه کرد.
  3. عملکردی شبیه به روش بدون نمونه: این روش را می‌توان نوعی پرامپت‌نویسی بدون-نمونه دانست، چون تلاش می‌کند تأثیر مثال‌های خاص را به حداقل برساند.

کاربردها

متا پرامپت‌نویسی با تمرکز بر الگوهای ساختاری، مانند یک نقشه راه به ما کمک می‌کند تا مسائل پیچیده را حل کنیم. این روش، قدرت استدلال مدل‌های زبانی بزرگ را در زمینه‌های مختلف تقویت می‌کند.

البته یک نکته مهم وجود دارد: این روش زمانی بهترین نتیجه را می‌دهد که مدل هوش مصنوعی، از قبل دانشی کلی درباره آن موضوع داشته باشد. خوشبختانه، مدل‌های زبانی بزرگ قدرت یادگیری و تعمیم بالایی دارند و می‌توانند دانش خود را به مسائل جدید نیز گسترش دهند. با این حال، درست مانند روش بدون-نمونه، اگر مسئله خیلی خاص یا کاملاً جدید باشد، ممکن است عملکرد مدل کمی افت کند.

این تکنیک به ویژه در موارد زیر بسیار کارآمد است:

حل مسائل پیچیده‌ای که به استدلال نیاز دارند.

پاسخ به مسائل ریاضی.

انجام چالش‌های برنامه‌نویسی.

بررسی پرسش‌های نظری و مفهومی.