ReAct Prompting چیست؟
تفکر + اقدام در AI

تکنیکی که Chain-of-Thought را با ابزار خارجی ترکیب می‌کند و قلب همه‌ی AI Agentهای امروزی است. راهنمای کامل از مقاله‌ی اصلی Yao 2022 تا کاربرد در ۱۴۰۵.

ReAct مخفف Reasoning + Acting است. در ۲۰۲۲ مقاله‌ای از Yao و همکاران منتشر شد که نشان داد اگر مدل زبانی به‌جای فقط «فکر کردن» (مثل Chain-of-Thought)، بتواند بین فکر و اقدام جابه‌جا شود، در مسائل دنیای واقعی ۳۴ درصد بهتر از baseline عمل می‌کند. این تکنیک قلب همه‌ی AI Agentهای امروزی است.

ReAct Prompting چیست؟

ReAct (تلفظ: ری‌اَکت، مخفف Reasoning + Acting) یک تکنیک پرامپت‌نویسی است که به مدل زبانی اجازه می‌دهد بین «فکر کردن» و «اقدام در دنیای بیرونی» جابه‌جا شود. این تکنیک اولین‌بار در مقاله‌ی پژوهشی «ReAct: Synergizing Reasoning and Acting in Language Models» توسط Shunyu Yao و همکارانش از دانشگاه Princeton و Google Research در اکتبر ۲۰۲۲ معرفی شد.

تفاوت کلیدی ReAct با Chain-of-Thought این است: در CoT مدل فقط درون ذهن خودش فکر می‌کند، در ReAct مدل می‌تواند ابزار خارجی صدا کند (جستجوی Wikipedia، API هواشناسی، ماشین‌حساب، دیتابیس) و نتیجه را در استدلال بعدی استفاده کند.

چرا ReAct به وجود آمد؟

قبل از ReAct دو مشکل اساسی وجود داشت:

  1. Chain-of-Thought تنها → توهم می‌سازد: مدل وقتی اطلاعات ندارد، شروع می‌کند به «حدس زدن» با لحن قاطع. در تست HotpotQA، مدل برای سؤالات حقیقی اطلاعات اشتباه تولید می‌کرد.
  2. Action-only (فقط ابزار، بدون فکر) → برنامه‌ریزی ضعیف: اگر مدل فقط بدون استدلال ابزار صدا کند، در مسائل چندمرحله‌ای گیج می‌شود و نمی‌تواند بفهمد قدم بعدی چیست.

ReAct این دو را ترکیب کرد: مدل ابتدا فکر می‌کند چه کاری باید بکند، سپس اقدام می‌کند، سپس مشاهدهی نتیجه را تحلیل می‌کند و دوباره فکر می‌کند. این حلقه تا رسیدن به جواب نهایی ادامه می‌یابد.

نکته‌ی کلیدی: ReAct یک الگوی پرامپتی است، نه قابلیت مدل. یعنی روی هر مدل زبانی (GPT-4، Claude، Gemini، حتی Llama محلی) قابل پیاده‌سازی است. این آن را از Function Calling که قابلیت سطح API است، متمایز می‌کند.

چرا ReAct امروز هم مهم است؟

با وجود ظهور مدل‌های reasoning مانند OpenAI o1، DeepSeek R1 و Claude 3.7 Sonnet که خودشان CoT را درونی‌سازی کرده‌اند، ReAct همچنان الگوی غالب در framework های agent است:

  • LangChain — agentهای zero-shot-react-description و conversational-react-description
  • LlamaIndex — agent ReActAgent
  • CrewAI — multi-agent orchestration با الگوی ReAct
  • AutoGen — agentهای مایکروسافت

دلیلش ساده است: مدل‌های reasoning فقط بخش «فکر کردن» را خودکار کرده‌اند. برای ابزار خارجی همچنان به الگوی ReAct (یا Function Calling) نیاز داریم.

حلقه‌ی Thought / Action / Observation

قلب ReAct یک حلقه‌ی سه‌مرحله‌ای است که به آن TAO loop (یا Thought-Action-Observation loop) گفته می‌شود:

