فاز 14 · درس 5

بهبود تکرارشونده با الگوهای Self-Refine و CRITIC

نوع
ساختنی
زمان
حدود 60 دقیقه
زبان‌ها
Python (stdlib)
پیش‌نیاز
فاز 14 · درس 01 (Agent Loop)، فاز 14 · درس 03 (Reflexion)
یک نقشه مهندسی با مهر تایید قرمز در کنار ابزار دقیق اندازه‌گیری و قلم تصحیح
فهرست مطالب
  1. اهداف یادگیری
  2. صورت مسئله
  3. مفاهیم پایه
  4. رویکرد Self-Refine (مادان و همکاران، NeurIPS 2023)
  5. رویکرد CRITIC (گو و همکاران، arXiv:2305.11738، نسخه 4 فوریه 2024)
  6. شرط توقف
  7. الگوی ارزیاب-بهینه‌ساز (Anthropic، 2024)
  8. گاردریل‌های خروجی در OpenAI Agents SDK
  9. تله‌های رایج در سال 2026
  10. پیاده‌سازی از صفر
  11. استفاده از ابزارهای واقعی
  12. خروجی این درس
  13. تمرین‌ها
  14. اصطلاحات کلیدی
  15. برای مطالعه‌ی بیشتر

در ساخت برنامه‌های متکی بر مدل‌های زبانی، خروجی اول ایجنت به‌ندرت بی‌نقص است؛ کدهایی با خطای سینتکس، پاسخ‌های بسیار طولانی یا توهم در اعلام فکت‌ها از مشکلات همیشگی هستند. تکیه بر تولید یک‌باره پاسخ معمولاً به شکست ایجنت در محیط‌های عملیاتی منجر می‌شود.

دو الگوی مشهور Self-Refine و CRITIC این چالش را با راه‌اندازی حلقه‌ی نقد و اصلاح برطرف می‌کنند. تفاوت حیاتی میان خودنقدی ساده‌ی مدل و اعتبارسنجی تکیه‌زده بر ابزارهای خارجی (مانند لینترها، تست‌ها و وب‌سرچ) مبنای شکل‌گیری سیستم‌های مدرن مثل «ارزیاب-بهینه‌ساز» در فریم‌ورک‌های توسعه است.

اگر برای فراخوانی API مدل‌ها با چالش پرداخت ارزی یا عدم دسترسی مستقیم به ارائه‌دهندگان خارجی مواجه هستید، پیاده‌سازی این الگوها معمولاً وابسته به مدل خاصی نیست و به راحتی با تغییر آدرس پایه (base_url) روی گیت‌وی‌های واسط داخلی یا مدل‌های محلی اجرا می‌شود.

رویکرد Self-Refine (مادان و همکاران، 2023) از یک مدل زبانی بزرگ در سه نقشِ تولید (generate)، بازخورد (feedback) و بازبینی (refine) درون یک حلقه استفاده می‌کند. میانگین بهبود: 20+ نمره‌ی مطلق در 7 تسک مختلف. مقاله‌ی CRITIC (گو و همکاران، 2023) با هدایت مرحله‌ی اعتبارسنجی از مسیر ابزارهای خارجی، گام بازخورد را تقویت می‌کند. در سال 2026، این الگو در تمام فریم‌ورک‌ها با عناوینی مثل «ارزیاب-بهینه‌ساز» (Evaluator-Optimizer در Anthropic) یا حلقه‌ی گاردریل (در OpenAI Agents SDK) پیاده‌سازی شده است.

اهداف یادگیری

  • بیان سه پرامپت اصلی در Self-Refine (تولید، بازخورد، بازبینی) و توضیح اینکه چرا تاریخچه برای پرامپت بازبینی حیاتی است.
  • توضیح بینش کلیدی CRITIC: مدل‌های زبانی بدون ارجاع‌دهی مکانی (Grounding) به منابع خارجی، در خوداعتبارسنجی غیرقابل‌اعتماد هستند.
  • پیاده‌سازی یک حلقه‌ی Self-Refine با کتابخانه‌ی استاندارد پایتون، همراه با تاریخچه و یک مدل اعتبارسنج خارجی اختیاری.
  • تطبیق این الگو با الگوی کاری «ارزیاب-بهینه‌ساز» در Anthropic و گاردریل‌های خروجی در OpenAI Agents SDK.

