تصور کنید ایجنتی ساختهاید که در اولین تلاش برای حل یک مسئله یا صدا زدن ابزار شکست میخورد. در یادگیری تقویتی سنتی، اصلاح چنین رفتاری مستلزم اجرای هزاران دور آزمونوخطا، پردازش گرادیانها و استفاده از کلاسترهای گرانقیمت GPU است؛ رویکردی که در پروژههای واقعی و برای توسعهدهندگان به هیچوجه مقرونبهصرفه نیست.
الگوی Reflexion این بنبست را با یک ایدهی شفاف حل میکند: تقویت کلامی (Verbal Reinforcement). ایجنت پس از هر تلاش ناموفق، علت شکست را در قالب زبان طبیعی تحلیل میکند، آن را در یک حافظهی رویدادی (Episodic Memory) میگذارد و در تلاش بعدی، این تجربه را در پرامپت خود میخواند تا همان اشتباه را تکرار نکند.
در این درس یاد میگیرید که چگونه چرخهی Reflexion شامل کنشگر، ارزیاب و بازاندیش را با پایتون پیاده کنید تا بدون دستکاری وزنهای مدل یا نیاز به سختافزارهای سنگین، ایجنتهای خودترمیمشونده بسازید.
یادگیری تقویتی (RL) مبتنی بر گرادیان برای اصلاح یک حالت شکست (Failure mode)، به هزاران بار آزمونوخطا و یک کلاستر GPU نیاز دارد. اما Reflexion (شین و همکاران، کنفرانس NeurIPS 2023) همین کار را در قالب زبان طبیعی انجام میدهد: ایجنت بعد از هر بار تلاش ناموفق، بازاندیشی (Reflection) مینویسد، آن را در حافظهی رویدادی (Episodic Memory) ذخیره میکند و تلاش بعدی را به آن حافظه مشروط میسازد. این همان الگوی پشت محاسبات زمان استراحت (Sleep-time compute) در Letta، آموختههای فایل CLAUDE.md در Claude Code و قابلیت learn-rule در pro-workflow است.
اهداف یادگیری
- نام بردن سه مولفهی Reflexion (کنشگر یا Actor، ارزیاب یا Evaluator، بازاندیش یا Self-Reflector) و توضیح نقش حافظهی رویدادی.
- پیادهسازی چرخهی Reflexion با کتابخانهی استاندارد پایتون (stdlib)، شامل ارزیاب باینری، بافر بازاندیشی و تلاشهای مجدد از نو.
- انتخاب مناسب میان منابع بازخورد اسکالر، هیوریستیک و خودارزیاب برای یک تسک مشخص.
- توضیح این موضوع که چرا تقویت کلامی (Verbal reinforcement) خطاهایی را مهار میکند که در RL مبتنی بر گرادیان نیازمند هزاران بار آزمونوخطا هستند.
صورت مسئله
ایجنت در انجام یک تسک شکست میخورد. در یادگیری تقویتی استاندارد، باید هزاران بار دیگر تسک را اجرا کنید، گرادیانها را به دست آورید و وزنها را بهروزرسانی کنید. این کار گران و کُند است؛ ضمن اینکه بیشتر ایجنتهای محیط پروداکشن، بودجهی آموزش برای هر شکست را ندارند.
مقالهی Reflexion (شین و همکاران، arXiv:2303.11366) پرسش متفاوتی را پیش میکشد: چه میشود اگر ایجنت فقط به این فکر کند که چرا شکست خورده است و دفعهی بعد، با همان ایده در پرامپت خود دوباره تلاش کند؟ بدون هیچ بهروزرسانی در وزنها؛ بدون گرادیان؛ فقط زبان طبیعی که میان تلاشها ذخیره میشود.
نتیجه: در بنچمارک ALFWorld، این روش از ReAct و سایر خطوط مبنای فاقد فاینتیونینگ جلو میزند. در HotpotQA نسبت به ReAct بهتر عمل میکند. در تولید کد (HumanEval/MBPP) رکورد بهترین عملکرد زمان خود (State of the art) را ثبت میکند؛ همهی اینها بدون حتی یک گام محاسبهی گرادیان.
مفهوم
سه مولفهی اصلی
Actor : generates a trajectory (ReAct-style loop)
Evaluator : scores the trajectory — binary, heuristic, or self-eval
Self-Reflector: writes a natural-language reflection on the failure
به علاوهی یک ساختار داده:
Episodic memory: list of prior reflections, prepended to the next trial's prompt
در هر دور، Actor اجرا میشود. Evaluator به آن امتیاز میدهد. اگر امتیاز پایین باشد، Self-Reflector یک بازاندیشی میسازد («من ابزار اشتباهی انتخاب کردم چون صورت مسئله را اشتباه خواندم و فکر کردم در مورد X میپرسد، در حالی که دربارهی Y بود»). این بازاندیشی داخل حافظهی رویدادی میرود. تلاش بعدی از صفر شروع میشود، اما بازاندیشی قبلی را میبیند.
سه نوع ارزیاب
- اسکالر (Scalar) — یک سیگنال باینری بیرونی. ALFWorld موفق میشود یا شکست میخورد؛ تستهای HumanEval پاس میشوند یا رد. سادهترین شیوه با بالاترین کیفیت سیگنال.
- هیوریستیک (Heuristic) — الگوهای شکست از پیش تعیینشده. «اگر ایجنت یک اقدام یکسان را دو بار پشت سر هم تکرار کرد، به عنوان قفلشده (Stuck) علامت بزن.» «اگر مسیر بیش از 50 گام شد، آن را به عنوان ناکارآمد مشخص کن.»
- خودارزیاب (Self-evaluated) — خودِ مدل زبانی به مسیر رفتاریاش امتیاز میدهد. زمانی استفاده میشود که دادهی واقعی (Ground truth) در دسترس نیست. سیگنال ضعیفتری دارد؛ برای همین ترکیب آن با اعتبارسنجی مبتنی بر ابزار بسیار خوب جواب میدهد (درس 05 — CRITIC).
رویکرد پیشفرض سال 2026 ترکیبی است: استفاده از اسکالر در صورت در دسترس بودن، خودارزیابی در صورت نبود آن، و بهکارگیری هیوریستیکها به عنوان ریل ایمنی (Guardrail).
چرا این الگو تعمیمپذیر است؟
Reflexion بیش از آنکه یک الگوریتم جدید باشد، یک الگوی شناختهشده است. تقریباً همهی ایجنتهای خودترمیمشونده (Self-healing) در پروداکشن نسخهای از آن را اجرا میکنند:
- محاسبات در زمان استراحت Letta (درس 08): ایجنت جداگانهای روی مکالمات گذشته بازاندیشی انجام میدهد و خروجی را در بلوکهای حافظه مینویسد.
- الگوی
CLAUDE.md/ «save memory» در Claude Code: بازاندیشیها به عنوان یادگیری ثبت میشوند و در نشستهای آینده به ابتدای زمینه افزوده میشوند. - دستور
/learn-ruleدر pro-workflow: اصلاحات در قالب قواعد صریح ثبت میشوند. - گرههای بازاندیشی (Reflection nodes) در LangGraph: گرهی که خروجی را میسنجد و در صورت نیاز، مسیر را برای بازبینی (Refine) هدایت میکند.
همهی اینها از یک اصل نشئت میگیرند: زبان طبیعی واسطهای به اندازهی کافی غنی برای انتقالِ «آنچه از شکست یاد گرفتم» میان دفعات اجراست.
زمان کاربرد و نقاط شکست
Reflexion در شرایط زیر موفق است:
- سیگنال شکست واضح باشد (رد شدن تست، خطای ابزار، پاسخ غلط).
- دستهی تسک تکرارپذیر باشد (امکان طرح دوبارهی همان سبک سوال وجود داشته باشد).
- این بازاندیشی فضای کافی برای بهبود مسیر بعدی را داشته باشد (بودجهی اقدامِ کافی).
Reflexion در موارد زیر کمکی نمیکند:
- ایجنت همان بار اول با موفقیت کار را تمام کند.
- عامل شکست بیرونی باشد (قطعی شبکه، خراب بودن ابزار) — بازاندیشی دربارهی اینکه «شبکه قطع بود» کمکی به اجراهای بعدی نمیکند.
- بازاندیشی تبدیل به خرافه شود — یعنی ثبت یک روایت دربارهی یک اجرای اتفاقی و ناپایدار.
دام رایج در سال 2026: فساد حافظه (Memory rot). بازاندیشیها روی هم انباشته میشوند؛ برخی قدیمی یا اشتباه هستند؛ با بزرگ شدن بافر رویدادی، سرعت اجرای مجدد کند میشود. راهحل: فشردهسازی دورهای (درس 06)، استفاده از TTL برای بازاندیشیها، یا استفاده از یک ایجنت پاککننده در زمان استراحت (مثل Letta).
پیادهسازی از صفر
فایل code/main.py الگوی Reflexion را روی یک مسئلهی ساده پیاده میکند: تولید یک لیست 3 عنصری که جمع آنها برابر با یک عدد هدف شود. کنشگر لیستهای پیشنهادی را میدهد؛ ارزیاب حاصلجمع را میسنجد؛ و بازاندیش یک خط دربارهی علت اشتباه مینویسد. این بازاندیشی برای تلاش بعدی به حافظهی رویدادی فرستاده میشود.
مولفهها:
Actor— یک خطمشی کدنویسیشده که با دیدن بازاندیشیها بهبود پیدا میکند.Evaluator.binary()— تعیین قبولی/رد بر اساس عدد هدف.SelfReflector— یک تشخیص تکخطی از علت شکست تولید میکند.EpisodicMemory— یک لیست محدود همراه با منطق TTL.
اجرای برنامه:
python3 code/main.py
ردگیری محاسبات (Trace)، سه تلاش را نمایش میدهد. تلاش 1 با شکست مواجه میشود، یک بازاندیشی ذخیره میشود، تلاش 2 بازاندیشی را میبیند و عملکرد بهتری دارد اما هنوز رد میشود، تلاش 3 به موفقیت میرسد. این را با یک اجرای خط مبنا (بدون بازاندیشی) مقایسه کنید — در پاسخِ تلاش 1 درجا میزند.
استفاده از ابزارهای واقعی
فریمورک LangGraph الگوی بازاندیشی را در قالب یک گره (Node) عرضه میکند. دستور /memory در Claude Code و دستور /learn-rule در pro-workflow، بافر رویدادی را در قالب یک فایل Markdown برونسپاری میکنند. محاسبات زمان استراحت در Letta بخش Self-Reflector را در زمان بیکاری سیستم اجرا میکند تا تاخیر ایجنت اصلی بالا نرود. پکیج OpenAI Agents SDK هنوز Reflexion را به شکل مستقیم ندارد؛ برای پیادهسازی آن باید یک گاردریل سفارشی بنویسید که مسیرها را بر اساس امتیاز رد کند و از یک سشن حافظه (Session) کمک بگیرید که در طول اجراهای مختلف پابرجا بماند.
خروجی این درس
فایل outputs/skill-reflexion-buffer.md یک بافر رویدادی میسازد و نگهداری میکند که قابلیت ثبت بازاندیشی، اعمال TTL و حذف دادههای تکراری را دارد. این بافر بر اساس دستهی تسک و نوع شکست رخداده، بازاندیشی مفیدی ارائه میدهد که عملاً به تلاش بعدی کمک میکند (نه توصیههای کلیشهای مثل «بیشتر دقت کن»).
تمرینها
- ارزیاب را از حالت باینری به اسکالری تغییر دهید که معیار فاصله (میزان اختلاف تا هدف) را برمیگرداند. آیا سرعت همگرایی بهتر میشود؟
- یک TTL به اندازهی 10 بار تلاش برای بازاندیشیها بگذارید. آیا بازاندیشیهای قدیمیتر بعد از آن نقطه به عملکرد آسیب میزنند یا کمک میکنند؟
- یک ارزیاب هیوریستیک پیاده کنید: اگر یک اقدام تکرار شد، آن تلاش را به عنوان قفلشده علامت بزنید. این بخش چطور با Self-Reflector تعامل میکند؟
- مدل Reflexion را با یک Actor رقابتی و متخاصم (Adversarial) که بازاندیشیها را نادیده میگیرد اجرا کنید. حداقل مهندسی پرامپت لازم برای وادار کردن Actor به دیدن آنها چیست؟
- بخش 4 از مقالهی Reflexion دربارهی AlfWorld را بخوانید. افزایش 130 درصدی نرخ موفقیت را از نظر مفهومی بازتولید کنید: تفاوت کلیدی این روش با ReAct معمولی چیست؟
اصطلاحات کلیدی
| اصطلاح | در گفتوگوها | معنای دقیق فنی |
|---|---|---|
| Reflexion | «خوداصلاحی» | شین و همکاران 2023 — شامل Actor، Evaluator، Self-Reflector به اضافهی حافظهی رویدادی |
| Verbal reinforcement | «یادگیری بدون گرادیان» | قرار دادن بازاندیشی به زبان طبیعی در ابتدای پرامپتِ تلاش بعدی |
| Episodic memory | «بازاندیشیهای هر تسک» | بافر محدودی از بازاندیشیهای پیشین برای یک دستهی مشخص از تسک |
| Scalar evaluator | «سیگنال موفقیت باینری» | مقدار قبولی/رد یا امتیاز عددی برآمده از دادهی واقعی |
| Heuristic evaluator | «تشخیصدهندهی مبتنی بر الگو» | الگوهای شکستِ از پیش تعیینشده (مانند حلقهی تکرار، گامهای بیش از حد) |
| Self-evaluator | «مدل زبانی در نقش داور روی ردگیری خود» | گزینهی پشتیبان با سیگنال ضعیفتر در زمان نبود دادهی واقعی — قابل ترکیب با اعتبارسنجی مبتنی بر ابزار |
| Memory rot | «بازاندیشیهای تاریخگذشته» | پر شدن بافر رویدادی از ورودیهای منسوخ؛ حلشده به کمک فشردهسازی/TTL |
| Sleep-time reflection | «بازاندیشی ناهمگام» | اجرای Self-Reflector خارج از مسیر بحرانی (Hot path) تا ایجنت اصلی سریع بماند |
برای مطالعهی بیشتر
- مقالهی اصلی Reflexion: Language Agents with Verbal Reinforcement Learning (arXiv:2303.11366) اثر شین و همکاران
- مقالهی وبلاگ Letta دربارهی Sleep-time Compute — بازاندیشی ناهمگام در محیط پروداکشن
- راهنمای Anthropic: مهندسی بافتار موثر برای ایجنتهای هوش مصنوعی — مدیریت بافر رویدادی به عنوان بخشی از بافتار
- مستندات LangGraph — الگوی گرهی بازاندیشی
