فاز 11 · درس 2

استراتژی‌های پیشرفته پرامپت: Few-Shot، زنجیره تفکر و درخت تفکر

نوع
ساختنی
زمان
حدود 45 دقیقه
زبان‌ها
Python
پیش‌نیاز
درس 11.01 (پرامپت‌نویسی)
یک مسیر کاغذی یادداشت و شاخه‌های درختی نورانی که از دل یک دفترچه منشعب می‌شوند و چندین جهت گوناگون را بررسی می‌کنند
فهرست مطالب
  1. اهداف یادگیری
  2. صورت مسئله
  3. مفاهیم پایه
  4. مقایسه‌ی Zero-Shot و Few-Shot: وقتی مثال‌ها دستورالعمل‌ها را شکست می‌دهند
  5. انتخاب نمونه‌ها: نمونه‌های مشابه، تصادفی‌ها را شکست می‌دهند
  6. زنجیره‌ی تفکر: در اختیار گذاشتن چرک‌نویس برای مدل‌ها
  7. خودسازگاری: نمونه‌برداری چندگانه، یک رای‌گیری نهایی
  8. درخت تفکر: کاوش شاخه‌ای
  9. معماری ReAct: تفکر در کنار عمل
  10. پرامپت‌نویسی ساختاریافته: تگ‌های XML، جداکننده‌ها و سرتیترها
  11. زنجیره‌سازی پرامپت: تجزیه‌ی ترتیبی تسک‌ها
  12. مقایسه‌ی کارایی رویکردها
  13. پیاده‌سازی گام‌به‌گام
  14. گام 1: مخزن نمونه‌های Few-Shot
  15. گام 2: سازنده‌ی پرامپت زنجیره‌ی تفکر
  16. گام 3: رای‌گیری خودسازگاری
  17. گام 4: حل‌کننده مبتنی بر درخت تفکر
  18. گام 5: پایپ‌لاین جامع
  19. نحوه‌ی استفاده
  20. پرامپت‌های Few-Shot مبتنی بر قالب
  21. پرامپت‌های کامپایل‌شده
  22. مقایسه‌ی پیاده‌سازی از صفر با فریم‌ورک‌ها
  23. خروجی نهایی
  24. تمرین‌ها
  25. اصطلاحات کلیدی
  26. برای مطالعه‌ی بیشتر

بسیاری از توسعه‌دهندگان هنگام مواجهه با خطای مدل‌های زبانی در مسائل چندمرحله‌ای، اولین راه‌حل را ارتقای مدل به گزینه‌های سنگین‌تر و گران‌تر می‌دانند؛ در حالی که شکاف دقت میان یک پاسخ نادرست و پاسخی دقیق، اغلب نه در توانایی ذاتی مدل، بلکه در استراتژی استدلال نهفته است. تکنیک‌هایی مانند پرامپت‌نویسی با چند نمونه (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) بر اساس مثال‌ها بسیار مطمئن‌تر از تحلیل دستورالعمل‌های انتزاعی عمل می‌کند.

مقایسه Zero-Shot و Few-ShotZero-Shot'این نظر را دسته‌بندی کن'مدل قالب را حدس می‌زند78% در GSM8KFew-Shot'اینجا 3 نمونه آمده است...حالا این نظر را دسته‌بندی کن'مدل الگو را تطبیق می‌دهد85% در GSM8K

چه زمانی Few-Shot برنده است: تسک‌های حساس به فرمت، دسته‌بندی، استخراج داده‌های ساختاریافته، اصطلاحات تخصصی یک حوزه‌ی خاص و هر تسکی که مدل باید با الگوی مشخصی هماهنگ شود.

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

انتخاب نمونه‌ها: نمونه‌های مشابه، تصادفی‌ها را شکست می‌دهند