صورت مسئله

ایجنت پاسخی تولید می‌کند که تقریباً درست است؛ شاید یک خط از کد خطای سینتکس دارد، شاید خلاصه بیش از حد طولانی است، یا شاید برنامه یک حالت خاص (edge case) را نادیده گرفته است. چیزی که در این شرایط می‌خواهید این است: ایجنت خروجی خودش را نقد کند و سپس آن را اصلاح نماید.

رویکرد Self-Refine نشان می‌دهد که این کار با یک مدل واحد، بدون داده‌های آموزشی جدید و بدون یادگیری تقویتی (RL) شدنی است. اما یک نکته‌ی مهم وجود دارد: مدل‌های زبانی بزرگ در خوداعتبارسنجی روی فکت‌ها و حقایق پیچیده ضعیف عمل می‌کنند. مقاله‌ی CRITIC راه‌حل را نشان می‌دهد: مرحله‌ی اعتبارسنجی را از مسیر ابزارهای خارجی (موتور جستجو، مفسر کد، ماشین‌حساب، رانر تست‌ها) عبور دهید.

این دو مقاله در کنار هم، استاندارد پیش‌فرض سال 2026 را برای بهبود تکرارشونده تعریف می‌کنند: تولید کن، اعتبارسنجی کن (در صورت امکان با ابزار خارجی)، بازبینی کن، و زمانی که اعتبارسنج تایید کرد، متوقف شو.

مفاهیم پایه

رویکرد Self-Refine (مادان و همکاران، NeurIPS 2023)

یک مدل زبانی بزرگ، سه نقش:

generate(task)            -> output_0
feedback(task, output_0)  -> critique_0
refine(task, output_0, critique_0, history) -> output_1
feedback(task, output_1)  -> critique_1
refine(task, output_1, critique_1, history) -> output_2
...
stop when feedback says "no issues" or budget exhausted.

نکته‌ی کلیدی: تابع refine کل تاریخچه — یعنی تمام خروجی‌ها و نقدهای قبلی — را می‌بیند تا اشتباهات را تکرار نکند. نویسندگان مقاله این بخش را با آزمون حذف (ablation) بررسی کرده‌اند: تاریخچه را حذف کنید، کیفیت خروجی به‌شدت افت می‌کند.

نتیجه‌ی برجسته: به‌طور میانگین 20+ نمره‌ی بهبود مطلق در 7 تسک مختلف (ریاضی، کدنویسی، سرواژه‌سازی و گفت‌وگو) حتی روی GPT-4؛ آن هم بدون آموزش، بدون ابزار خارجی و فقط با یک مدل واحد.

رویکرد CRITIC (گو و همکاران، arXiv:2305.11738، نسخه 4 فوریه 2024)

نقطه‌ضعف Self-Refine این است: در گام بازخورد، خود مدل زبانی به خروجی‌اش امتیاز می‌دهد. این کار برای ادعاهای مبتنی بر واقعیت نامطمئن است؛ زیرا توهم (hallucination) معمولاً برای همان مدلی که آن را ساخته، کاملاً قانع‌کننده به نظر می‌رسد. مقاله‌ی CRITIC تابع feedback(task, output) را با verify(task, output, tools) جایگزین می‌کند که در آن tools شامل موارد زیر است:

  • موتور جستجو برای سنجش صحت حقایق و فکت‌ها.
  • مفسر کد برای بررسی درستی عملکرد کد.
  • ماشین‌حساب برای محاسبات ریاضی.
  • اعتبارسنج‌های تخصصی دامنه (تست‌های واحد، تایپ‌چکرها، لینترها).

مدل اعتبارسنج، نقدی ساختاریافته تولید می‌کند که مستند به نتایج ابزارهاست. سپس بخش بازبینی‌کننده (refiner)، خروجی را بر اساس این نقد اصلاح می‌کند.

نتیجه‌ی برجسته: CRITIC در تسک‌های مبتنی بر واقعیت عملکرد بهتری نسبت به Self-Refine دارد، چون نقد آن دارای ارجاع‌دهی مکانی و مستند به ابزارهاست. در تسک‌هایی که ابزار اعتبارسنج خارجی ندارند (مثل نویسندگی خلاق یا فرمت‌بندی متن)، CRITIC به همان Self-Refine تقلیل پیدا می‌کند.