مرحله مدل چه می‌کند نمونه
Thought (فکر) تحلیل وضعیت، تصمیم درباره قدم بعدی «برای پاسخ به این سؤال، اول باید جمعیت تهران را پیدا کنم»
Action (اقدام) صدا زدن یک ابزار با آرگومان مشخص Search["جمعیت تهران ۱۴۰۵"]
Observation (مشاهده) دریافت نتیجه از محیط (نه از خود مدل) «جمعیت تهران در سرشماری ۱۴۰۲: حدود ۹.۳ میلیون نفر»

این چرخه تکرار می‌شود تا مدل به جواب نهایی برسد و Action: Finish[جواب] بزند.

قالب پرامپت ReAct (کد قابل‌کپی)

این یک system prompt مینیمال است که می‌توانید همین الان روی Claude یا GPT-4 امتحان کنید:

قالب پرامپت ReAct فارسی
You are a helpful assistant that uses the ReAct format.
For every user question, follow this loop:

Thought: [your reasoning about what to do next]
Action: [one of: Search[query], Calculate[expression], Finish[answer]]
Observation: [result will be provided here]

Repeat until you have enough information.
Then output: Action: Finish[final answer]

Example:
Question: پایتخت ایران چه جمعیتی دارد؟
Thought: من باید جمعیت تهران را پیدا کنم.
Action: Search[جمعیت تهران ۱۴۰۲]
Observation: حدود ۹.۳ میلیون نفر
Thought: حالا جواب را دارم.
Action: Finish[تهران، پایتخت ایران، حدود ۹.۳ میلیون نفر جمعیت دارد.]
توجه مهم: در پیاده‌سازی واقعی، شما (یا framework مثل LangChain) باید قبل از فرستادن دوباره‌ی پرامپت به مدل، خط Observation: را با نتیجه‌ی واقعی پر کنید. اگر این کار را نکنید، مدل شروع به توهم Observation می‌کند یعنی جواب جستجو را از ذهن خودش می‌سازد، که هدف ReAct را نقض می‌کند.

۸ نوع Thought در یک agent خوب

بر اساس دوره‌ی Agents هاگینگ‌فیس، یک Thought می‌تواند نقش‌های متفاوتی داشته باشد:

نوع Thought کاربرد نمونه فارسی
Planning تقسیم کار به مراحل «باید اول قیمت دلار، بعد قیمت بیت‌کوین، بعد محاسبه کنم»
Analysis تحلیل observation قبلی «نتیجه ۹.۳ میلیون است که با گزارش ۱۴۰۲ همخوانی دارد»
Decision Making انتخاب بین چند گزینه «چون بودجه محدوده، ابزار رایگان را پیشنهاد می‌دهم»
Problem Solving یافتن راه‌حل برای مانع «جستجو خطا داد، با کلمه‌ی متفاوت دوباره امتحان می‌کنم»
Memory Integration یادآوری context قبلی «کاربر قبلاً گفت در شیراز است، پس اطلاعات منطقه‌ای می‌دهم»
Self-Reflection بازنگری استراتژی «دو بار جستجو ناموفق بود، روش متفاوتی امتحان می‌کنم»
Goal Setting تعیین هدف میانی «برای پاسخ کامل، باید سه منبع متفاوت چک کنم»
Prioritization اولویت‌بندی اقدامات «اطلاعات فنی مهم‌تر است، اول آن را می‌گیرم»

مثال واقعی از مقاله‌ی اصلی

مشهورترین مثال در مقاله‌ی Yao 2022 از benchmark HotpotQA است. سؤال این بود:

What is the elevation range for the area that the eastern sector of the Colorado orogeny extends into?
«محدوده‌ی ارتفاع منطقه‌ای که بخش شرقی Colorado orogeny به آن گسترش می‌یابد، چقدر است؟»

این سؤال «multi-hop» است — برای پاسخ، اول باید بفهمی Colorado orogeny چیست، بعد بفهمی بخش شرقی‌اش کجاست، بعد ارتفاع آن منطقه را پیدا کنی. ببینیم سه روش متفاوت چطور برخورد می‌کنند:

روش ۱: پاسخ مستقیم (Standard Prompting)

❌ نتیجه
Answer: 3,000 ft تا 14,000 ft ← اشتباه (مدل از خودش حدس زد)

روش ۲: Chain-of-Thought

