درس ۸ از ۱۲، بخش ۳: مهندسی پرامپت
مهندسی پرامپت (۲): زمان فکر کردن، توهم و توسعهی تکرارشونده
در این درس
اصل دوم: به مدل زمان فکر کردن بدهید#
LLM برای هر توکنی که تولید میکند، یک بار کل محاسبات شبکه را انجام میدهد. پس فکر کردن مدل به ازای تولید توکن است. اگر بخواهید جواب یک مسئلهی چندمرحلهای را در یک کلمه بدهد، فرصت محاسبه ندارد و حدس میزند. اگر اجازه بدهید روی «چرکنویس» قدمبهقدم کار کند، احتمال جواب درست خیلی بیشتر میشود.
مثال: فایل اکسلی از نمرههای دانشآموزان دارید و میپرسید «معدل دخترها بیشتر است یا پسرها؟». اگر فقط «آره یا نه» بخواهید، مدل خیالبافی میکند. اگر گامها را بدهید، خیلی بهتر جواب میدهد: «ستون جنسیت را روی دختر فیلتر کن و میانگین نمره را حساب کن؛ همین کار را برای پسرها بکن؛ یک آزمون آماری بگیر تا ببینی تفاوت معنادار است یا نه؛ بعد نتیجه را بگو.»
نوتبوکهای این درس
03_02-Guidelines-for-Prompting.ipynb (بخش دوم)، 03_03-Model-Limitations.ipynb و 03_04-iterative-prompt-development.ipynb
تاکتیک ۱: گامهای انجام کار را مشخص کنید#
prompt = """لطفاً برای پاسخ به درخواست زیر، قدم به قدم فکر کن و هر مرحله را بنویس. سپس پاسخ نهایی را ارائه بده.
درخواست:
یک ایمیل به تیم فنی بنویس که بابت دیرکرد تحویل پروژه عذرخواهی کنی، دلیل آن را افت فشار برق
در سرور اعلام کنی، و بگویی تحویل نهایی تا ۴۸ ساعت دیگر انجام میشود.
مراحل مورد انتظار برای پاسخ:
۱. مشخص کن موضوع ایمیل (Subject) چیست.
۲. بنویس در ابتدای ایمیل چگونه عذرخواهی میکنی.
۳. دلیل دیرکرد را توضیح بده بدون اینکه شبیه بهانهتراشی شود.
۴. تعهد بده که حداکثر تا ۴۸ ساعت آینده تحویل داده میشود.
۵. ایمیل را با لحن حرفهای و محترمانه تمام کن."""
مدل همین پنج مرحله را یکییکی طی میکند و در هر مرحله بخشی از ایمیل را مینویسد.
همین تاکتیک برای کارهای چندمرحلهای پردازش متن هم کاربرد دارد. اگر قالب خروجی را هم تعیین کنید، استخراج نتیجه با کد سادهتر میشود:
prompt = f"""
Your task is to perform the following actions:
1 - Summarize the following text delimited by <> with 1 sentence.
2 - Translate the summary into Persian.
3 - List each name in the Persian summary.
4 - Output a json object that contains the following keys: Persian_summary, num_names.
Use the following format:
Text: <text to summarize>
Summary: <summary>
Translation: <summary translation>
Names: <list of names in Persian summary>
Output JSON: <json with summary and num_names>
Text: <{text}>
"""
تاکتیک ۲: قبل از قضاوت، خودش حل کند#
این مثال خطای مدل را خیلی خوب نشان میدهد. یک مسئله و راهحل یک دانشآموز را میدهیم و میپرسیم درست است یا نه:
Determine if the student's solution is correct or not. Do not discuss.
Question: I'm building a solar power installation …
- Land costs $100 / square foot
- I can buy solar panels for $250 / square foot
- Maintenance: a flat $100k per year, and an additional $10 / square foot
What is the total cost for the first year of operations as a function of the number of square feet.
Student's Solution:
1. Land cost: 100x
2. Solar panel cost: 250x
3. Maintenance cost: 100,000 + 100x
Total cost: 100x + 250x + 100,000 + 100x = 450x + 100,000
Gemma 3 4B جواب داد: Correct.
اما راهحل غلط است. هزینهی نگهداری به ازای هر فوت ۱۰ دلار است، نه ۱۰۰ دلار، و جواب درست 360x + 100,000 است. مدل فقط به ظاهر منظم راهحل نگاه کرد و تأییدش کرد.
حالا به مدل میگوییم اول خودش مسئله را حل کند، بعد مقایسه کند، و تا خودش حل نکرده قضاوت نکند:
Your task is to determine if the student's solution is correct or not.
To solve the problem do the following:
- First, work out your own solution to the problem.
- Then compare your solution to the student's solution and evaluate if the student's solution is correct or not.
Don't decide if the student's solution is correct until you have done the problem yourself.
Use the following format:
Question: ```question here```
Student's solution: ```student's solution here```
Actual solution: ```steps to work out the solution and your solution here```
Is the student's solution the same as actual solution just calculated: ```yes or no```
Student grade: ```correct or incorrect```
Actual solution:
Maintenance cost = flat fee of $100,000 + ($10 per square foot * x square feet) = 100,000 + 10x
Total cost = (100 + 250 + 10)x + 100,000
Total cost = 360x + 100,000
Is the student's solution the same as actual solution just calculated: no
Student grade: incorrect
همان مدل، با همان دما، فقط با پرامپت متفاوت، به جواب درست رسید.
محدودیت مدل: توهم#
توهم (hallucination) یعنی مدل چیزی را با اطمینان میگوید که درست نیست. دلیلش همان است که در درس ۲ دیدیم: مدل محتملترین ادامه را تولید میکند، نه درستترین را. توهم معمولاً دو منشأ دارد:
- محاسبهی کافی انجام نشده: مسئله را با عجله و در چند توکن جواب داده است. راهحل، اصل دوم است؛ یعنی گامها یا زمان فکر کردن بدهید.
- اطلاعات اصلاً وجود ندارد: سؤال دربارهی چیزی است که مدل هیچوقت ندیده، یا اصلاً وجود ندارد. راهحل، تاکتیک بررسی شرط است.
نمونههایی از Llama 3.1 8B:
| پرامپت | جواب مدل |
|---|---|
| یک جمله که قبلاً علی شریعتی دقیقاً گفته پیرامون سرمایهگذاری در بورس طلا در شرایط جنگی را بازگو کن | «در شرایط جنگ، سرمایهگذاری در بورس طلا میتواند یک گزینه پرهوادار …» (جملهای ساختگی) |
| در مورد مسواکهای برقی شرکت سایپا بهم اطلاعات بده | «مسواکهای برقی سایپا از کیفیت بالایی برخوردار هستند و دارای ویژگیهایی مانند ضدعفونیکننده … در بازار ایران بسیار محبوب هستند.» |
| در مورد تلفن همراههای ساخت شرکت ایران خودرو اطلاعاتی بده | «ایران خودرو در سال ۱۳۹۹ با همکاری … Apple و Hisense اقدام به تولید تلفنهای هوشمند کرد … در سه مدل مختلف عرضه شدند» |
هیچکدام از این محصولات وجود ندارند. حالا همان سؤال آخر را با یک جملهی اضافه بپرسیم:
به سوال تا حد امکان صادقانه پاسخ بده و اگر از پاسخ مطمئن نیستید، بگو:
"ببخشید، نمی دانم."
سوال:
در مورد تلفن همراههای ساخت شرکت ایران خودرو بهم اطلاعاتی بده.
پاسخ:
ببخشید، نمی دانم.
و همین پرامپت برای «موبایلهای شرکت سامسونگ» جواب درست و مفصل میدهد. پس این جمله جلوی جوابهای درست را نمیگیرد.
توهم کم میشود، حذف نمیشود
این تکنیکها توهم را کاهش میدهند، نه اینکه از بین ببرند. یک مدل ضعیف ممکن است با بهترین پرامپت هم خطا کند. برای همین زیر خیلی از سرویسهای تجاری نوشتهاند جوابها را بررسی کنید. در برنامهی واقعی، خروجیهای حساس را با یک لایهی بررسی، منبع یا داوری انسانی کنترل کنید.
توسعهی تکرارشوندهی پرامپت#
پرامپت خوب معمولاً بار اول نوشته نمیشود. روند کار مثل هر کار مهندسی دیگری است:
ایده ─◄ نوشتن پرامپت ─◄ اجرا ─◄ تحلیل خطا ─◄ اصلاح پرامپت ─◄ اجرای دوباره
مثال واقعی: تیم بازاریابی یک فروشگاه اینترنتی میخواهد از روی برگهی مشخصات فنی دستگاه تصفیهی هوای شیائومی، توضیح محصول بنویسد. برگه شامل حجم هوای خروجی، مساحت تحت پوشش، عمر فیلتر، وزن و نوع فیلترهاست.
نسخهی ۱:
Your task is to help a marketing team create a description for a retail website of a product
based on a technical fact sheet.
Write a product description in Persian based on the information provided in the technical
specifications delimited by triple backticks.
مشکل ۱: متن خیلی طولانی است. طول را محدود کنید: تعداد کلمه، جمله یا کاراکتر.
Use at most 50 words.
No further discuss.
خروجی دقیقاً ۵۰ کلمه شد:
پاککننده هوای هوشمند شیائومی 4 پرو: با طراحی زیبا و مدرن، این دستگاه با فیلترهای پیشرفته، هوای اتاق شما را در کمترین زمان تصفیه میکند. …
مدلها در شمردن کلمه و کاراکتر دقیق نیستند، چون با توکن کار میکنند. پس محدودیت طول را تقریبی در نظر بگیرید.
مشکل ۲: روی جزئیات اشتباه تمرکز کرده است. معلوم شد مخاطب این متن فروشندگان عمدهاند، نه مصرفکننده. پس مشخصات فنی برایشان مهمتر از «طراحی زیبا» است:
The description is intended for air purifier retailers, so should be technical in nature
and focus on the technical aspects of the product.
تصفیه هوا هوشمند شیائومی 4 پرو با فیلترهای هپا و کربن فعال، حجم هوای 500 متر مکعب در ساعت را تصفیه میکند. فیلتر با عمر 6-12 ماه و سنسورهای دوگانه، کنترل از طریق اپلیکیشن Mi Home … صدای 33.7 دسی بل.
میشود همین روند را ادامه داد: مثلاً خواست که در پایان شناسهی محصول بیاید، یا ابعاد در قالب یک جدول HTML آورده شود.
پرامپت را روی یک نمونه بهینه نکنید
در کار واقعی، پرامپت را روی مجموعهای از نمونهها امتحان کنید، نه فقط روی یک برگهی مشخصات. پرامپتی که برای یک محصول عالی است، ممکن است برای ده محصول دیگر خراب باشد. این همان «ارزیابی» در چرخهی عمر پروژه است.
خلاصه#
- اصل دوم: فکر کردن مدل به ازای تولید توکن است، پس فرصت فکر کردن بدهید. گامها را تعیین کنید و بخواهید پیش از قضاوت خودش مسئله را حل کند.
- توهم از محاسبهی ناکافی یا نبود اطلاعات میآید. با گامبندی و با «اگر نمیدانی بگو نمیدانم» کمش کنید، اما همیشه احتمالش را در نظر بگیرید.
- پرامپتنویسی تکرارشونده است: اجرا، تحلیل خطا و اصلاح، آن هم روی مجموعهای از نمونهها.