شرط توقف

دو ساختار رایج برای شرط توقف وجود دارد:

  1. تایید مدل اعتبارسنج. تست خارجی موفقیت را برمی‌گرداند. در صورت در دسترس بودن، این حالت همیشه اولویت دارد (تست‌های واحد، تایپ‌چکر، اعتبارسنجی با گاردریل).
  2. عدم ارائه‌ی بازخورد جدید. مدل می‌گوید «خروجی مشکلی ندارد». این روش ارزان‌تر است ولی قابلیت اتکای پایینی دارد؛ باید حتماً با یک سقف مشخص برای تعداد تکرار (max iterations) همراه شود.

رویکرد پیش‌فرض سال 2026: ترکیب هر دو حالت. «متوقف شو اگر اعتبارسنج تایید کرد، یا اگر مدل گفت مشکلی نیست و تعداد تکرارها حداقل 2 بار بود، یا اگر تعداد تکرار به سقف مجاز رسید.»

الگوی ارزیاب-بهینه‌ساز (Anthropic، 2024)

مقاله‌ی دسامبر 2024 شرکت Anthropic این الگو را به عنوان یکی از پنج الگوی اصلی گردش کار معرفی می‌کند. این الگو دو نقش دارد:

  • ارزیاب (Evaluator): به خروجی امتیاز می‌دهد و نقد را تولید می‌کند.
  • بهینه‌ساز (Optimizer): خروجی را با توجه به نقد بازنویسی می‌کند.

این فرآیند تا زمان تایید ارزیاب در حلقه تکرار می‌شود. این سازوکار در واقع همان چارچوب Self-Refine/CRITIC با ادبیات Anthropic است. نکته‌ی مهندسی مهمی که Anthropic اضافه می‌کند این است: پرامپت‌های ارزیاب و بهینه‌ساز باید تفاوت ساختاری چشمگیری داشته باشند تا مدل صرفاً به تایید صوری و خودکار خروجی (rubber-stamping) روی نیاورد.

گاردریل‌های خروجی در OpenAI Agents SDK

مجموعه‌ی OpenAI Agents SDK این الگو را در قالب «گاردریل‌های خروجی» (output guardrails) ارائه می‌دهد. گاردریل (ریل ایمنی) نوعی اعتبارسنج است که روی خروجی نهایی ایجنت اجرا می‌شود. اگر گاردریل فعال شود (خطای OutputGuardrailTripwireTriggered را صادر کند)، خروجی رد می‌شود و ایجنت می‌تواند دوباره تلاش کند. گاردریل‌ها می‌توانند مانند CRITIC ابزارها را فراخوانی کنند یا مانند Self-Refine توابع خالص (pure functions) باشند.

تله‌های رایج در سال 2026

  • حلقه‌های تایید صوری (Rubber-stamp loops): استفاده از یک مدل یکسان برای تولید و نقد با لحن و ساختار پرامپت مشابه، به جمله‌ی «از نظر من خوب است» ختم می‌شود. از پرامپت‌هایی با ساختار کاملاً متفاوت یا از یک مدل کوچک‌تر و ارزان‌تر برای نقد استفاده کنید.
  • بازبینی بیش از حد (Over-refinement): هر دور بازبینی باعث افزایش تاخیر (latency) و مصرف توکن می‌شود. بودجه‌ی خود را روی 1 تا 3 تکرار ببندید؛ بعد از آن کار را برای بررسی به انسان ارجاع دهید.
  • استفاده از CRITIC روی تسک‌های ساده: اگر اعتبارسنج خارجی وجود ندارد، CRITIC عملاً تفاوتی با Self-Refine نخواهد داشت؛ پس تاخیر سیستم را برای یک اعتبارسنج صوری و توخالی بالا نبرید.
خوداصلاحی (SELF-REFINE)تکرارها را بکشید
SELF-REFINESelf-Refine has one model write an answer, critique its own work, and revise, looping the output back as input. The first few passes catch the obvious flaws and gain the most; later passes find less to fix, so quality climbs toward a ceiling and flattens. The skill is knowing when extra iterations stop paying for their tokens.سقف
در روش Self-Refine یک مدل پاسخ را می‌نویسد، کار خود را نقد می‌کند و با برگرداندن خروجی به‌عنوان ورودی، آن را بازبینی می‌نماید. چند دور اول نقص‌های آشکار را می‌گیرند و بیشترین سود را دارند؛ دورهای بعدی موارد کمتری برای اصلاح می‌یابند، بنابراین کیفیت به یک سقف نزدیک شده و هموار می‌شود. مهارت اصلی، دانستن زمانی است که تکرارهای اضافه دیگر ارزش توکن‌های مصرفی را ندارند.