⚠️ نتیجه
Thought: Colorado orogeny شامل کوه‌های راکی است.
بخش شرقی به Great Plains می‌رسد.
Great Plains ارتفاع حدود 1,800 ft دارد.
Answer: 1,800 to 14,000 ft
هنوز اشتباه — مدل بخشی را حدس زد چون اطلاعات دقیق نداشت.

روش ۳: ReAct (روش برنده)

✅ نتیجه: 1,800 to 7,000 ft (درست!)
Thought 1: I need to search Colorado orogeny, find the area that
the eastern sector extends into, then find the elevation range.

Action 1: Search[Colorado orogeny]

Observation 1: The Colorado orogeny was an episode of mountain
building (an orogeny) in Colorado and surrounding areas.

Thought 2: It does not mention the eastern sector. So I need to
look up eastern sector.

Action 2: Lookup[eastern sector]

Observation 2: The eastern sector extends into the High Plains
and is called the Central Plains orogeny.

Thought 3: The eastern sector of Colorado orogeny extends into
the High Plains. So I need to search High Plains elevation.

Action 3: Search[High Plains]

Observation 3: High Plains refers to one of two distinct land
regions. The High Plains rise in elevation from around 1,800 to
7,000 ft.

Thought 4: High Plains rise in elevation from 1,800 to 7,000 ft,
so the answer is 1,800 to 7,000 ft.

Action 4: Finish[1,800 to 7,000 ft]
درس کلیدی: ReAct با سه جستجوی متوالی به جواب دقیق رسید. هیچ توهمی نکرد چون هر ادعا را با Wikipedia تأیید کرد. این تفاوت بین «فکر کردن در خلأ» و «فکر کردن با تماس با واقعیت» است.

ReAct در برابر Chain-of-Thought

این دو تکنیک اغلب با هم اشتباه گرفته می‌شوند. تفاوت‌شان حیاتی است چون هر کدام برای نوع متفاوتی از مسائل مناسب‌اند:

ویژگی Chain-of-Thought ReAct
منبع اطلاعات فقط دانش درونی مدل دانش درونی + ابزار خارجی
تعداد تماس با مدل یک تماس واحد چند تماس در یک حلقه
ریسک توهم (Hallucination) بالا (مدل حدس می‌زند) پایین (واقعیت چک می‌شود)
سرعت پاسخ سریع (یک‌بار) کندتر (چند بار)
هزینه (token) کم بیشتر (n برابر)
بهترین برای منطق، ریاضی، تحلیل متن جستجو، API، تعامل با دنیا
عملکرد در Fever پایین‌تر بهتر از CoT
عملکرد در HotpotQA کمی بهتر کمی پایین‌تر (ولی ReAct+CoT بهترین)

چه موقع کدام را انتخاب کنم؟

یک قانون ساده برای تصمیم‌گیری:

  • اگر سؤال درون‌ذهنی است (حساب کن ۱۵ ضرب در ۲۳، این کد را debug کن، این جمله را خلاصه کن) ← CoT کافی است.
  • اگر سؤال نیاز به اطلاعات تازه دارد (قیمت دلار امروز، آخرین خبر، اطلاعات کاربر خاص) ← ReAct لازم است.
  • اگر سؤال هم استدلال پیچیده می‌خواهد هم اطلاعات بیرونیReAct + CoT ترکیبی بهترین جواب می‌دهد (به‌ویژه با مدل‌های reasoning).
نکته‌ی مهم برای ۱۴۰۵: مدل‌های جدید reasoning مثل o1، o3 و DeepSeek R1 کار CoT را خودشان داخلی انجام می‌دهند. این یعنی شما دیگر نباید «Let's think step by step» را به آن‌ها بدهید (ضد بهره‌ور است). اما برای ReAct (یعنی صدا زدن ابزار)، همچنان نیاز به الگوی صریح دارید یا باید از Function Calling استفاده کنید.

ReAct در برابر Function Calling

این مهم‌ترین مقایسه‌ی عملی است که هر agent builder باید بفهمد. خیلی‌ها فکر می‌کنند Function Calling «جایگزین» ReAct شده است. حقیقت ظریف‌تر است.

