بسیاری از توسعهدهندگان هنگام مواجهه با خطای مدلهای زبانی در مسائل چندمرحلهای، اولین راهحل را ارتقای مدل به گزینههای سنگینتر و گرانتر میدانند؛ در حالی که شکاف دقت میان یک پاسخ نادرست و پاسخی دقیق، اغلب نه در توانایی ذاتی مدل، بلکه در استراتژی استدلال نهفته است. تکنیکهایی مانند پرامپتنویسی با چند نمونه (Few-Shot)، زنجیرهی تفکر (Chain-of-Thought) و درخت تفکر (Tree-of-Thought) به مدل فرصت میدهند محاسبات میانی خود را گامبهگام برونریزی کند و دقت خروجی را تا دهها درصد افزایش دهد.
اگر برای دسترسی مستقیم به API سرویسهایی نظیر OpenAI یا Anthropic با چالشهای پرداخت ارزی روبهرو هستید، بهینهسازی فراخوانیها اهمیت مضاعفی پیدا میکند. بهرهگیری از گیتویهای داخلی سازگار با OpenAI یا اتصال به مدلهای سبکترِ محلی با ابزارهایی مانند Ollama نشان میدهد که به جای مصرف توکنهای اضافی روی مدلهای غولپیکر، میتوان با انتخاب الگوی استدلال مناسب روی مدلهای کوچکتر نیز به دقتهای بنچمارک صنعتی دست یافت.
در این درس یاد میگیرید که چگونه با کنار هم قرار دادن مخزن نمونهها، ساخت پرامپتهای استدلالی، رایگیری خودسازگاری (Self-Consistency) و انشعاب درخت تفکر، یک پایپلاین منعطف بسازید که بین هزینه، تاخیر و دقت تعادلی بهینه ایجاد کند.
گفتن اینکه مدل چه کاری انجام دهد پرامپتنویسی است؛ نشان دادن نحوهی فکر کردن به آن، مهندسی است. شکاف میان دقت 78% و 91% روی یک مدل، تسک و دادههای یکسان، به داشتن مدلی بهتر مربوط نمیشود؛ حاصل یک استراتژی استدلال بهتر است.
اهداف یادگیری
- پیادهسازی پرامپتنویسی با چند نمونه (Few-Shot Prompting) از طریق انتخاب و قالببندی نمونههایی که دقت تسک را به حداکثر میرسانند
- بهکارگیری استدلال زنجیرهی تفکر (Chain-of-Thought یا CoT) برای ارتقای دقت در مسائل چندمرحلهای مانند مسائل کلامی ریاضی
- ساخت پرامپت درخت تفکر (Tree-of-Thought یا ToT) که مسیرهای استدلال متعددی را کاوش کرده و بهترین مسیر را برمیگزیند
- سنجش میزان بهبود دقت در مقایسهی بدون نمونه (Zero-Shot) در برابر با چند نمونه (Few-Shot) و در برابر CoT روی یک بنچمارک استاندارد
صورت مسئله
فرض کنید در حال ساخت یک اپلیکیشن معلم خصوصی ریاضی هستید. پرامپت شما این است: «این مسئلهی کلامی را حل کن.» مدل GPT-5 روی بنچمارک استاندارد ریاضی مقطع ابتدایی یعنی GSM8K، در 94% مواقع پاسخ درست میدهد. شاید فکر کنید به سقف کارایی رسیدهاید؛ اما اینطور نیست—زنجیرهی تفکر هنوز میتواند 3 تا 4 درصد دقت را بالا ببرد.
کافی است این چند کلمه را اضافه کنید: «بیایید گامبهگام فکر کنیم»؛ دقت تا 91% بالا میپرد. چند نمونهی حلشده به آن بدهید تا به 95% برسد. همان مدل، همان دما (temperature) و همان هزینهی API؛ تنها تفاوت این است که یک چرکنویس دست مدل دادهاید.
این یک ترفند نیست، سازوکار واقعی استدلال است. انسانها مسائل چندمرحلهای را با یک جهش ذهنی حل نمیکنند؛ ترنسفورمرها (Transformers) هم همینطورند. وقتی مدل را وادار میکنید توکنهای میانی تولید کند، این توکنها به بخشی از زمینهی متن (context) برای توکن بعدی تبدیل میشوند. هر گام استدلال خوراک گام بعدی است و مدل رسماً با طی محاسبات گامبهگام به پاسخ میرسد.
اما گفتنِ «گامبهگام فکر کن» نقطهی شروع است، نه پایان. چه میشود اگر 5 مسیر استدلال را نمونهبرداری کنیم و رای اکثریت را بگیریم؟ چه میشود اگر بگذاریم مدل درختی از احتمالات را کاوش کند، شاخهها را ارزیابی کند و هرس نماید؟ چه میشود اگر استدلال را با استفاده از ابزارها ترکیب کنیم؟ اینها فرضیات تئوریک نیستند؛ تکنیکهایی با نتایج مستند و پیشرفتهای اندازهگیریشده هستند و در این درس همهی آنها را پیاده خواهید کرد.
مفاهیم پایه
مقایسهی Zero-Shot و Few-Shot: وقتی مثالها دستورالعملها را شکست میدهند
در پرامپتنویسی بدون نمونه (Zero-Shot)، تسک را بدون هیچ چیز اضافهای به مدل میسپارید. در پرامپتنویسی با چند نمونه (Few-Shot)، کار را با ارائهی مثال آغاز میکنید.
وی و همکاران (Wei et al., 2022) این موضوع را روی 8 بنچمارک سنجیدند. در تسکهای ساده مانند تحلیل حس (sentiment classification)، تفاوت عملکرد Zero-Shot و Few-Shot کمتر از 2% بود. اما در تسکهای پیچیده مانند محاسبات چندمرحلهای و استدلال نمادین، استفاده از چند نمونه دقت را بین 10 تا 25 درصد بالا برد.
دلیل شهودی آن ساده است: مثالها همان دستورالعملهای فشرده هستند. بهجای توصیف ساختار خروجی، آن را نشان میدهید؛ بهجای توضیح فرایند استدلال، آن را عملاً پیاده میکنید. مدل در تطبیق الگو (pattern matching) بر اساس مثالها بسیار مطمئنتر از تحلیل دستورالعملهای انتزاعی عمل میکند.
چه زمانی Few-Shot برنده است: تسکهای حساس به فرمت، دستهبندی، استخراج دادههای ساختاریافته، اصطلاحات تخصصی یک حوزهی خاص و هر تسکی که مدل باید با الگوی مشخصی هماهنگ شود.
چه زمانی Zero-Shot برنده است: پرسشهای فکتمحور ساده، تسکهای خلاقانه که ارائهی مثال ممکن است جلوی خلاقیت را بگیرد و تسکهایی که پیدا کردن مثال خوب در آنها سختتر از نوشتن یک دستورالعمل خوب است.
انتخاب نمونهها: نمونههای مشابه، تصادفیها را شکست میدهند
کیفیت نمونهها یکسان نیست. انتخاب نمونههایی که به ورودیِ هدف شباهت دارند، در تسکهای دستهبندی بین 5 تا 15 درصد خروجی بهتری نسبت به انتخاب تصادفی رقم میزند (Liu et al., 2022). سه اصل اساسی در این زمینه وجود دارد:
- شباهت معنایی (Semantic similarity): انتخاب نمونههایی که در فضای امبدینگ (embedding space)، کمترین فاصله را با ورودی دارند
- تنوع برچسبها (Label diversity): پوشش تمام دستهبندیهای خروجی در میان مثالها
- تطابق سطح دشواری (Difficulty matching): همسطح بودن پیچیدگی مثالها با مسئلهی هدف
تعداد بهینهی نمونهها برای اغلب تسکها 3 تا 5 مورد است. کمتر از 3 نمونه، سیگنال کافی برای استخراج الگو به مدل نمیدهد؛ بیشتر از 5 نمونه هم شما را به بازده نزولی میرساند و توکنهای پنجرهی زمینه (context window) را هدر میدهد. در تسکهای دستهبندی با برچسبهای متعدد، یک مثال برای هر برچسب در نظر بگیرید.
زنجیرهی تفکر: در اختیار گذاشتن چرکنویس برای مدلها
پرامپتنویسی زنجیرهی تفکر (CoT) توسط وی و همکاران (Wei et al., 2022) در Google Brain معرفی شد. ایده ساده است: بهجای اینکه فقط پاسخ نهایی را بخواهید، از مدل بخواهید ابتدا مراحل استدلال خود را نشان دهد.
چرا این سازوکار از نظر مکانیکی کار میکند؟ هر توکنی که یک ترنسفورمر تولید میکند، به زمینهی متنی برای تولید توکن بعدی تبدیل میشود. بدون CoT، مدل باید تمام بار استدلال را درون وضعیت پنهان (hidden state) یک گذر رو به جلو (forward pass) فشرده کند؛ اما با CoT، محاسبات میانی را در قالب توکنها برونریزی میکند. در عمل، هر توکنِ استدلال، عمق محاسباتی موثر مدل را افزایش میدهد.
نتایج بنچمارک GSM8K (مسائل ریاضی دبستان، 8.5K مسئله):
| مدل | Zero-Shot | Zero-Shot CoT | Few-Shot CoT |
|---|---|---|---|
| GPT-4o | 78% | 91% | 95% |
| GPT-5 | 94% | 97% | 98% |
| o4-mini (استدلالی) | 97% | — | — |
| Claude Opus 4.7 | 93% | 97% | 98% |
| Gemini 3 Pro | 92% | 96% | 98% |
| Llama 4 70B | 80% | 89% | 94% |
| DeepSeek-V3.1 | 89% | 94% | 96% |
نکتهای دربارهی مدلهای استدلالی. مدلهایی مانند سری o اوپنایآی (o3، o4-mini) و DeepSeek-R1 پیش از ارائهی پاسخ نهایی، زنجیرهی تفکر را بهصورت داخلی اجرا میکنند. افزودن عبارت «بیایید گامبهگام فکر کنیم» به یک مدل استدلالی کاری تکراری و گاهی نتیجهمعکوس است؛ چرا که آنها این فرایند را پیشاپیش طی کردهاند.
دو شیوهی اصلی برای CoT وجود دارد:
روش Zero-shot CoT: عبارت «بیایید گامبهگام فکر کنیم» را به انتهای پرامپت اضافه کنید؛ بدون نیاز به نمونه. کوجیما و همکاران (Kojima et al., 2022) نشان دادند همین یک جمله دقت مدل را در تسکهای محاسباتی، درک عمومی و استدلال نمادین بهبود میدهد.
روش Few-shot CoT: نمونههایی در اختیار مدل بگذارید که مراحل استدلال در آنها گنجانده شده باشد. این روش از Zero-shot CoT موثرتر است؛ زیرا مدل ساختار دقیق استدلالی را که از آن انتظار دارید میبیند.
چه زمانی CoT آسیب میزند: بازخوانی (recall) فکتهای ساده (مانند «پایتخت فرانسه کجاست؟»)، دستهبندیهای تکمرحلهای و تسکهایی که در آنها سرعت مهمتر از دقت است. CoT بین 50 تا 200 توکن بار پردازشی استدلال به هر کوئری تحمیل میکند؛ برای تسکهای ساده با نرخ پردازش (throughput) بالا، این یعنی هدررفت هزینه.
خودسازگاری: نمونهبرداری چندگانه، یک رایگیری نهایی
وانگ و همکاران (Wang et al., 2023) تکنیک خودسازگاری (Self-Consistency) را معرفی کردند. نکتهی کلیدی این است: یک مسیر CoT منفرد ممکن است حاوی خطای استدلال باشد؛ اما اگر N مسیر استدلال مستقل (با دمای بیشتر از 0) تولید کنید و روی پاسخ نهایی رای اکثریت بگیرید، خطاها یکدیگر را خنثی میکنند.
خودسازگاری در آزمایشهای اولیه روی PaLM 540B دقت GSM8K را از 56.5% (با یک مسیر CoT) به 74.4% با تعداد N=40 رساند. روی GPT-5 بهبود آن کم است (از 97% به 98%)؛ زیرا دقت پایهی مدل پیشاپیش اشباع شده است. این تکنیک روی مدلهایی با دقت پایهی CoT بین 60 تا 85 درصد میدرخشد؛ یعنی نقطهی بهینهای که در آن خطاهای تکمسیره مکرر رخ میدهند ولی سیستماتیک نیستند. در مدلهای استدلالی (سری o و R1)، خودسازگاری عملاً در نمونهبرداری داخلیِ خود مدل ادغام شده است.
بدهبستان ماجرا: تولید N نمونه یعنی N برابر شدن هزینهی API و تاخیر (latency). در عمل، N=5 بیشتر مزایای این روش را به دست میدهد. N=3 حداقل مقداری است که یک رایگیری معنادار میسازد و برای اکثر تسکها، N بالاتر از 10 با بازده نزولی مواجه میشود.
درخت تفکر: کاوش شاخهای
یائو و همکاران (Yao et al., 2023) ساختار درخت تفکر (Tree-of-Thought یا ToT) را معرفی کردند. برخلاف CoT که یک مسیر استدلال خطی را پیش میگیرد، ToT چندین branch را کاوش کرده و پیش از ادامهی مسیر، امیدوارکنندهترین گزینهها را ارزیابی میکند.
ساختار ToT از سه جزء تشکیل شده است:
- تولید فکر (Thought generation): تولید چندین گام بعدیِ کاندید
- ارزیابی وضعیت (State evaluation): امتیازدهی به هر کاندید (میتوان خود LLM را بهعنوان ارزیاب به کار گرفت)
- الگوریتم جستوجو (Search algorithm): پیمایش درخت با BFS یا DFS و هرس کردن (pruning) شاخههای کمامتیاز
در تسک Game of 24 (ترکیب 4 عدد با استفاده از چهار عمل اصلی برای رسیدن به عدد 24)، مدل GPT-4 با پرامپت استاندارد تنها 7.3% از مسائل را حل میکند. با روش CoT این عدد به 4.0% کاهش مییابد (در اینجا CoT اثر معکوس دارد، چون فضای جستوجو وسیع است)؛ اما با استفاده از ToT، دقت به 74% میرسد.
روش ToT گران تمام میشود. هر گره در درخت به یک فراخوانی LLM نیاز دارد. یک درخت با ضریب انشعاب (branching factor) 3 و عمق 3، ممکن است تا 39 فراخوانی LLM نیاز داشته باشد. این روش را فقط برای مسائلی استفاده کنید که فضای جستوجوی بزرگ اما قابل ارزیابی دارند؛ مثل برنامهریزی، حل معما و حل خلاقانهی مسائل مقید.
معماری ReAct: تفکر در کنار عمل
یائو و همکاران (Yao et al., 2022) ردپای استدلال را با اقدامات عملی ترکیب کردند. در این روش، مدل بهصورت چرخشی فکر میکند (تولید استدلال) و عمل میکند (فراخوانی ابزارها، جستوجو و محاسبات).
معماری ReAct در تسکهای مبتنی بر دانش از CoT خالص بهتر عمل میکند، زیرا میتواند استدلال خود را بر دادههای واقعی استوار سازد. در بنچمارک HotpotQA (پاسخ به سوالات چندمرحلهای با چند گام لغزش یا hop)، روش ReAct با GPT-4 به تطابق کامل (exact match) 35.1% رسید، در حالی که CoT خالص 29.4% بود. قدرت واقعی این رویکرد در آن است که خطاهای استدلال به کمک مشاهدات (observations) تصحیح میشوند و مدل میتواند برنامهی خود را حین اجرا بازبینی کند.
الگوی ReAct شالودهی ایجنتهای (agents) هوش مصنوعی امروزی است. همهی فریمورکهای ایجنت (مانند LangChain، CrewAI و AutoGen) نسخهای از چرخهی «تفکر-اقدام-مشاهده» (Thought-Action-Observation) را پیاده میکنند. شما در فاز 14 ایجنتهای کامل را خواهید ساخت؛ در این درس تمرکز روی الگوی پرامپتنویسی آن است.
پرامپتنویسی ساختاریافته: تگهای XML، جداکنندهها و سرتیترها
هرچه پرامپتها پیچیدهتر میشوند، وجود ساختار مانع از گیج شدن مدل در تفکیک بخشها میشود. سه رویکرد اصلی عبارتند از:
تگهای XML (بهترین نتیجه روی Claude، در بقیهی مدلها هم عالی):
<context>
You are reviewing a pull request.
The codebase uses TypeScript and React.
</context>
<task>
Review the following diff for bugs, security issues, and style violations.
</task>
<diff>
{diff_content}
</diff>
<output_format>
List each issue with: file, line, severity (critical/warning/info), description.
</output_format>
سرتیترهای Markdown (جهانشمول):
## Role
Senior security engineer at a fintech company.
## Task
Analyze this API endpoint for vulnerabilities.
## Input
{api_code}
## Rules
- Focus on OWASP Top 10
- Rate each finding: critical, high, medium, low
- Include remediation steps
جداکنندهها (Delimiters) (مینیمال اما کارآمد):
---INPUT---
{user_text}
---END INPUT---
---INSTRUCTIONS---
Summarize the above in 3 bullet points.
---END INSTRUCTIONS---
زنجیرهسازی پرامپت: تجزیهی ترتیبی تسکها
برخی تسکها پیچیدهتر از توان پردازش یک پرامپت منفرد هستند. زنجیرهسازی پرامپت (Prompt Chaining) این تسکها را به چند مرحله خرد میکند؛ بهگونهای که خروجی یک پرامپت، ورودی پرامپت بعدی میشود.
زنجیرهسازی به سه دلیل از پرامپت تکمرحلهای عملکرد بهتری دارد:
- سادهتر شدن هر گام: مدل بهجای اینکه همزمان حواسش به همهچیز باشد، روی یک تسک متمرکز کار میکند
- امکان بازبینی خروجیهای میانی: میتوانید خروجیها را بین مراحل بررسی و تصحیح کنید
- امکان بهرهگیری از مدلهای مختلف در مراحل مختلف: استفاده از مدلی سبک و ارزان برای استخراج داده، و مدلی گرانقیمت برای استدلال
مقایسهی کارایی رویکردها
| تکنیک | مناسبترین برای | دقت روی GSM8K (مدل GPT-5) | تعداد فراخوانی API | سربار توکن | پیچیدگی |
|---|---|---|---|---|---|
| Zero-Shot | تسکهای ساده | 94% | 1 | ندارد | بسیار ناچیز |
| Few-Shot | تطبیق فرمت خروجی | 96% | 1 | 200 تا 500 توکن | پایین |
| Zero-Shot CoT | ارتقای سریع استدلال | 97% | 1 | 50 تا 200 توکن | بسیار ناچیز |
| Few-Shot CoT | حداکثر دقت در یک فراخوانی | 98% | 1 | 300 تا 600 توکن | پایین |
| Self-Consistency (N=5) | استدلالهای حساس و پرخطر | 98.5% | 5 | 5 برابر توکن بیشتر | متوسط |
| مدلهای استدلالی (o4-mini) | جایگزین آماده برای CoT | 97% | 1 | پنهان (2 تا 10 برابر مصرف داخلی) | بسیار ناچیز |
| Tree-of-Thought | مسائل جستوجو و برنامهریزی | ارزیابینشده (74% روی Game of 24) | 10 تا بیش از 40 | 10 تا بیش از 40 برابر توکن | بالا |
| ReAct | استدلال متکی بر دانش خارجی | ارزیابینشده (35.1% روی HotpotQA) | 3 تا بیش از 10 | متغیر | بالا |
| زنجیرهسازی پرامپت | تسکهای پیچیدهی چندمرحلهای | 96% (در قالب پایپلاین) | 2 تا 5 | 2 تا 5 برابر توکن | متوسط |
تکنیک مناسب به سه عامل بستگی دارد: دقت مورد نیاز، سقف تاخیر (latency budget) و میزان هزینهی قابل تحمل. برای اکثر سیستمهای پروداکشن، رویکرد Few-Shot CoT به همراه یک فالبک خودسازگاری با 3 نمونه، پاسخگوی 90% سناریوها است.
پیادهسازی گامبهگام
ما یک سیستم حل مسائل ریاضی میسازیم که ترکیبی از پرامپتنویسی Few-Shot، استدلال زنجیرهی تفکر و رایگیری خودسازگاری را در یک پایپلاین (pipeline) یکپارچه پیاده میکند. سپس قابلیت درخت تفکر را برای مسائل دشوارتر اضافه خواهیم کرد.
پیادهسازی کامل در فایل code/advanced_prompting.py در دسترس است. بخشهای کلیدی آن را در ادامه میبینید.
گام 1: مخزن نمونههای Few-Shot
نخستین مولفه، نمونههای Few-Shot را نگهداری کرده و مرتبطترین آنها را برای یک مسئلهی خاص انتخاب میکند.
GSM8K_EXAMPLES = [
{
"question": "Janet's ducks lay 16 eggs per day. She eats three for breakfast every morning and bakes muffins for her friends every day with four. She sells every egg at the farmers' market for $2. How much does she make every day at the farmers' market?",
"reasoning": "Janet's ducks lay 16 eggs per day. She eats 3 and bakes 4, using 3 + 4 = 7 eggs. So she has 16 - 7 = 9 eggs left. She sells each for $2, so she makes 9 * 2 = $18 per day.",
"answer": "18"
},
...
]
هر نمونه سه بخش دارد: صورت سوال، زنجیرهی استدلال و پاسخ نهایی. این زنجیرهی استدلال است که یک نمونهی معمولیِ Few-Shot را به یک نمونهی Few-Shot مبتنی بر CoT تبدیل میکند.
گام 2: سازندهی پرامپت زنجیرهی تفکر
این مولفه، پیام سیستم (system message)، نمونههای Few-Shot به همراه زنجیرههای استدلال و پرسش هدف را در قالب یک پرامپت واحد کنار هم میچیند.
def build_cot_prompt(question, examples, num_examples=3):
system = (
"You are a math problem solver. "
"For each problem, show your step-by-step reasoning, "
"then give the final numerical answer on the last line "
"in the format: 'The answer is [number]'."
)
example_text = ""
for ex in examples[:num_examples]:
example_text += f"Q: {ex['question']}\n"
example_text += f"A: {ex['reasoning']} The answer is {ex['answer']}.\n\n"
user = f"{example_text}Q: {question}\nA:"
return system, user
قید مربوط به ساختار پاسخ («The answer is [number]») نقشی حیاتی دارد. بدون آن، مکانیزم خودسازگاری نمیتواند پاسخها را از نمونههای مختلف استخراج و مقایسه کند.
گام 3: رایگیری خودسازگاری
نمونهبرداری از N مسیر استدلال مختلف و برگزیدن گزینهای که اکثریت آرا را دارد.
def self_consistency_solve(question, examples, client, model, n_samples=5):
system, user = build_cot_prompt(question, examples)
answers = []
reasonings = []
for _ in range(n_samples):
response = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": system},
{"role": "user", "content": user}
],
temperature=0.7
)
text = response.choices[0].message.content
reasonings.append(text)
answer = extract_answer(text)
if answer is not None:
answers.append(answer)
vote_counts = Counter(answers)
best_answer = vote_counts.most_common(1)[0][0] if vote_counts else None
confidence = vote_counts[best_answer] / len(answers) if best_answer else 0
return best_answer, confidence, reasonings, vote_counts
تنظیم دمای 0.7 در اینجا کلیدی است. در دمای 0.0، همهی N پاسخ تولیدشده یکسان خواهند بود و فلسفهی این کار زیر سوال میرود. شما به تصادفیسازی کافی برای ایجاد مسیرهای استدلال متنوع نیاز دارید، اما نه آنقدر زیاد که مدل خروجیهای نامربوط بسازد.
گام 4: حلکننده مبتنی بر درخت تفکر
در مسائلی که استدلال خطی در آنها شکست میخورد، روش ToT رویکردهای گوناگون را بررسی کرده و جهتی را که بیشترین امید موفقیت را دارد ارزیابی میکند.
def tree_of_thought_solve(question, client, model, breadth=3, depth=3):
thoughts = generate_initial_thoughts(question, client, model, breadth)
scored = [(t, evaluate_thought(t, question, client, model)) for t in thoughts]
scored.sort(key=lambda x: x[1], reverse=True)
for current_depth in range(1, depth):
next_thoughts = []
for thought, score in scored[:2]:
extensions = extend_thought(thought, question, client, model, breadth)
for ext in extensions:
ext_score = evaluate_thought(ext, question, client, model)
next_thoughts.append((ext, ext_score))
scored = sorted(next_thoughts, key=lambda x: x[1], reverse=True)
best_thought = scored[0][0] if scored else ""
return extract_answer(best_thought), best_thought
بخش ارزیاب، خودش یک فراخوانی LLM است. از مدل میپرسید: «در مقیاس 0.0 تا 1.0، این مسیر استدلال چقدر برای حل مسئله امیدوارکننده است؟» این همان بینش کلیدی ToT است: خود مدل راهحلهای ناقص خود را میسنجد.
گام 5: پایپلاین جامع
این پایپلاین تمام تکنیکها را با یک استراتژی تشدید گامبهگام (escalation) ادغام میکند.
def solve_with_escalation(question, examples, client, model):
single_answer, _ = few_shot_cot_solve(question, examples, client, model)
sc_answer, confidence, _, _ = self_consistency_solve(
question, examples, client, model, n_samples=5
)
if confidence >= 0.8 and single_answer == sc_answer:
return sc_answer, "self_consistency", confidence
tot_answer, _ = tree_of_thought_solve(question, client, model)
return tot_answer, "tree_of_thought", None
منطق تشدید به این شکل است: ابتدا از روش ارزانتر (یک اجرای تکمرحلهای CoT) استفاده کنید. یک مسیر تعیینگرایانه (deterministic) سهمی در رایگیری به شما نمیدهد، بنابراین آزمون سنجش کیفیت آن، همرایی است؛ یعنی پاسخِ به دست آمده در دمای 0 باید با پاسخ اکثریت مسیرهای نمونهبرداریشده مطابقت داشته باشد. اگر چنین نشد، یا اگر اطمینان حاصل از خودسازگاری کمتر از 0.8 بود (کمتر از 4 نمونه از 5 نمونه همنظر بودند)، کار به ToT ارجاع داده میشود. این رویکرد تعادلی منطقی بین هزینه و دقت برقرار میکند؛ بیشتر مسائل ارزان حل میشوند و مسائل دشوار منابع پردازشی بیشتری دریافت میکنند.
نحوهی استفاده
پرامپتهای Few-Shot مبتنی بر قالب
کتابخانهی LangChain پشتیبانی توکاری برای قالبهای پرامپت (prompt templates) و پارسرهای خروجی فراهم کرده که پیادهسازی الگوهای Few-Shot و CoT را بسیار ساده میکند:
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate
from langchain_openai import ChatOpenAI
example_prompt = PromptTemplate(
input_variables=["question", "reasoning", "answer"],
template="Q: {question}\nA: {reasoning} The answer is {answer}."
)
few_shot_prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
suffix="Q: {input}\nA: Let's think step by step.",
input_variables=["input"]
)
llm = ChatOpenAI(model="gpt-4o", temperature=0.7)
chain = few_shot_prompt | llm
result = chain.invoke({"input": "If a train travels 120 km in 2 hours..."})
همچنین LangChain کلاسهایی با عنوان ExampleSelector برای انتخاب نمونهها بر اساس شباهت معنایی در اختیارتان میگذارد:
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_openai import OpenAIEmbeddings
selector = SemanticSimilarityExampleSelector.from_examples(
examples,
OpenAIEmbeddings(),
k=3
)
پرامپتهای کامپایلشده
فریمورک DSPy به استراتژیهای پرامپتنویسی مثل ماژولهای بهینهپذیر نگاه میکند. بهجای طراحی دستی پرامپتهای CoT، کافی است یک امضا (signature) تعریف کنید تا DSPy خودش پرامپت را بهینهسازی (optimization) کند:
import dspy
dspy.configure(lm=dspy.LM("openai/gpt-4o", temperature=0.7))
class MathSolver(dspy.Module):
def __init__(self):
self.solve = dspy.ChainOfThought("question -> answer")
def forward(self, question):
return self.solve(question=question)
solver = MathSolver()
result = solver(question="Janet's ducks lay 16 eggs per day...")
ماژول ChainOfThought در DSPy بهطور خودکار ردپای استدلال را اضافه میکند و dspy.majority سازوکار خودسازگاری را پیاده میسازد:
result = dspy.majority(
[solver(question=q) for _ in range(5)],
field="answer"
)
مقایسهی پیادهسازی از صفر با فریمورکها
| قابلیت | پیادهسازی از صفر (این درس) | LangChain | DSPy |
|---|---|---|---|
| کنترل روی فرمت پرامپت | کامل | مبتنی بر قالب | خودکار |
| خودسازگاری | رایگیری دستی | دستی | توکار (dspy.majority) |
| انتخاب نمونهها | منطق سفارشی | ExampleSelector |
dspy.BootstrapFewShot |
| درخت تفکر (ToT) | جستوجوی درختی سفارشی | زنجیرههای توسعهدادهشده توسط جامعه | فاقد ماژول توکار |
| بهینهسازی پرامپت | تکرار دستی | دستی | کامپایل خودکار |
| مناسب برای | یادگیری، پایپلاینهای سفارشی | ورکفلوهای استاندارد | پژوهش، بهینهسازی |
خروجی نهایی
این درس دو خروجی کاربردی در اختیارتان میگذارد:
1. پرامپت زنجیرهی استدلال (outputs/prompt-reasoning-chain.md): قالب پرامپتی آماده برای محیط پروداکشن بر پایهی Few-Shot CoT همراه با خودسازگاری. کافی است نمونهها و دامنهی مسئلهی خود را درون آن قرار دهید.
2. مهارت انتخاب الگوهای CoT (outputs/skill-cot-patterns.md): چارچوبی برای تصمیمگیری جهت انتخاب تکنیک استدلال مناسب بر اساس نوع تسک، الزامات دقت و محدودیتهای هزینه.
تمرینها
-
شکاف عملکردی را بسنجید: 10 مسئله از بنچمارک GSM8K بردارید. هر کدام را با روشهای Few-Shot ،Zero-Shot، Zero-Shot CoT و Few-Shot CoT حل کنید. دقت هر کدام را ثبت کنید. کدام تکنیک بیشترین جهش دقت را روی مدل شما رقم میزند؟
-
آزمایش انتخاب نمونه: برای همان 10 مسئله، انتخاب تصادفی نمونهها را با نمونههای مشابهِ دستچینشده مقایسه کنید. اختلاف دقت را بسنجید. در چه نقطهای کیفیت مثالها بر کمیت آنها ارجحیت پیدا میکند؟
-
منحنی هزینهی خودسازگاری: الگوی خودسازگاری را با مقادیر N برابر با 1، 3، 5، 7 و 10 روی 20 مسئلهی GSM8K اجرا کنید. نمودار دقت در برابر هزینه (کل توکنها) را رسم کنید. نقطهی زانویی (knee) نمودار برای مدل شما کجاست؟
-
ساخت یک چرخهی ReAct: پایپلاین را با افزودن یک ابزار ماشینحساب گسترش دهید. وقتی مدل عبارت ریاضی تولید میکند، آن را با تابع
eval()در پایتون (درون یک محیط ایزوله یا سندباکس) اجرا کرده و نتیجه را به مدل بازگردانید. بررسی کنید آیا استدلال متکی بر ابزار عملکرد بهتری نسبت به CoT خالص دارد یا خیر. -
استفاده از ToT برای تسکهای خلاقانه: حلکنندهی درخت تفکر را برای یک تسک نگارش خلاقانه بازنویسی کنید: «یک داستان 6 کلمهای بنویس که در عین حال هم خندهدار باشد و هم غمانگیز.» از خود LLM بهعنوان ارزیاب استفاده کنید. آیا کاوش شاخهای، خروجیهای خلاقانهتری نسبت به تولید تکمرحلهای تولید میکند؟
اصطلاحات کلیدی
| اصطلاح | در گفتوگوهای روزمره | معنای دقیق فنی |
|---|---|---|
| پرامپتنویسی با چند نمونه (Few-shot prompting) | «چند تا مثال بهش بده» | قرار دادن نمونههای ورودی و خروجی در پرامپت برای تثبیت فرمت خروجی و رفتار مورد انتظار مدل |
| زنجیرهی تفکر (Chain-of-Thought) | «بگو گامبهگام فکر کنه» | وادار کردن مدل به تولید توکنهای استدلال میانی جهت افزایش عمق محاسباتی موثر، پیش از تولید پاسخ نهایی |
| خودسازگاری (Self-Consistency) | «چند بار اجراش کن» | نمونهبرداری از N مسیر استدلال متمایز با دمای بیشتر از 0 و تعیین پاسخ نهایی بر اساس رای اکثریت |
| درخت تفکر (Tree-of-Thought) | «بذار گزینهها رو بررسی کنه» | جستوجوی ساختاریافته روی branchهای مختلف استدلال بهطوری که هر راهحل جزئی ارزیابی شده و فقط مسیرهای امیدوارکننده بسط پیدا کنند |
| مدل ReAct | «تفکر به اضافهی استفاده از ابزار» | ترکیب ردپای استدلال با اقدامات خارجی (جستوجو، محاسبه، فراخوانی API) درون چرخهی «تفکر-اقدام-مشاهده» |
| زنجیرهسازی پرامپت (Prompt chaining) | «به چند مرحله تقسیمش کن» | خرد کردن یک تسک پیچیده به پرامپتهای متوالی، بهگونهای که خروجی هر پرامپت ورودی گام بعد باشد |
| روش Zero-shot CoT | «فقط بنویس گامبهگام فکر کن» | افزودن یک عبارت محرک استدلال به پرامپت بدون ارائهی هیچ مثالی، با اتکا به ظرفیت استدلال درونی مدل |
برای مطالعهی بیشتر
- Chain-of-Thought Prompting Elicits Reasoning in Large Language Models — مقالهی اصلی CoT از Google Brain به قلم وی و همکاران (2022). بخشهای 2 و 3 را برای مشاهدهی نتایج کلیدی مطالعه کنید.
- Self-Consistency Improves Chain of Thought Reasoning in Language Models — مقالهی خودسازگاری از وانگ و همکاران (2023). تمام اعداد و ارقام مورد نیاز در جدول 1 آمده است.
- Tree of Thoughts: Deliberate Problem Solving with Large Language Models — مقالهی ToT از یائو و همکاران (2023). نتایج Game of 24 در بخش 4 برجستهترین بخش آن است.
- ReAct: Synergizing Reasoning and Acting in Language Models — مقالهی یائو و همکاران (2022)؛ شالودهی ایجنتهای هوش مصنوعی امروزی. بخش 3 چرخهی «تفکر-اقدام-مشاهده» را تشریح میکند.
- Large Language Models are Zero-Shot Reasoners — مقالهی کوجیما و همکاران (2022) دربارهی عبارت «Let's think step by step». به نسبت سادگیاش، تاثیر شگفتانگیزی دارد.
- DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines — خطاب و همکاران (2023). پرامپتنویسی را بهمثابهی یک مسئلهی کامپایل در نظر میگیرد. اگر میخواهید فراتر از مهندسی دستی پرامپت بروید، این مقاله را بخوانید.
- OpenAI — Reasoning models guide — راهنمای رسمی برای درک اینکه چه زمانی زنجیرهی تفکر به یک حالت استدلالی داخلی (با قیمتگذاری بر اساس توکن) تبدیل میشود، در برابر وقتهایی که صرفاً یک ترفند در سطح پرامپت است.
- Lightman et al., "Let's Verify Step by Step" (2023) — مدلهای پاداش فرایند (PRM) که به هر گام از زنجیره امتیاز میدهند؛ سیگنال نظارت بر استدلال که جایگزین پاداشدهیِ صِرف به نتیجهی نهایی شده است.
- Snell et al., "Scaling LLM Test-Time Compute Optimally" (2024) — مطالعهای سیستماتیک پیرامون طول CoT، نمونهبرداری خودسازگاری و MCTS؛ مسیری که «گامبهگام فکر کن» وقتی دقت از تاخیر مهمتر است، به آن منتهی میشود.
