فصل ۳ — پرامپتدهی (Prompting)
در زمینهٔ مدلهای زبانی بزرگ، پرامپتدهی به روشی گفته میشود که در آن ورودی یا نشانهای مشخص به LLM داده میشود تا خروجی مطلوبی تولید کند یا وظیفهای را انجام دهد. برای مثال، اگر بخواهیم LLM جملهای را از انگلیسی به چینی ترجمه کند، میتوانیم چنین پرامپتی به آن بدهیم:
متن را از انگلیسی به چینی ترجمه کن.
متن: The early bird catches the worm.
ترجمه:
پرامپتدهی برای LLMها بسیار مهم است، زیرا مستقیماً بر میزان موفقیت مدل در فهم و پاسخدادن به درخواست کاربر اثر میگذارد. یک پرامپت خوب میتواند مدل را به پاسخهای دقیقتر، مرتبطتر و متناسبتر با زمینه هدایت کند. این فرایند را میتوان بهصورت تکرارشونده اصلاح کرد: با تحلیل پاسخ مدل، کاربر پرامپت را تغییر میدهد تا آن را هرچه بیشتر با نیاز مشخص خود همسو کند. به دلیل اهمیت پرامپتدهی در کاربرد LLMها، طراحی prompt به مهارتی ضروری برای کاربران و توسعهدهندگان تبدیل شده است. این موضوع حوزهٔ پژوهشی فعالی با نام مهندسی پرامپت (Prompt Engineering) را شکل داده است که در آن هدف، طراحی پرامپتهای مؤثر برای استفادهٔ بهتر از LLMها و افزایش کارایی عملی آنها در کاربردهای واقعی است.
مفهوم مهم دیگری که با prompting ارتباط دارد یادگیری درونمتنی (In-context Learning) است. هنگام prompt کردن LLM میتوان اطلاعات جدیدی، مانند نمونههای حل مسئله، به context افزود تا مدل از همان context شیوهٔ حل مسئله را یاد بگیرد. مثال زیر چند نمونهٔ طبقهبندی متن بر اساس قطبیت احساس را نشان میدهد:
چند نمونه از طبقهبندی متن:
مثال ۱: We had a delightful dinner together. → برچسب: مثبت
مثال ۲: I’m frustrated with the delays. → برچسب: منفی
برچسب جملهٔ “That comment was quite hurtful.” چیست؟
برچسب:
In-context learning غالباً یک توانایی emergent در LLMها دانسته میشود که پس از pre-training پدیدار میشود. گرچه میتوان LLMها را برای وظیفههای جدید آموزش یا تنظیم کرد، in-context learning راه بسیار کارآمدی برای سازگارکردن مدل بدون آموزش یا fine-tuning اضافی فراهم میکند. شاید این یکی از برجستهترین ویژگیهای LLMها باشد: آنها در پیشآموزش دانش عمومی دربارهٔ جهان و زبان کسب میکنند و ما میتوانیم این دانش را بهسادگی در چالشهای جدید به کار بگیریم. این رویکرد همچنین روند کلی حرکت AI به سمت سامانههای تعمیمپذیرتر و کاربرپسندتر را بازتاب میدهد؛ بهجای اینکه برای هر وظیفهٔ خاص به مهندس متخصص برای fine-tuning نیاز باشد، کاربر میتواند با ارائهٔ مثال یا تنظیم context بهصورت شهودی با LLM تعامل کند.
تمرکز این فصل بر تکنیکهای prompting در LLMهاست. ابتدا چند طراحی رایج در prompt engineering بررسی میشود، سپس مجموعهای از بهبودها بر این روشها معرفی میگردد و در پایان، روشهای خودکارکردن طراحی prompt بررسی میشوند.
۳.۱ طراحی عمومی پرامپت
این بخش مفاهیم پایهٔ طراحی prompt را همراه با نمونههایی از prompting برای وظایف مختلف NLP معرفی میکند. از آنجا که اثربخشی prompting بهشدت به LLM مورد استفاده وابسته است، promptهای مؤثر برای مدلهای مختلف متفاوتاند و ارائهٔ فهرستی جامع برای همهٔ LLMها و downstream taskها دشوار است. بنابراین بحث حاضر به مدل خاصی محدود نمیشود و هدف آن ارائهٔ اصول راهنما برای طراحی prompt است.
۳.۱.۱ مبانی
واژهٔ prompt به شکلهای مختلفی به کار میرود. در این فصل prompt را متن ورودی LLM تعریف میکنیم و آن را با x نشان میدهیم. LLM با بیشینهکردن احتمال Pr(y|x) متن y را تولید میکند. در فرایند تولید، prompt شرطی است که پیشبینی بر اساس آن انجام میشود و میتواند هر اطلاعاتی را که به توصیف و حل مسئله کمک میکند در خود داشته باشد.
یک prompt را میتوان با استفاده از قالب پرامپت (Prompt Template) ساخت [Liu et al., 2023a]. template قطعهای متن شامل placeholder یا variable است که هر placeholder با اطلاعات مشخص پر میشود. دو template زیر برای درخواست پیشنهاد آخر هفته هستند:
لطفاً چند پیشنهاد برای یک آخر هفتهٔ سرگرمکننده بده.
اگر {∗premise∗}، برای یک آخر هفتهٔ سرگرمکننده چه پیشنهادهایی داری؟
در template اول صرفاً از LLM میخواهیم چند پیشنهاد بدهد؛ پس template فقط متن است و variable ندارد. در template دوم، کاربر باید متغیر {∗premise∗} را مشخص کند تا premise لازم برای پیشنهادها فراهم شود. برای مثال اگر:
premise = the weather is nice this weekend
آنگاه prompt زیر ساخته میشود:
اگر هوا این آخر هفته خوب باشد،
برای یک آخر هفتهٔ سرگرمکننده چه پیشنهادهایی داری؟
میتوان template دارای چند variable نیز طراحی کرد. مثال زیر دو جمله را از نظر شباهت معنایی مقایسه میکند:
این یک جمله است:
{∗sentence1∗}
این جملهٔ دیگری است:
{∗sentence2∗}
شباهت معنایی دو جمله را محاسبه کن.
یکی از روشهای محبوب قالببندی prompt نوشتن هر ورودی یا خروجی به فرم name:content است. برای مثال، میتوان گفتوگویی میان دو نفر با نام John و David را توصیف کرد و از LLM خواست آن را ادامه دهد:
John: {∗utterance1∗}
David: {∗utterance2∗}
John: {∗utterance3∗}
David: {∗utterance4∗}
John: {∗utterance5∗}
David: {∗utterance6∗}
John: {∗utterance7∗}
David:
قالب name:content را میتوان برای تعریف خود وظیفه نیز به کار برد. با توجه به اینکه Q و A بهترتیب مخفف Question و Answer هستند، template پرسشوپاسخ میتواند چنین باشد:
همین قالب میتواند وظایف پیچیدهتری را توصیف کند. نمونهٔ specification یک وظیفهٔ ترجمه:
وظیفه: ترجمه
زبان مبدأ: انگلیسی
زبان مقصد: چینی
سبک: متن رسمی
قالب: جملهٔ زیر را ترجمه کن: {∗sentence∗}
در سامانههای عملی، ذخیرهٔ چنین اطلاعاتی بهصورت key-value pair، مانند JSON، رایج است. بازنمایی JSON همان مثال چنین است:
{
"Task": "Translation",
"Source language": "English",
"Target language": "Chinese",
"Style": "Formal text",
"Template": "Translate the following sentence: {∗sentence∗}"
}
وقتی توصیف مسئله بهصورت attribute-based دشوار باشد، معمولتر است که LLM را با توضیحی روشن و مفصل راهنمایی کنیم. راههای زیادی برای این کار وجود دارد. یکی از آنها تعیین role برای LLM و ارائهٔ context کافی است. template زیر از LLM میخواهد نقش کارشناس را بگیرد و به پرسش کودکان پاسخ دهد:
تو یک دانشمند علوم کامپیوتر با دانش گسترده در زمینهٔ deep learning هستی.
لطفاً مفهوم رایانهای زیر را برای کودکی حدود ۱۰ ساله توضیح بده و هر جا ممکن است از مثالهای ساده استفاده کن.
{∗concept∗}
متن آغازین «تو یک دانشمند علوم کامپیوتر ... deep learning هستی» گاهی system information نامیده میشود و به LLM کمک میکند context یا constraintهای وظیفه را بهتر درک کند.
۳.۱.۲ یادگیری درونمتنی
یادگیری میتواند هنگام inference رخ دهد. in-context learning روشی از این نوع است که در آن prompt شامل demonstrationهای حل مسئله میشود و LLM از آنها میآموزد چگونه مسئلهٔ جدید را حل کند. چون در این فرایند پارامترهای مدل بهروزرسانی نمیشوند، میتوان in-context learning را راهی برای فعالسازی و سازماندهی دوبارهٔ دانش حاصل از pre-training بدون آموزش یا fine-tuning اضافی دانست. این روش امکان سازگاری سریع با مسئلهٔ جدید را فراهم میکند و مرز توانایی LLM پیشآموخته را بدون task-specific adjustment گسترش میدهد.
In-context learning را میتوان با مقایسهٔ zero-shot، one-shot و few-shot learning توضیح داد. در zero-shot learning، همانطور که نامش نشان میدهد، فرایند «یادگیری» سنتی وجود ندارد. مدل مستقیماً برای مسئلهای جدید به کار میرود که در آموزش دیده نشده است. در عمل میتوان prompt را بارها تنظیم کرد تا مدل پاسخ بهتری بسازد، بدون آنکه demonstration یا مثال حل مسئله ارائه شود. فرض کنید میخواهیم از LLM بهعنوان دستیار اصلاح دستور زبان انگلیسی استفاده کنیم. prompt در حالت zero-shot:
سیستم: تو دستیار مفیدی هستی و در اصلاح دستور زبان مهارت زیادی داری.
کاربر: یک جملهٔ انگلیسی به تو داده میشود. وظیفه این است که جملهٔ درست را خروجی بدهی.
Input: She don’t like going to the park.
Output:
در شکل اصلی کتاب، واژههای خاکستری برای نشاندادن fieldهای مختلف prompt به کار رفتهاند.
در one-shot learning یک demonstration از اصلاح جمله به prompt اضافه میکنیم تا LLM از این تجربهٔ تازه استفاده کند:
سیستم: تو دستیار مفیدی هستی و در اصلاح دستور زبان مهارت زیادی داری.
نمونه: یک جملهٔ انگلیسی داده میشود و باید جملهٔ درست را خروجی بدهی.
Input: There is many reasons to celebrate.
Output: There are many reasons to celebrate.
کاربر: یک جملهٔ انگلیسی داده میشود و باید جملهٔ درست را خروجی بدهی.
Input: She don’t like going to the park.
Output:
با افزودن demonstrationهای بیشتر، few-shot learning شکل میگیرد:
سیستم: تو دستیار مفیدی هستی و در اصلاح دستور زبان مهارت زیادی داری.
نمونه ۱:
Input: There is many reasons to celebrate.
Output: There are many reasons to celebrate.
نمونه ۲:
Input: Me and my friend goes to the gym every day.
Output: My friend and I go to the gym every day.
کاربر:
Input: She don’t like going to the park.
Output:
در few-shot learning، در اصل الگویی از نگاشت چند ورودی به خروجی متناظر به مدل داده میشود و LLM میکوشد هنگام پیشبینی آن الگو را دنبال کند؛ به شرط آنکه prompt تعداد کافی، هرچند معمولاً کم، demonstration داشته باشد. حتی patternهای سادهتر نیز میتوانند مؤثر باشند. برای مثال ترجمهٔ چند واژه از چینی به انگلیسی:
DEMO 现在 → now
来 → come
去 → go
男孩 → boy
USER 女孩 →
اگر LLM بهاندازهٔ کافی قدرتمند باشد، few-shot learning میتواند برای مسائل پیچیدهای مانند mathematical reasoning نیز به کار رود. مثال زیر ابتدا جمع دو عدد را محاسبه و سپس آن را بر حاصلضرب همان دو عدد تقسیم میکند:
12 5 → (12+5)/(12×5)=0.283
3 1 → (3+1)/(3×1)=1.33
−9 4 → (−9+4)/(−9×4)=0.138
15 15 → (15+15)/(15×15)=0.133
19 73 →
در بسیاری از کاربردهای عملی، اثربخشی in-context learning هم به کیفیت prompt و هم به توان بنیادی LLM پیشآموخته وابسته است. از یک سو prompt engineering قابل توجهی لازم است تا demonstrationها بهگونهای ارائه شوند که یادگیری بهتر انجام شود؛ از سوی دیگر LLM قویتر میتواند از in-context learning بهتر بهره بگیرد. فرض کنید میخواهیم واژههای زبان Inuktitut را به انگلیسی ترجمه کنیم. اگر LLM روی دادهٔ Inuktitut پیشآموزش ندیده باشد، فهم آن از این زبان ضعیف است و صرفنظر از شکل prompt، ترجمهٔ خوب دشوار خواهد بود. در چنین حالتی باید مدل را با دادهٔ بیشتر Inuktitut ادامهآموزش داد، نه اینکه صرفاً prompt بهتری پیدا کرد.
پرسش جالب این است که in-context learning چگونه در pre-training ظهور میکند و چرا در inference کار میکند. یک برداشت ساده آن است که LLM مقداری دانش حل مسئله به دست آورده است، اما برای مسئلهٔ جدید مسیرهای پیشبینی فراوانی وجود دارد که تشخیص آنها دشوار است. demonstration میتواند مدل را به سمت مسیر «درست» هدایت کند. پژوهشگران in-context learning را از دیدگاههای مختلف نیز تفسیر کردهاند؛ از جمله Bayesian inference [Xie et al., 2022]، gradient descent [Dai et al., 2023; Von Oswald et al., 2023]، linear regression [Akyürek et al., 2023] و meta learning [Garg et al., 2022].
۳.۱.۳ راهبردهای مهندسی پرامپت
طراحی prompt ماهیتی بسیار تجربی دارد. معمولاً برای انجام یک وظیفه با LLM راههای متعدد prompting وجود دارد و برای یافتن prompt رضایتبخش به چندین آزمون و خطا نیاز است. برای نوشتن promptهای بهتر با بهرهوری بیشتر میتوان از برخی راهبردهای عمومی استفاده کرد.
توصیف وظیفه تا حد امکان روشن و دقیق
وقتی LLM را برای حل مسئله به کار میگیریم، باید مسئله را دقیق، مشخص و روشن توصیف کنیم و مدل را مطابق انتظار هدایت کنیم. این موضوع بهویژه وقتی مهم است که خروجی باید معیارهای خاصی داشته باشد. فرض کنید دربارهٔ climate change کنجکاو هستیم. prompt ساده میتواند چنین باشد:
دربارهٔ تغییرات اقلیمی برایم بگو.
چون این دستور بسیار کلی است، LLM ممکن است دربارهٔ هر جنبهای از تغییرات اقلیمی پاسخ بدهد و پاسخ با علاقهٔ خاص ما همسو نباشد. میتوان prompt را دقیقتر کرد:
توضیحی دقیق دربارهٔ علتها و پیامدهای تغییرات اقلیمی ارائه کن؛
از جمله اثر آن بر دمای جهانی، الگوهای آبوهوا و سطح دریاها.
همچنین راهحلهای ممکن و اقداماتی را که برای کاهش این اثرات انجام میشود بررسی کن.
اگر بخواهیم همین موضوع را برای کودک ۱۰ ساله توضیح دهیم، prompt را باز هم تنظیم میکنیم:
علتها و اثرات تغییرات اقلیمی را برای یک کودک ۱۰ ساله توضیح بده.
دربارهٔ اثر آن بر آبوهوا، سطح دریا و دما صحبت کن و چند کاری را که مردم برای کمک انجام میدهند نام ببر.
از واژههای ساده استفاده کن و متن از ۵۰۰ کلمه بیشتر نشود.
هدایت LLM برای «فکر کردن»
LLMها قابلیتهای شگفتآوری در «فکر کردن» نشان دادهاند. برای نمونه، مدلهای پیشرفته در وظایف دشوار mathematical reasoning عملکرد قابل توجهی داشتهاند. در prompt engineering باید این توانایی با prompting مناسب فعال شود، بهویژه در مسائلی که reasoning زیادی میخواهند. در بسیاری از موارد، LLMی که به «فکر کردن» هدایت میشود نتیجهای کاملاً متفاوت از همان مدل در حالت اجرای مستقیم وظیفه تولید میکند. Kojima et al. [2022] نشان دادند افزودن عبارت «بیایید گامبهگام فکر کنیم» به پایان prompt میتواند عملکرد مدل را در چند وظیفهٔ reasoning بهبود دهد.
یکی از روشها این است که پیش از پاسخ نهایی، از LLM بخواهیم مراحل reasoning را تولید کند. برای مثال prompt سادهٔ حل مسئلهٔ ریاضی:
تو یک ریاضیدان هستی. یک مسئلهٔ ریاضی به تو داده میشود. لطفاً آن را حل کن.
چون حل مسئلهٔ ریاضی به فرایند reasoning دقیق نیاز دارد، اگر مدل مستقیماً سراغ پاسخ برود احتمال خطا بیشتر است. بنابراین میتوان مراحل مشخصی را الزام کرد:
تو یک ریاضیدان هستی و هنگام حل مسئله این مراحل را دنبال میکنی:
گام ۱: تفسیر مسئله — جزئیات مسئله را دقیق بفهم.
گام ۲: تدوین راهبرد — متناسب با نوع مسئله، مانند جبر، حسابان یا هندسه، بهترین راهبرد را انتخاب کن.
گام ۳: محاسبهٔ دقیق — محاسبات لازم را گامبهگام و مطابق اصول ریاضی انجام بده.
گام ۴: بازبینی راهحل — پیش از پاسخ نهایی، محاسبات را از نظر صحت بررسی و توضیح کوتاهی برای راهحل ارائه کن.
اکنون مسئلهٔ زیر را حل کن:
{∗problem∗}
راه دیگر برای هدایت «فکر کردن»، تعامل چندمرحلهای با LLM است. در گام نخست از مدل میخواهیم مسئله را مستقیم حل کند:
یک مسئلهٔ ریاضی به تو داده میشود. لطفاً آن را حل کن.
{∗problem∗}
پس از دریافت پاسخ اولیه، در گام دوم از مدل میخواهیم درستی آن را ارزیابی کند و در صورت لزوم راهحل بهتری بسازد:
یک مسئلهٔ ریاضی همراه با یک راهحل به تو داده میشود.
درستی راهحل را ارزیابی کن و اگر خطایی وجود دارد آن را مشخص کن؛ سپس راهحل خودت را به دست آور.
مسئله: {∗problem∗}
راهحل: {∗solution∗}
این promptها به زنجیرهٔ بزرگی از پژوهشها دربارهٔ reasoning در LLMها مربوطاند. پوشش کامل همهٔ روشها در اینجا ممکن نیست؛ بخش ۳.۲ بحث دقیقتری دربارهٔ بهبود prompting با reasoning بیشتر ارائه میکند.
ارائهٔ اطلاعات مرجع
همانطور که گفته شد، میتوان demonstration را در prompt قرار داد تا LLM از آنها درون context یاد بگیرد. با توجه به توان بالای LLM در فهم زبان، هر نوع متن مرتبطی را نیز میتوان به prompt افزود تا پیشبینی بر زمینهای غنیتر انجام شود. در کاربردهای زیادی اطلاعاتی مرتبط با query کاربر داریم و بهجای پیشبینی بدون محدودیت، میخواهیم خروجی به همان متن مرتبط محدود شود. یک نمونه RAG است: متن مرتبط با query از یک سامانهٔ Information Retrieval به دست میآید و LLM بر اساس آن پاسخ میسازد. نمونهٔ prompt:
تو کارشناسی هستی که به queryهای ورودی پاسخ میدهی.
اکنون query و اطلاعات context متناظر در اختیار توست.
پاسخ را بر اساس همین context و با بیان خودت تولید کن؛ متن context را صرفاً کپی نکن.
اطلاعات context: {∗IR-result∗}
Query: {∗query∗}
اگر اطلاعات context بسیار قابل اعتماد باشد، حتی میتوان مدل را محدود کرد که فقط از متن دادهشده استفاده کند:
تو کارشناسی هستی که از queryهای ورودی پاسخ تولید میکنی.
یک query و context متناظر به صورت جدول در اختیار توست که هر ردیف آن یک رکورد مفید است.
فقط با استفاده از همین context پاسخ را تولید کن و پاسخ را با بیان خودت بنویس.
اطلاعات context: {∗table∗}
Query: {∗query∗}
در مسائل دنیای واقعی معمولاً prior knowledge و اطلاعات جانبی دربارهٔ مسئله داریم که به پاسخ بهتر کمک میکنند. در نظر گرفتن چنین اطلاعاتی در prompting عموماً مفید است.
توجه به قالب پرامپت
عملکرد LLM عموماً نسبت به prompt بسیار حساس است و گاهی تغییر کوچکی در prompt تغییر بزرگی در خروجی ایجاد میکند. حتی تغییر ترتیب جملهها میتواند نتیجه را عوض کند. برای خوانایی و کاهش ابهام، قالببندی روشن مهم است. میتوان fieldهای مشخصی تعریف و اطلاعات مختلف را در هر field قرار داد. همچنین در LLMهایی که زبان طبیعی و code را میفهمند و تولید میکنند، میتوان از promptهای code-style استفاده کرد. مثال ترجمه با یک demonstration:
[English] = [I have an apple.]
[German] = [Ich habe einen Apfel.]
[English] = [I have an orange.]
[German] =
LLMها میتوانند متن را در قالبهای متنوع دریافت کنند. بنابراین میتوان از control character، XML tag و formatting مشخص برای نمایش دادهٔ پیچیده استفاده کرد. مفید است که شکل ورودی و خروجی صریحاً مشخص شود؛ مثلاً بخشهای متن را با quote جدا کنیم و در prompt توضیح دهیم که «متن ورودی میان double quoteها قرار گرفته است».
موارد بالا فقط چند راهبرد برای نوشتن prompt خوب بودند. روشهای بسیار بیشتری وجود دارد و بخش مهمی از مهارت با تمرین ساخته میشود. کتاب برای اطلاعات تکمیلی به مستندات آنلاین مرتبط، از جمله راهنمای prompt engineering مدلهای GPT، ارجاع میدهد؛ نشانی اینترنتی منبع در نسخهٔ اصلی کتاب ثبت شده است.