ویژگی ReAct (الگوی پرامپتی) Function Calling (قابلیت مدل)
سطح روی پرامپت سوار می‌شود درون خود مدل تعبیه شده
قالب خروجی متن آزاد با کلیدواژه JSON ساخت‌یافته
قابلیت اطمینان parsing گاهی اشتباه می‌شود تضمین‌شده
سازگاری هر مدل (حتی Llama محلی) فقط مدل‌های پشتیبانی‌کننده
هزینه implementation پایین (فقط پرامپت) متوسط (تعریف schema)
انعطاف‌پذیری بالا — هر چیزی محدود به schema تعریف‌شده
توهم اقدام ممکن (مدل ابزار ناموجود بسازد) غیرممکن (فقط ابزار تعریف‌شده)

کی کدام را انتخاب کنم؟

یک تصمیم‌گیری ساده:

  • Function Calling انتخاب کن اگر: از GPT-4، Claude 3+، Gemini یا Llama 3+ استفاده می‌کنی، تعداد ابزارها مشخص و محدود است، نیاز به قابلیت اطمینان production داری.
  • ReAct انتخاب کن اگر: از مدل بدون پشتیبانی function calling استفاده می‌کنی (مدل‌های open-source قدیمی، مدل فارسی سفارشی)، می‌خواهی منطق agent را کاملاً کنترل کنی، یا روی مفاهیم آموزشی کار می‌کنی.
  • ترکیب: ReAct + Function Calling: در framework های مدرن مثل LangChain، الگوی ReAct را با Function Calling زیرین ترکیب می‌کنند — بهترین هر دو دنیا.
اشتباه رایج: خیلی‌ها فکر می‌کنند Function Calling = ReAct. نه. Function Calling یک قابلیت است، ReAct یک الگو. می‌توانید Function Calling داشته باشید بدون الگوی ReAct (فقط یک تماس، یک ابزار، تمام). و می‌توانید ReAct داشته باشید بدون Function Calling (پارس کردن text آزاد).

اعداد واقعی benchmarkها

این بخش مهم است چون خیلی از مقالات فارسی فقط می‌گویند «ReAct بهتر است» بدون اینکه عدد بدهند. در مقاله‌ی اصلی، چهار benchmark استفاده شد:

Benchmark نوع کار ReAct vs بهترین baseline نتیجه
HotpotQA پرسش‌وپاسخ چندمرحله‌ای کمی پایین‌تر از CoT تنها ReAct+CoT بهترین
Fever راستی‌آزمایی حقایق بهتر از CoT پیروزی ReAct
ALFWorld بازی متنی (خانه) +۳۴٪ نسبت به baseline پیروزی قاطع
WebShop خرید آنلاین شبیه‌سازی‌شده +۱۰٪ با فقط ۱-۲ مثال پیروزی روشن

نتایج پژوهش‌های جدیدتر

در ۲۰۲۶ مقاله‌ای از arXiv منتشر شد که نشان داد:

  • استدلال کوتاه (۳۲ توکن) دقت را تا +۴۵٪ نسبت به پاسخ مستقیم بهبود می‌دهد
  • استدلال طولانی (۲۵۶+ توکن) برعکس، عملکرد را پایین‌تر از baseline می‌برد
  • یعنی Thought باید مختصر و هدفمند باشد، نه مونولوگ طولانی

این یافته‌ی critical برای ۱۴۰۵ است: «هرچه فکر بیشتر، بهتر» دیگر صادق نیست. Thoughtهای مختصر و عمل‌محور بهتر از مونولوگ‌های فلسفی هستند.

سه مثال فارسی کاربردی

این بخش جایی است که بیشتر مقالات فارسی کم می‌آورند. این سه نمونه را خودم در پروژه‌های فارسی تست کرده‌ام:

مثال ۱: مشاور خرید با اطلاعات قیمت روز

سؤال کاربر: «یه گوشی زیر ۳۰ میلیون تومان پیشنهاد بده که برای عکاسی خوب باشه.»

زنجیره‌ی ReAct
Thought: کاربر بودجه ۳۰ میلیون داره و عکاسی مهمه.
باید قیمت روز چند گوشی محبوب رو چک کنم.

Action: Search[قیمت Samsung Galaxy A55 ترب امروز]
Observation: حدود ۲۴ میلیون تومان

Action: Search[قیمت iPhone 13 ترب امروز]
Observation: حدود ۴۲ میلیون تومان

Action: Search[قیمت Pixel 8a دیجی‌کالا]
Observation: حدود ۲۹ میلیون تومان