کیفیت نمونه‌ها یکسان نیست. انتخاب نمونه‌هایی که به ورودیِ هدف شباهت دارند، در تسک‌های دسته‌بندی بین 5 تا 15 درصد خروجی بهتری نسبت به انتخاب تصادفی رقم می‌زند (Liu et al., 2022). سه اصل اساسی در این زمینه وجود دارد:

  1. شباهت معنایی (Semantic similarity): انتخاب نمونه‌هایی که در فضای امبدینگ (embedding space)، کمترین فاصله را با ورودی دارند
  2. تنوع برچسب‌ها (Label diversity): پوشش تمام دسته‌بندی‌های خروجی در میان مثال‌ها
  3. تطابق سطح دشواری (Difficulty matching): هم‌سطح بودن پیچیدگی مثال‌ها با مسئله‌ی هدف

تعداد بهینه‌ی نمونه‌ها برای اغلب تسک‌ها 3 تا 5 مورد است. کمتر از 3 نمونه، سیگنال کافی برای استخراج الگو به مدل نمی‌دهد؛ بیشتر از 5 نمونه هم شما را به بازده نزولی می‌رساند و توکن‌های پنجره‌ی زمینه (context window) را هدر می‌دهد. در تسک‌های دسته‌بندی با برچسب‌های متعدد، یک مثال برای هر برچسب در نظر بگیرید.

زنجیره‌ی تفکر: در اختیار گذاشتن چرک‌نویس برای مدل‌ها

پرامپت‌نویسی زنجیره‌ی تفکر (CoT) توسط وی و همکاران (Wei et al., 2022) در Google Brain معرفی شد. ایده ساده است: به‌جای اینکه فقط پاسخ نهایی را بخواهید، از مدل بخواهید ابتدا مراحل استدلال خود را نشان دهد.

پرامپت‌نویسی زنجیره افکار (CoT)پرامپت‌نویسی استانداردس: راجر 5 توپ دارد.او 2 قوطی 3 تایی می‌خرد.چند توپ دارد؟پ: 11س: راجر 5 توپ دارد.او 2 قوطی 3 تایی می‌خرد.چند توپ دارد؟راجر با 5 تا شروع می‌کند.2 قوطی 3 تایی = 6.5 + 6 = 11.پ: 11

چرا این سازوکار از نظر مکانیکی کار می‌کند؟ هر توکنی که یک ترنسفورمر تولید می‌کند، به زمینه‌ی متنی برای تولید توکن بعدی تبدیل می‌شود. بدون 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) تولید کنید و روی پاسخ نهایی رای اکثریت بگیرید، خطاها یکدیگر را خنثی می‌کنند.

مسئله: 'یک فروشگاه 48 سیب دارد.آن‌ها 1/3 را دوشنبه می‌فروشندو 1/4 بقیه را سه‌شنبه.چند تا باقی می‌ماند؟'مسیر 1: 48 - 16 = 3232 - 8 = 24پاسخ: 24مسیر 2: 1/3 از 48 = 16باقی‌مانده: 321/4 از 32 = 832 - 8 = 24پاسخ: 24مسیر 3: 48/3 = 16 فروخته شد48 - 16 = 3232/4 = 8 فروخته شد32 - 8 = 24پاسخ: 24مسیر 4: فروش 1/3: 48 - 12 = 36فروش 1/4: 36 - 9 = 27پاسخ: 27مسیر 5: دوشنبه: 48 * 2/3 = 32سه‌شنبه: 32 * 3/4 = 24پاسخ: 24اکثریت آرا24: 4 رأی27: 1 رأینهایی: 24

خودسازگاری در آزمایش‌های اولیه روی 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 را کاوش کرده و پیش از ادامه‌ی مسیر، امیدوارکننده‌ترین گزینه‌ها را ارزیابی می‌کند.

ادامهادامهادامهادامههرسبهترین مسیرمسئلهفکر 1aفکر 1bفکر 1cارزیابی: 0.8ارزیابی: 0.3ارزیابی: 0.9فکر 2aفکر 2bفکر 2aفکر 2bXارزیابی: 0.7ارزیابی: 0.95راه‌حل

ساختار ToT از سه جزء تشکیل شده است:

  1. تولید فکر (Thought generation): تولید چندین گام بعدیِ کاندید
  2. ارزیابی وضعیت (State evaluation): امتیازدهی به هر کاندید (می‌توان خود LLM را به‌عنوان ارزیاب به کار گرفت)
  3. الگوریتم جست‌وجو (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) ردپای استدلال را با اقدامات عملی ترکیب کردند. در این روش، مدل به‌صورت چرخشی فکر می‌کند (تولید استدلال) و عمل می‌کند (فراخوانی ابزارها، جست‌وجو و محاسبات).