پیاده‌سازی از صفر

فایل code/main.py دو رویکرد Self-Refine و CRITIC را روی یک تسک نمونه پیاده می‌کند: تولید یک فهرست کوتاه نقطه‌ای بر اساس یک موضوع. اعتبارسنج، ساختار متن را چک می‌کند (3 مورد، هر کدام زیر 60 کاراکتر). در بخش CRITIC، یک «اعتبارسنج فکت» خارجی نیز اضافه می‌شود که توهم‌های شناخته‌شده را جریمه می‌کند.

اجزای سیستم:

  • generate — بخش تولیدکننده‌ی متن.
  • feedback — خودنقدی به سبک مدل‌های زبانی.
  • verify_external — مدل اعتبارسنج مبتنی بر ابزار خارجی به سبک CRITIC.
  • refine — بازنویسی خروجی با توجه به تاریخچه.
  • شرط توقف — تایید اعتبارسنج یا رسیدن به سقف 4 تکرار.

اجرای برنامه:

python3 code/main.py

خروجی‌های Self-Refine و CRITIC را با هم مقایسه کنید. CRITIC خطایی در اطلاعات و فکت‌ها پیدا می‌کند که Self-Refine متوجه آن نشده بود؛ زیرا اعتبارسنج خارجی به منابعی متصل است و ارجاع‌دهی مکانی دارد که خودنقدیِ ساده از آن بی‌بهره است.

استفاده از ابزارهای واقعی

الگوی ارزیاب-بهینه‌سازِ Anthropic، همین سازوکار را با ادبیات سازگار با مدل Claude ارائه می‌دهد. گاردریل‌های خروجی در OpenAI Agents SDK ساختاری مشابه CRITIC دارند (گاردریل‌ها می‌توانند ابزارها را صدا بزنند). پلتفرم LangGraph گره‌ای به نام Reflection دارد که ساختار آن شبیه Self-Refine است. ابزار Gemini 2.5 Computer Use گوگل هم یک ارزیاب ایمنیِ گام‌به‌گام اضافه کرده که مدلی از CRITIC محسوب می‌شود: هر عملیات قبل از commit شدن به‌طور کامل اعتبارسنجی می‌شود.

خروجی این درس

فایل outputs/skill-refine-loop.md یک حلقه‌ی ارزیاب-بهینه‌ساز را بر اساس ساختار تسک، دسترسی به اعتبارسنج و بودجه‌ی تعداد تکرارها پیکربندی می‌کند. این فایل پرامپت‌های تولیدکننده، ارزیاب/اعتبارسنج و بهینه‌ساز را به همراه سیاست توقف تولید می‌نماید.

تمرین‌ها

  1. کد را با max_iterations=1 اجرا کنید. آیا CRITIC همچنان کمکی می‌کند؟
  2. اعتبارسنج خارجی را با یک نسخه‌ی دارای خطا جایگزین کنید (با 30% مثبت کاذب تصادفی). حلقه چه واکنشی نشان می‌دهد؟ این سناریو، واقعیت بیشتر ساختارهای گاردریل در سال 2026 است.
  3. نسخه‌ای با ساختار «تولیدکننده و ناقد روی مدل‌های مختلف» بسازید: یک مدل بزرگ خروجی را تولید کند و یک مدل کوچک آن را نقد نماید. آیا نتیجه بهتر از حالت استفاده از مدل یکسان است؟
  4. بخش 3 مقاله‌ی CRITIC را بخوانید (arXiv:2305.11738 نسخه 4). سه دسته‌ی ابزارهای اعتبارسنجی را نام ببرید و برای هر کدام یک مثال بزنید.
  5. قابلیت output_guardrails در OpenAI Agents SDK را با نقش مدل اعتبارسنج در CRITIC مقایسه و تطبیق دهید. این SDK چه بخش‌هایی را درست پیاده کرده و در کدام بخش‌ها نقص دارد؟

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