Thought: iPhone خارج از بودجه‌ست.
A55 و Pixel 8a در محدوده‌ان. باید کیفیت دوربین رو مقایسه کنم.

Action: Search[Galaxy A55 vs Pixel 8a camera comparison]
Observation: Pixel 8a در عکاسی شب و HDR بهتر، A55 در ویدیو 4K بهتر.

Action: Finish[برای عکاسی، Pixel 8a (۲۹ میلیون) را پیشنهاد می‌کنم...]

چرا ReAct اینجا برنده است: هیچ مدلی قیمت لحظه‌ای ترب را در حافظه ندارد. بدون جستجو، مدل قیمت‌های منقضی‌شده می‌دهد. ReAct اطلاعات تازه را با تحلیل ترکیب می‌کند.

مثال ۲: دستیار سفارش پزشکی

سؤال کاربر: «داروی Metformin رو با یه قرص دیگه که برای فشار خون می‌خورم تداخل داره؟»

زنجیره‌ی ReAct
Thought: کاربر اسم داروی فشار خون رو نگفته. باید بپرسم.

Action: AskUser[اسم دقیق داروی فشار خون شما چیست؟]
Observation: کاربر گفت: Losartan 50mg

Action: Search[Metformin Losartan interaction drugbank]
Observation: تداخل خفیف. هر دو می‌توانند با هم استفاده شوند
ولی نیاز به پایش قند خون و فشار خون است.

Action: Search[Metformin Losartan farsi pharmacist warning]
Observation: داروسازی ایران: بدون منع، با تأیید پزشک.

Thought: اطلاعات کافی دارم. اما باید توصیه‌ی قطعی ندم،
چون درمان شخصی است.

Action: Finish[این دو دارو تداخل خطرناک ندارند ولی
حتماً با پزشک خودتان مشورت کنید چون...]

چرا ReAct اینجا برنده است: دو نوع Action دیدید: AskUser (پرسش از کاربر برای جزئیات) و Search (دانش پزشکی). agent خوب وقتی اطلاعات کافی ندارد، می‌داند که بپرسد، نه حدس بزند.

مثال ۳: تحلیل‌گر مالی کسب‌وکار

سؤال کاربر: «اگه ۱۰۰ میلیون رو ۳ ماه پیش طلا خریده بودم، الان چقدر سود کرده بودم؟»

زنجیره‌ی ReAct
Thought: ۳ ماه پیش یعنی حدود ۳ اسفند ۱۴۰۴.
باید قیمت طلا اون روز و امروز رو پیدا کنم.

Action: Search[قیمت طلا ۳ اسفند ۱۴۰۴]
Observation: مثقال طلا حدود ۸۲ میلیون تومان

Action: Search[قیمت طلا امروز ۳ خرداد ۱۴۰۵]
Observation: مثقال طلا حدود ۹۸ میلیون تومان

Thought: ۱۰۰ میلیون تومان در ۸۲ یعنی 1.22 مثقال.
1.22 × 98 = 119.5 میلیون. سود = 19.5 میلیون.

Action: Calculate[(100/82) * 98 - 100]
Observation: 19.51

Action: Finish[اگه ۱۰۰ میلیون رو ۳ ماه پیش طلا می‌خریدی،
الان حدود ۱۱۹.۵ میلیون داشتی — یعنی ۱۹.۵ میلیون سود
(تقریباً ۱۹.۵٪ بازدهی در ۳ ماه).]

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

پیاده‌سازی ReAct با LangChain

LangChain ساده‌ترین راه برای استفاده از ReAct در production است. این یک agent ReAct کامل با دو ابزار است که در ۱۵ خط پایتون اجرا می‌شود:

کد LangChain برای agent ReAct (Python)
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_react_agent
from langchain_community.tools import DuckDuckGoSearchRun
from langchain.tools import Tool
from langchain import hub

# 1. مدل
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)

# 2. ابزارها
search = DuckDuckGoSearchRun()
calc = Tool(
    name="Calculator",
    func=lambda x: str(eval(x)),
    description="Useful for math. Input: a math expression."
)
tools = [search, calc]

# 3. پرامپت آماده ReAct از LangChain Hub
prompt = hub.pull("hwchase17/react")

