بعد از اینکه یک Prompt Template ساده برای RAG ساختید، میتوانید تکنیکهای پیشرفتهتر Prompt Engineering را برای بهبود کیفیت پاسخها آزمایش کنید.
اما نکته مهم:
هر تکنیک پیشرفتهای همیشه بهتر نیست. باید با آزمایش مشخص شود که واقعاً کیفیت سیستم را افزایش میدهد یا فقط هزینه و پیچیدگی را زیاد میکند.
1. In-Context Learning (یادگیری درون Prompt)
مفهوم
در این روش، شما به LLM مثالهایی از:
- ورودی
- خروجی مطلوب
میدهید تا مدل یاد بگیرد چه نوع پاسخی تولید کند.
مثال:
فرض کنید یک Chatbot پشتیبانی مشتری دارید.
به جای اینکه فقط بگویید:
Answer customer questions politely
مثال اضافه میکنید:
Customer:
I cannot login
Assistant:
Please reset your password using the forgot password option.
---
Customer:
My payment failed
Assistant:
Please check your card information...
حالا مدل ساختار پاسخ را بهتر متوجه میشود.
چرا In-Context Learning کار میکند؟
چون شما اطلاعات بیشتری به Prompt اضافه میکنید.
مشابه RAG:
در RAG:
Retrieve documents
↓
Inject context
↓
Generate answer
در In-context Learning:
Retrieve examples
↓
Inject examples
↓
Generate answer
انواع In-Context Learning
1. One-shot Learning
فقط یک مثال داده میشود.
مثلاً:
Example:
Question:
How to reset password?
Answer:
Use password recovery page.
2. Few-shot Learning
چندین مثال داده میشود.
مثلاً:
Example 1
Example 2
Example 3
Few-shot معمولاً بهتر است چون مدل الگوی بیشتری میبیند.
استفاده از RAG برای In-Context Learning
به جای اینکه مثالها را ثابت داخل Prompt قرار دهید:
میتوانید آنها را در Vector Database ذخیره کنید.
ساختار:
Previous successful conversations
↓
Vector Database
↓
Retrieve similar examples
↓
Inject into Prompt
↓
LLM
مثلاً:
کاربر:
My account was blocked
Retriever:
پیدا میکند:
Previous conversation:
User:
My account was blocked
Assistant:
I will help unlock your account...
و این را به Prompt اضافه میکند.
2. Chain-of-Thought Prompting (CoT)
یکی از معروفترین تکنیکهای Prompt Engineering است.
ایده:
به مدل اجازه بدهید قبل از پاسخ نهایی مرحلهبهمرحله فکر کند.
Prompt معمولی:
Solve this problem.
Chain of Thought:
Think step by step before answering.
مثال:
سؤال:
If a train travels 60 km/h for 3 hours,
how far does it go?
مدل ابتدا:
Distance = speed × time
60 × 3 = 180 km
بعد پاسخ:
180 kilometers
Scratchpad
یک روش مشابه:
به مدل یک فضای فکر کردن میدهید.
مثلاً:
<thinking>
Reason here
</thinking>
<answer>
Final response
</answer>
مزایای Chain-of-Thought
کمک میکند در:
- ریاضی
- برنامهنویسی
- برنامهریزی
- مسائل چندمرحلهای
همچنین Debug کردن راحتتر میشود چون مسیر تصمیمگیری مشخصتر است.
3. Reasoning Models
امروزه بعضی مدلها ذاتاً برای Reasoning ساخته شدهاند.
مثل مدلهایی که قبل از پاسخ:
- برنامهریزی میکنند
- گزینهها را بررسی میکنند
- مراحل داخلی ایجاد میکنند
ساختار:
User Question
↓
Reasoning Tokens
↓
Final Answer Tokens
مزایا
عملکرد بهتر در:
- Coding
- Mathematics
- Planning
- Complex workflows
معایب
چون Token بیشتری تولید میکنند:
- کندتر هستند
- هزینه بیشتری دارند
Reasoning Model در RAG
برای RAG میتواند بسیار مفید باشد.
مثلاً:
Retriever پیدا کرده:
Document A
Document B
Document C
مدل Reasoning بهتر میتواند تشخیص دهد:
کدام سند واقعاً مرتبط است.
کاربردها:
- پزشکی
- حقوقی
- تحلیل اسناد
- تحقیقات علمی
تفاوت Prompt برای Reasoning Models
نکته مهم:
روشهای قدیمی همیشه روی مدلهای Reasoning جواب نمیدهد.
مثلاً:
این دستور:
Think step by step
ممکن است لازم نباشد.
چون مدل قبلاً برای این کار آموزش دیده است.
بهتر است:
هدف واضح بدهید
مثلاً:
Analyze these documents and provide the most accurate conclusion.
فرمت خروجی را مشخص کنید
مثلاً:
Return:
1. Summary
2. Evidence
3. Recommendation
4. Context Window Management
هر چیزی که به LLM میدهید، Context را مصرف میکند.
شامل:
System Prompt
+
Conversation History
+
Retrieved Documents
+
Examples
+
Generated Answer
اگر Context پر شود:
- هزینه زیاد میشود
- سرعت کم میشود
- کیفیت کاهش پیدا میکند
مشکل Multi-turn Conversation
در چت طولانی:
هر پیام قبلی دوباره ارسال میشود.
مثلاً:
User message 1
Assistant answer 1
User message 2
Assistant answer 2
...
User message 50
خیلی سریع بزرگ میشود.
Context Pruning
راهحلهایی برای کوچک کردن Context.
روش 1: نگه داشتن آخرین پیامها
مثلاً فقط:
Last 5 user messages
+
Last 5 assistant answers
مزیت:
ساده و سریع.
روش 2: خلاصهسازی مکالمه
یک LLM دیگر پیامهای قدیمی را خلاصه میکند.
مثلاً:
قبل:
100 پیام
بعد:
Summary:
User wants a RAG chatbot for medical documents.
در Reasoning Model
نباید Reasoning Tokenها را در History نگه داشت.
بهتر:
نگه داشتن:
Final Answer
نه:
Internal reasoning
در RAG
معمولاً نباید تمام Documentهای قبلی را نگه دارید.
بهتر:
فقط:
Documents retrieved for current question
5. افزایش Context Window همیشه راهحل نیست
ممکن است بگویید:
"مدل بزرگتر با Context بیشتر میگیرم."
اما:
Context بزرگ:
- هزینه بیشتر
- سرعت کمتر
دارد.
بنابراین باید Prompt را بهینه کرد.
چه زمانی از تکنیکهای پیشرفته استفاده کنیم؟
اشتباه رایج:
از ابتدا همه چیز اضافه کنیم:
+ Chain of Thought
+ Few Shot
+ Huge Context
+ Reasoning Model
+ Long History
نتیجه:
- هزینه بالا
- پیچیدگی بالا
- سرعت پایین
روش بهتر:
مرحلهای پیش بروید:
مرحله 1
شروع ساده:
System Prompt
+
Retrieved Context
+
Question
مرحله 2
اگر مشکل داشت:
اضافه کنید:
Query rewriting
Reranking
Better chunks
مرحله 3
اگر هنوز مشکل داشت:
اضافه کنید:
Few-shot examples
Reasoning models
Advanced prompting
جمعبندی نهایی
تکنیکهای پیشرفته Prompt Engineering:
| تکنیک | کاربرد |
|---|---|
| In-context Learning | یاد دادن سبک پاسخ با مثال |
| Few-shot Learning | چند مثال داخل Prompt |
| One-shot Learning | یک مثال داخل Prompt |
| Chain-of-Thought | حل مسائل چندمرحلهای |
| Scratchpad | فضای فکر کردن |
| Reasoning Models | استدلال داخلی بهتر |
| Context Pruning | کاهش حجم مکالمه |
| Summarization | مدیریت History |
در یک سیستم RAG حرفهای معمولاً ترتیب بهینه این است:
Good Retrieval
↓
Good Chunking
↓
Good System Prompt
↓
Prompt Template
↓
Query Rewriting
↓
Reranking
↓
Advanced Reasoning (if needed)
نکته کلیدی:
بهترین RAG معمولاً با پیچیدهترین Prompt ساخته نمیشود؛ با سادهترین طراحیای ساخته میشود که نیاز واقعی پروژه را برطرف کند.