اصطلاح برداشتی که وجود دارد معنای واقعی و دقیق
Self-Refine «مدلی که خودش را اصلاح می‌کند» حلقه‌ی تولید -> بازخورد -> بازبینی در یک مدل واحد، به همراه تاریخچه
CRITIC «اعتبارسنجی با تکیه بر ابزارها» جایگزینی گام بازخورد با یک اعتبارسنج خارجی (جستجو، کد، ماشین‌حساب، تست‌ها)
ارزیاب-بهینه‌ساز (Evaluator-Optimizer) «الگوی گردش کار در Anthropic» دو نقش مجزا — ارزیاب امتیاز می‌دهد، بهینه‌ساز بازنویسی می‌کند — که تا زمان همگرایی تکرار می‌شوند
گاردریل خروجی (Output guardrail) «بررسی بعد از اتمام کار» اعتبارسنج در OpenAI Agents SDK که پس از تولید خروجی توسط ایجنت اجرا می‌شود
مرحله‌ی اعتبارسنجی (Verify step) «فاز نقد» تصمیم تعیین‌کننده و کلیدی: ارجاع‌دهی مکانی با ابزار خارجی یا ارزیابی توسط خود مدل
تاریخچه‌ی بازبینی (Refine history) «آنچه مدل قبلاً امتحان کرده» خروجی‌ها و نقدهای قبلی که به پرامپت بازبینی الحاق می‌شوند؛ با حذف آن، کیفیت خروجی به‌شدت افت می‌کند
حلقه‌ی تایید صوری (Rubber-stamp loop) «مشکل تایید خودکار خروجی» نقد خروجی با پرامپت مشابه که فقط پیام «خوب به نظر می‌رسد» را برمی‌گرداند؛ راه‌حل: تغییر ساختاری پرامپت‌ها
شرط توقف (Stop condition) «آزمون همگرایی» تایید اعتبارسنج یا عدم ثبت بازخورد همراه با سقف تکرار؛ هیچ‌وقت نباید تک‌شرطی باشد

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

خودآزمایی

به سؤال‌ها جواب بدهید تا ببینید چقدر از درس در ذهنتان مانده است.

  1. پیش از درسکدام سه پرامپت، یک حلقه Self-Refine را تشکیل می‌دهند؟
  2. پیش از درسچرا روش Self-Refine در مرحله‌ی refine به تاریخچه نیاز دارد؟
  3. حین درسالگوی CRITIC چه تغییری نسبت به Self-Refine ایجاد می‌کند؟
  4. حین درسکدام الگوی گردش‌کار Anthropic در ادبیات متناسب با Claude معادل Self-Refine و CRITIC است؟
  5. حین درسحلقه‌ی تایید کورکورانه (rubber-stamp loop) چیست و درس چه پیشنهادی برای جلوگیری از آن دارد؟
  6. پس از درسکدام قابلیت در OpenAI Agents SDK شبیه به الگوی CRITIC است؟
  7. پس از درسدرس چه شرط توقفی را برای حلقه‌های ارزیاب-بهینه‌ساز در سال 2026 پیشنهاد می‌کند؟

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

تفاوت بنیادین میان Self-Refine و CRITIC چیست؟

در Self-Refine مدل زبانی خروجی خود را بدون استفاده از ابزار نقد می‌کند، در حالی که در CRITIC مرحله‌ی اعتبارسنجی از مسیر ابزارهای خارجی (موتور جستجو، مفسر کد و لینتر) انجام می‌شود تا از توهم جلوگیری شود.

چرا حفظ تاریخچه در پرامپت بازبینی (refine) حیاتی است؟

پرامپت بازبینی باید تمام خروجی‌ها و نقدهای قبلی را ببیند تا اشتباهات گذشته را دوباره تکرار نکند؛ حذف این تاریخچه کیفیت خروجی را به‌شدت کاهش می‌دهد.

منظور از حلقه‌ی تایید صوری (Rubber-stamp loop) چیست و چگونه حل می‌شود؟

وقتی همان مدل با پرامپتی مشابه برای نقد استفاده شود، اغلب پاسخ «خوب است» می‌دهد؛ راه‌حل، ایجاد تفاوت ساختاری عمیق در پرامپت ارزیاب یا استفاده از مدلی کوچک‌تر و ارزان‌تر برای نقد است.

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

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