# 4. ساخت agent و executor
agent = create_react_agent(llm, tools, prompt)
executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,
    max_iterations=5,  # جلوگیری از حلقه بی‌نهایت
    handle_parsing_errors=True
)

# 5. اجرا
result = executor.invoke({
    "input": "قیمت طلا امروز چنده؟ اگه ۱۰ گرم بخرم چقدر می‌شه؟"
})
print(result["output"])

۴ پارامتر critical در AgentExecutor

پارامتر مقدار پیشنهادی چرا
max_iterations ۳ تا ۷ جلوی حلقه بی‌نهایت را می‌گیرد
handle_parsing_errors True اگر خروجی مدل قالب اشتباه داشت، خطا نده — به مدل بگو دوباره امتحان کند
early_stopping_method "generate" وقتی max_iterations رسید، یک خروجی نهایی تولید کن نه error
verbose True در dev، False در production برای debug خیلی مفید است
جایگزین مدرن: در ۲۰۲۵، LangChain تیم خودش create_react_agent را با create_tool_calling_agent جایگزین کرد چون Function Calling قابل‌اعتمادتر است. ReAct کلاسیک هنوز برای مدل‌های بدون function calling (مثل مدل‌های open-source قدیمی، مدل‌های فارسی محلی) ضروری است.

۶ دام رایج + راه‌حل

این بخش جایی است که agent builderهای تازه‌کار وقت می‌سوزانند. این ۶ مورد را خودم در پروژه‌های واقعی دیده‌ام:

۱. حلقه‌ی بی‌نهایت (Infinite Loop)

چه می‌شود: مدل یک Action تکرار می‌کند، Observation همان است، دوباره Action، دوباره Observation… برای ساعت‌ها.

راه‌حل:

  • max_iterations=5 در AgentExecutor
  • تشخیص تکرار: اگر همان Action دوبار صدا زده شد، agent را متوقف کن
  • هزینه monitoring با ابزار مثل Langsmith

۲. توهم اقدام (Hallucinated Action)

چه می‌شود: مدل یک ابزار غیرموجود می‌سازد. مثلاً Action: SendEmail[user@example.com, ...] در حالی که ابزار SendEmail تعریف نشده.

راه‌حل:

  • محدود کردن گرامر در پرامپت: «فقط از این ابزارها استفاده کن: [Search, Calculate, Finish]»
  • Validation در parser: اگر action name در لیست نبود، error بده
  • استفاده از Function Calling به‌جای ReAct متنی

۳. توهم Observation

چه می‌شود: اگر در پیاده‌سازی فراموش کنید Observation واقعی را برگردانید، مدل خودش Observation جعلی می‌سازد و فکر می‌کند جستجو موفق بوده.

راه‌حل:

  • همیشه قبل از فرستادن دوباره به مدل، خط Observation: را با مقدار واقعی پر کن
  • اگر ابزار خطا داد، Observation: Error: ... بفرست — نه چیزی

۴. Thoughtهای طولانی و فلسفی

چه می‌شود: مدل به‌جای تصمیم سریع، شروع به نوشتن مقاله می‌کند: «در نگاه کلی، می‌توان گفت که این مسئله چند بُعد دارد…»

راه‌حل:

  • در سیستم پرامپت بگو: «Thought باید حداکثر ۲ جمله باشد»
  • طبق پژوهش ۲۰۲۶ arXiv، Thoughtهای زیر ۳۲ توکن دقت را افزایش می‌دهد، بیش از ۲۵۶ توکن آن را کاهش می‌دهد

۵. وابستگی به کیفیت جستجو

چه می‌شود: اگر جستجو نتیجه‌ی بد بدهد (مثلاً موتور جستجو دستکاری‌شده)، کل زنجیره خراب می‌شود.

راه‌حل:

  • چند منبع جستجو متوالی (Google + DuckDuckGo + Bing)
  • ترکیب با RAG روی دیتابیس تأیید‌شده
  • اضافه کردن Thought نقد: «آیا این منبع قابل‌اعتماد است؟»

۶. هزینه‌ی توکن انفجاری

چه می‌شود: هر loop ReAct = یک تماس کامل با مدل + کل history. در پنج loop، ۵ برابر CoT هزینه می‌کنید.

راه‌حل:

  • مدل ارزان‌تر برای planning (Haiku) + مدل قوی برای جواب نهایی (Opus)
  • summarize کردن Observationهای قبلی
  • caching جواب جستجوهای تکراری