پرسش:جمعیت کشوریکه برج ایفل در آنقرار دارد چقدر است؟فکر: باید پیدا کنمبرج ایفل در کدامکشور استاقدام: جستجوی'موقعیت برج ایفل'مشاهده:پاریس، فرانسهفکر: حالا به جمعیتفرانسه نیاز دارماقدام: جستجوی'جمعیت فرانسه 2024'مشاهده:68.4 میلیونفکر: پاسخ راپیدا کردمپاسخ:68.4 میلیون

معماری 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) این تسک‌ها را به چند مرحله خرد می‌کند؛ به‌گونه‌ای که خروجی یک پرامپت، ورودی پرامپت بعدی می‌شود.

ورودی خامپرامپت 1:استخراجحقایق کلیدیحقایقپرامپت 2:تحلیلحقایقتحلیلپرامپت 3:تولیدتوصیهخروجی نهایی

زنجیره‌سازی به سه دلیل از پرامپت تک‌مرحله‌ای عملکرد بهتری دارد:

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

مقایسه‌ی کارایی رویکردها

تکنیک مناسب‌ترین برای دقت روی 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)تعداد مثال‌ها را بکشید
FEW-SHOT CURVEAdding labeled examples to the prompt lifts accuracy fast at first, then flattens. The grey dot is zero-shot; the first few demonstrations close most of the gap, and beyond a handful each new example earns almost nothing while still costing tokens. The skill is picking the smallest set that reaches the plateau.
افزودن مثال‌های برچسب‌دار به پرامپت ابتدا دقت را به‌سرعت افزایش می‌دهد، سپس مسطح می‌شود. نقطه خاکستری zero-shot است؛ چند مثال اول بیشتر این فاصله را پر می‌کنند، و بعد از چند نمونه اولیه، هر مثال جدید تقریباً بازدهی ندارد در حالی که هزینه توکن به همراه دارد. مهارت در انتخاب کوچک‌ترین مجموعه‌ای است که به این فلات می‌رسد.

پیاده‌سازی گام‌به‌گام

ما یک سیستم حل مسائل ریاضی می‌سازیم که ترکیبی از پرامپت‌نویسی 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): چارچوبی برای تصمیم‌گیری جهت انتخاب تکنیک استدلال مناسب بر اساس نوع تسک، الزامات دقت و محدودیت‌های هزینه.

تمرین‌ها

  1. شکاف عملکردی را بسنجید: 10 مسئله از بنچ‌مارک GSM8K بردارید. هر کدام را با روش‌های Few-Shot ،Zero-Shot، Zero-Shot CoT و Few-Shot CoT حل کنید. دقت هر کدام را ثبت کنید. کدام تکنیک بیشترین جهش دقت را روی مدل شما رقم می‌زند؟

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

  3. منحنی هزینه‌ی خودسازگاری: الگوی خودسازگاری را با مقادیر N برابر با 1، 3، 5، 7 و 10 روی 20 مسئله‌ی GSM8K اجرا کنید. نمودار دقت در برابر هزینه (کل توکن‌ها) را رسم کنید. نقطه‌ی زانویی (knee) نمودار برای مدل شما کجاست؟

  4. ساخت یک چرخه‌ی ReAct: پایپ‌لاین را با افزودن یک ابزار ماشین‌حساب گسترش دهید. وقتی مدل عبارت ریاضی تولید می‌کند، آن را با تابع eval() در پایتون (درون یک محیط ایزوله یا سندباکس) اجرا کرده و نتیجه را به مدل بازگردانید. بررسی کنید آیا استدلال متکی بر ابزار عملکرد بهتری نسبت به CoT خالص دارد یا خیر.

  5. استفاده از ToT برای تسک‌های خلاقانه: حل‌کننده‌ی درخت تفکر را برای یک تسک نگارش خلاقانه بازنویسی کنید: «یک داستان 6 کلمه‌ای بنویس که در عین حال هم خنده‌دار باشد و هم غم‌انگیز.» از خود LLM به‌عنوان ارزیاب استفاده کنید. آیا کاوش شاخه‌ای، خروجی‌های خلاقانه‌تری نسبت به تولید تک‌مرحله‌ای تولید می‌کند؟