قانون طلایی production: ReAct را همیشه با max_iterations و timeout اجرا کن. هیچ‌وقت بدون این دو limit به agent اجازه نده آزاد بدود. حتی Anthropic در راهنمای رسمی‌اش این را تأکید می‌کند.

آینده‌ی ReAct در عصر o1 و R1

سؤال بزرگ ۱۴۰۵ این است: «حالا که مدل‌های reasoning مثل OpenAI o1، Claude 3.7 Sonnet thinking، DeepSeek R1 خودشان فکر می‌کنند، ReAct دیگر لازم است؟»

پاسخ کوتاه: بله، اما نقشش عوض شده.

مدل‌های reasoning بخش Thought را در training داخلی‌سازی کرده‌اند. آن‌ها بدون نیاز به «Let's think step by step»، خودشان قبل از پاسخ، یک زنجیره‌ی استدلال طولانی داخلی تولید می‌کنند که در توکن‌های <thinking> یا reasoning پنهان است.

اما این مدل‌ها نمی‌توانند ابزار خارجی صدا کنند مگر اینکه از الگوی ReAct (یا معادل آن) استفاده کنند. پس:

عصر نقش CoT نقش ReAct
۲۰۲۲-۲۰۲۴ (GPT-3.5, GPT-4) پرامپت صریح پرامپت صریح برای ابزار
۲۰۲۵-۲۰۲۶ (o1, R1, Sonnet thinking) درونی‌سازی شده همچنان لازم برای ابزار
آینده‌ی نزدیک درونی احتمالاً به‌صورت Function Calling خودکار

چه چیزی پس از ReAct می‌آید؟

تکنیک‌های جدیدتر که فراتر از ReAct ساده می‌روند:

  • Reflexion (2023) — agent خروجی خودش را نقد می‌کند و دوباره امتحان می‌کند
  • Plan-and-Execute — اول یک plan کامل بنویس، بعد گام‌به‌گام اجرا کن
  • Multi-Agent (CrewAI, AutoGen) — چند agent با نقش‌های متفاوت با هم کار می‌کنند
  • Hierarchical agents — یک agent مدیر، چند agent اجرایی

اما همه‌ی این‌ها هنوز روی ستون ReAct سوار شده‌اند. حلقه‌ی Thought-Action-Observation همچنان بنیان است.

می‌خواهی پرامپت‌نویسی پیشرفته را اصولی یاد بگیری؟

دوره جامع مهندسی پرامپت — از Few-shot تا ReAct و AI Agent، با ۵۸ جلسه و گروه پشتیبانی.

مشاهده سرفصل‌های دوره

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