اصطلاحات کلیدی

اصطلاح در گفت‌وگوهای روزمره معنای دقیق فنی
پرامپت‌نویسی با چند نمونه (Few-shot prompting) «چند تا مثال بهش بده» قرار دادن نمونه‌های ورودی و خروجی در پرامپت برای تثبیت فرمت خروجی و رفتار مورد انتظار مدل
زنجیره‌ی تفکر (Chain-of-Thought) «بگو گام‌به‌گام فکر کنه» وادار کردن مدل به تولید توکن‌های استدلال میانی جهت افزایش عمق محاسباتی موثر، پیش از تولید پاسخ نهایی
خودسازگاری (Self-Consistency) «چند بار اجراش کن» نمونه‌برداری از N مسیر استدلال متمایز با دمای بیشتر از 0 و تعیین پاسخ نهایی بر اساس رای اکثریت
درخت تفکر (Tree-of-Thought) «بذار گزینه‌ها رو بررسی کنه» جست‌وجوی ساختاریافته روی branchهای مختلف استدلال به‌طوری که هر راه‌حل جزئی ارزیابی شده و فقط مسیرهای امیدوارکننده بسط پیدا کنند
مدل ReAct «تفکر به اضافه‌ی استفاده از ابزار» ترکیب ردپای استدلال با اقدامات خارجی (جست‌وجو، محاسبه، فراخوانی API) درون چرخه‌ی «تفکر-اقدام-مشاهده»
زنجیره‌سازی پرامپت (Prompt chaining) «به چند مرحله تقسیمش کن» خرد کردن یک تسک پیچیده به پرامپت‌های متوالی، به‌گونه‌ای که خروجی هر پرامپت ورودی گام بعد باشد
روش Zero-shot CoT «فقط بنویس گام‌به‌گام فکر کن» افزودن یک عبارت محرک استدلال به پرامپت بدون ارائه‌ی هیچ مثالی، با اتکا به ظرفیت استدلال درونی مدل

برای مطالعه‌ی بیشتر

سؤالات متداول

تفاوت Zero-shot CoT با Few-shot CoT در چیست؟

در Zero-shot CoT فقط با افزودن عبارتی مانند «بیایید گام‌به‌گام فکر کنیم» به انتهای پرامپت، مدل به استدلال وادار می‌شود؛ اما در Few-shot CoT علاوه بر سوال و جواب، نمونه‌هایی حاوی مراحل کامل استدلال نیز به پرامپت اضافه می‌شود که دقت بالاتری به همراه دارد.

تکنیک خودسازگاری (Self-Consistency) چگونه کار می‌کند؟

در این روش، با تنظیم دمای بیشتر از 0، چندین مسیر استدلال مستقل (مثلاً 5 مسیر) از مدل استخراج شده و در نهایت پاسخ نهایی بر اساس رای اکثریت میان این مسیرها انتخاب می‌شود تا خطاهای تصادفی حذف شوند.

چه زمانی باید از درخت تفکر (Tree-of-Thought) استفاده کرد؟

درخت تفکر برای مسائلی مناسب است که فضای جست‌وجوی بزرگ اما قابل ارزیابی دارند (مانند برنامه‌ریزی، حل معماها و بازی‌هایی مثل Game of 24) و استدلال خطی تک‌مسیره در آن‌ها به بن‌بست می‌رسد.

آیا افزودن «گام‌به‌گام فکر کن» به مدل‌های استدلالی جدید (مانند سری o یا DeepSeek-R1) تاثیری دارد؟

خیر؛ این مدل‌ها فرایند زنجیره‌ی تفکر را به‌طور ذاتی و درون‌سازمانی پیش از ارائه پاسخ نهایی طی می‌کنند و اضافه کردن چنین دستوراتی غیرضروری و گاهی نتیجه‌معکوس است.

ما رو توی گوگل بیشتر ببین

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