ReAct Prompting چیست؟
ReAct (مخفف Reasoning + Acting) یک تکنیک پرامپت‌نویسی است که در مقاله‌ی Yao و همکاران در سال ۲۰۲۲ معرفی شد. در این روش، مدل زبانی به‌صورت متناوب بین «فکر کردن» (Thought)، «اقدام» (Action) و «مشاهده» (Observation) جابه‌جا می‌شود تا مسائل پیچیده‌ای را حل کند که نیاز به اطلاعات بیرونی دارند.
تفاوت ReAct با Chain-of-Thought چیست؟
Chain-of-Thought فقط استدلال درونی مدل را به‌صورت گام‌به‌گام بیرون می‌کشد. ReAct علاوه بر استدلال، به مدل اجازه می‌دهد ابزار خارجی (مثل جستجوی Wikipedia، ماشین‌حساب، API) صدا کند و نتیجه را در استدلال بعدی استفاده کند. CoT یک تماس واحد است، ReAct یک حلقه‌ی چندمرحله‌ای.
ReAct چقدر بهتر از Chain-of-Thought عمل می‌کند؟
بستگی به نوع کار دارد. در benchmark Fever (راستی‌آزمایی) ReAct از CoT بهتر است. در HotpotQA (پرسش‌وپاسخ چندمرحله‌ای) CoT تنهایی بهتر است، اما ترکیب ReAct+CoT بالاترین دقت را می‌دهد. در محیط‌های تعاملی مانند ALFWorld، ReAct ۳۴ درصد بهتر از baseline عمل می‌کند و در WebShop ۱۰ درصد بهتر.
آیا با مدل‌های جدید مثل o1 و DeepSeek R1 هنوز ReAct لازم است؟
بله، اما نقشش عوض شده. مدل‌های reasoning مثل o1 و DeepSeek R1 خودشان CoT را درونی‌سازی کرده‌اند، پس بخش «استدلال» را خودشان انجام می‌دهند. اما برای دسترسی به ابزار خارجی (جستجو، API، دیتابیس) همچنان نیاز به الگوی ReAct یا Function Calling داریم. ReAct در framework های agent مثل LangChain، LlamaIndex و CrewAI همچنان غالب است.
مهم‌ترین محدودیت‌های ReAct چیست؟
سه مشکل اصلی: یک، حلقه‌ی بی‌نهایت (infinite loop) که با تعیین max steps کنترل می‌شود. دو، توهم اقدام (hallucinated action) که با محدود کردن گرامر و لیست ابزار حل می‌شود. سه، وابستگی به کیفیت بازیابی (retrieval quality) که اگر جستجو نتیجه‌ی بد بدهد، کل زنجیره خراب می‌شود.
چطور ReAct را در ChatGPT یا Claude به‌صورت دستی استفاده کنم؟
می‌توانید با system prompt مدل را وادار کنید قالب Thought/Action/Observation را رعایت کند، سپس به‌جای ابزار واقعی، خودتان به‌عنوان «environment» جواب Observation را در پاسخ بعدی وارد کنید. این رویکرد برای یادگیری مفهوم عالی است اما در production باید از framework مثل LangChain یا Function Calling خود مدل استفاده کنید.
ReAct با Function Calling چه فرقی دارد؟
Function Calling قابلیت سطح مدل است که OpenAI و Anthropic ارائه می‌دهند: مدل به‌جای text آزاد، یک JSON ساخت‌یافته برمی‌گرداند که می‌گوید کدام تابع را با چه آرگومان‌هایی فراخوانی کن. ReAct یک الگوی پرامپتی است که می‌تواند روی هر مدلی پیاده شود. Function Calling قابل‌اعتمادتر است اما ReAct انعطاف بیشتری دارد و در مدل‌های بدون پشتیبانی native function calling هم کار می‌کند.

جمع‌بندی

نکات کلیدی این مقاله

  • ReAct = Reasoning + Acting، معرفی‌شده در مقاله‌ی Yao 2022 (arXiv:2210.03629)
  • قلب الگو: حلقه‌ی Thought → Action → Observation تا رسیدن به Finish
  • برای سؤالات نیازمند اطلاعات تازه ضروری است، برای منطق پاک CoT کافی
  • ۳۴٪ بهبود در ALFWorld، ۱۰٪ در WebShop، پیروزی در Fever
  • در عصر o1 و R1 هنوز برای ابزار خارجی غالب است
  • دام اصلی: حلقه بی‌نهایت — حتماً max_iterations بگذار
  • Thoughtهای کوتاه (<۳۲ توکن) از طولانی (>۲۵۶ توکن) بهتر عمل می‌کنند
  • Function Calling نسخه‌ی production-ready ReAct است، اما الگو همان است

اگر یک کار از این مقاله برداری، این باشد: یک پرامپت ساده با قالب Thought/Action/Observation بنویس و در ChatGPT امتحان کن. همان لحظه حس می‌کنی چرا هر agent جدی روی این الگو ساخته شده. بعد از فهمیدن منطق، سراغ LangChain یا Function Calling برو.

متین لب‌خندق — مدرس دوره

متین لب‌خندق

برنامه‌نویس ارشد و متخصص هوش مصنوعی

مهندس هوش مصنوعی با ۱۰ سال تجربه برنامه‌نویسی و ۵ سال تخصص در AI. مدرس دوره جامع مهندسی پرامپت و متخصص ساخت AI Agentهای فارسی.

نویسنده: متین لب‌خندق — مهندس هوش مصنوعی با ۱۰ سال برنامه‌نویسی و ۵ سال تمرکز روی مدل‌های زبانی (LLM)؛ سازنده‌ی سیستم‌های واقعیِ production با ChatGPT، Claude و Gemini و بنیان‌گذار آکادمی متین لب‌خندق. مقاله‌ی پایه: راهنمای جامع مهندسی پرامپت.