روش ReAct (مخفف Reasoning and Acting) در پرامپت نویسی یک چارچوب ترکیبی است که به مدل‌های زبانی اجازه می‌دهد در یک چرخه پیوسته، هم استدلال کنند و هم با ابزارهای بیرونی تعامل داشته باشند. این روش، پایه‌ی سامانه‌های عامل‌محور (Agent-based Systems) مدرن است و به مدل‌ها اجازه می‌دهد به‌جای تولید پاسخ در یک گام، فرایند حل مسئله را گام‌به‌گام پیش ببرند. برای درک این چارچوب، ابتدا باید پیش‌نیاز آن یعنی زنجیره تفکر در پرامپت نویسی را بشناسیم و سپس لایه‌های تکاملی آن را تحلیل کنیم.

در پروژه‌هایی که به ساخت عامل‌های هوشمند نیاز داشتیم، روش ReAct یکی از مؤثرترین چارچوب‌ها برای ترکیب استدلال با اقدام بوده است. این روش به مدل اجازه می‌دهد به‌جای حدس زدن یا توهم زدن، اطلاعات موردنیاز خود را از منابع خارجی بگیرد و بر اساس آن تصمیم بگیرد. اگر با پرامپت نویسی برای عامل‌های هوشمند آشنایی دارید، آماده‌اید تا وارد جزئیات این چارچوب شوید.

روش ReAct دقیقاً چیست؟

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

  1. استدلال (Reasoning): مدل درباره وضعیت فعلی فکر می‌کند و یک گام بعدی را برنامه‌ریزی می‌کند.
  2. اقدام (Acting): مدل یک ابزار یا API را فراخوانی می‌کند تا اطلاعات یا عملیاتی را به دست آورد.

این چرخه تا رسیدن به پاسخ نهایی ادامه می‌یابد. در هر گام، مدل یک «اندیشه» (Thought) تولید می‌کند، سپس یک «اقدام» (Action) انتخاب می‌کند، سپس یک «مشاهده» (Observation) دریافت می‌کند و بر اساس آن، گام بعدی را برنامه‌ریزی می‌کند. این ساختار، مدل را از یک موجودیت منفعل به یک موجودیت فعال تبدیل می‌کند.

این روش اولین بار در مقاله‌ای با عنوان «ReAct: Synergizing Reasoning and Acting in Language Models» در سال ۲۰۲۲ معرفی شد و از آن زمان، به یکی از ستون‌های اصلی معماری عامل‌های هوشمند تبدیل شده است. نام این چارچوب، از ترکیب دو کلمه Reasoning (استدلال) و Acting (اقدام) گرفته شده است.

ReAct به مدل اجازه می‌دهد پیش از پاسخ دادن، اطلاعات موردنیاز خود را از جهان بیرونی بگیرد؛ همین ویژگی، دقت خروجی را به‌طور چشمگیری افزایش می‌دهد.

چرا این روش کار می‌کند؟

دلیل موفقیت روش ReAct را می‌توان در چند محور تحلیل کرد:

کاهش توهم (Hallucination)

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

تعامل با جهان بیرونی

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

تصمیم‌گیری گام‌به‌گام

در مسائل پیچیده، تصمیم‌گیری در یک گام می‌تواند به خطا منجر شود. روش ReAct تصمیم‌گیری را به گام‌های کوچک‌تر تقسیم می‌کند و در هر گام، بر اساس اطلاعات جدید تصمیم می‌گیرد. این ویژگی، دقت تصمیم‌گیری را افزایش می‌دهد.

قابلیت ردیابی

در روش ReAct، همه گام‌های استدلال و اقدام ثبت می‌شوند. این ویژگی، ردیابی مسیر رسیدن به پاسخ و اشکال‌زدایی را ساده‌تر می‌کند. برای جزئیات، پست اشکال‌زدایی پرامپت را ببینید.

ویژگیزنجیره تفکرروش ReAct
تعامل با ابزارندارددارد
دریافت اطلاعات بیرونیندارددارد
حلقه اجراتک‌گامچندگام
کاهش توهممحدودقابل‌توجه
پیچیدگی پیاده‌سازیپایینمتوسط

تفاوت ReAct با زنجیره تفکر

زنجیره تفکر (Chain of Thought یا CoT) یک تکنیک پرامپت نویسی است که از مدل می‌خواهد گام‌به‌گام استدلال کند. اما این استدلال در یک محیط بسته انجام می‌شود؛ مدل فقط بر اساس دانش داخلی خود پاسخ می‌دهد. روش ReAct این محدودیت را برطرف می‌کند و به مدل اجازه می‌دهد در طول استدلال، با جهان بیرونی تعامل کند.

به بیان دقیق‌تر، روش ReAct یک لایه عملیاتی بر روی CoT است. در این چارچوب:

  1. مدل یک اندیشه تولید می‌کند (Reasoning).
  2. مدل یک اقدام انتخاب می‌کند (Acting).
  3. مدل یک مشاهده دریافت می‌کند (Observation).
  4. چرخه تا رسیدن به پاسخ نهایی تکرار می‌شود.

این ساختار، روش ReAct را به یک چارچوب مناسب برای سامانه‌های عامل‌محور تبدیل می‌کند. در پست زنجیره تفکر در پرامپت نویسی، مبانی CoT به‌تفصیل بررسی شده است.

اجزای اصلی روش ReAct

روش ReAct از چهار جزء اصلی تشکیل می‌شود:

اندیشه (Thought)

در هر گام، مدل یک اندیشه تولید می‌کند. این اندیشه، وضعیت فعلی و گام بعدی را توصیف می‌کند. کیفیت این اندیشه‌ها، مستقیماً بر موفقیت کل چارچوب اثر می‌گذارد.

اقدام (Action)

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

مشاهده (Observation)

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

حلقه کنترل (Control Loop)

چرخه Thought → Action → Observation تا رسیدن به پاسخ نهایی یا رسیدن به حد مجاز گام‌ها ادامه می‌یابد. مدیریت این حلقه، یکی از حساس‌ترین بخش‌های پیاده‌سازی ReAct است.

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

در ادامه، یک پیاده‌سازی ساده از روش ReAct با پایتون ارائه می‌شود. این کد ساختار کلی را نشان می‌دهد و می‌توانید آن را با هر کتابخانه‌ای تطبیق دهید.

import openai
import re

TOOLS = {
    "search": lambda q: search_engine(q),
    "calculator": lambda e: str(eval(e)),
}

def react_agent(question, max_steps=6):
    prompt = f"""Answer the following question using this format:

Question: {question}

Thought: your reasoning about the next step
Action: tool_name[input]
Observation: result of the action
... (repeat Thought/Action/Observation as needed)
Thought: I now know the final answer
Final Answer: your answer

Available tools: search, calculator
"""
    transcript = prompt
    for step in range(max_steps):
        response = openai.ChatCompletion.create(
            model="gpt-4",
            messages=[{"role": "user", "content": transcript}],
            temperature=0.0,
            stop=["Observation:"],
        )
        text = response.choices[0].message.content.strip()
        transcript += "\n" + text + "\n"
        if "Final Answer:" in text:
            return text.split("Final Answer:")[-1].strip()
        action = parse_action(text)
        if action:
            tool, arg = action
            result = TOOLS[tool](arg)
            transcript += f"Observation: {result}\n"
    return "Reached maximum steps without a final answer."

def parse_action(text):
    match = re.search(r"Action:\s*(\w+)\[(.+?)\]", text)
    if match:
        return match.group(1), match.group(2)
    return None

این پیاده‌سازی چند نکته کلیدی را نشان می‌دهد:

  • ساختار پرامپت شامل فرمت مشخص Thought/Action/Observation است.
  • دمای صفر، پایداری خروجی را افزایش می‌دهد.
  • پارامتر stop از تولید Observation توسط مدل جلوگیری می‌کند.
  • حداکثر گام‌ها، از حلقه بی‌پایان جلوگیری می‌کند.

برای آشنایی با ساختار کلی یک پرامپت مؤثر، پست ساختار یک پرامپت مؤثر را ببینید.

طراحی ابزارها و APIها برای عامل

کیفیت ابزارها، مستقیماً بر عملکرد روش ReAct اثر می‌گذارد. اصول طراحی ابزار:

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

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

مدیریت حلقه Reasoning و Acting

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

حلقه بی‌پایان

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

تکرار اقدام یکسان

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

خطای ابزار

اگر یک ابزار خطا بدهد، مدل باید بتواند مسیر جایگزین انتخاب کند. راهکار: طراحی پرامپت به‌گونه‌ای که مدل بتواند خطا را مدیریت کند.

مدیریت طول کانتکست

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

مدیریت این حلقه، تفاوت بین یک عامل کارآمد و یک عامل ناکارآمد است. در پروژه‌های واقعی، تنظیم دقیق این پارامترها می‌تواند تفاوت قابل‌توجهی در کیفیت خروجی ایجاد کند.

چه زمانی باید از ReAct استفاده کنیم؟

روش ReAct در شرایط زیر بیشترین اثر را دارد:

  • مسائلی که نیاز به اطلاعات بیرونی دارند: جستجو، خواندن اسناد، فراخوانی API.
  • مسائل چندمرحله‌ای: زمانی که حل مسئله به گام‌های متعدد نیاز دارد.
  • عامل‌های هوشمند: سامانه‌هایی که باید تصمیم بگیرند و اقدام کنند. برای جزئیات، پست پرامپت نویسی برای عامل‌های هوشمند را ببینید.
  • سامانه‌های RAG: زمانی که مدل باید به‌طور پویا اطلاعات را بازیابی کند. برای جزئیات، پست RAG چیست را ببینید.
  • خودکارسازی فرایندها: زمانی که باید یک فرایند پیچیده به‌صورت خودکار اجرا شود.
  • مسائل پشتیبانی مشتری: زمانی که عامل باید به‌طور پویا اطلاعات موردنیاز مشتری را جمع‌آوری کند.

در سامانه‌های تولیدی، روش ReAct می‌تواند کیفیت پاسخ‌دهی را به‌طور چشمگیری افزایش دهد، به‌ویژه وقتی که مسئله نیازمند اطلاعات به‌روز یا تعامل با سامانه‌های بیرونی باشد.

چه زمانی این روش مناسب نیست؟

روش ReAct در همه سناریوها مناسب نیست:

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

گونه‌ها و نسخه‌های پیشرفته

از زمان معرفی روش ReAct، نسخه‌های پیشرفته‌ای نیز توسعه یافته است:

Reflexion

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

Plan-and-Execute

در این نسخه، مدل ابتدا یک برنامه کامل طراحی می‌کند و سپس گام‌به‌گام آن را اجرا می‌کند. این چارچوب برای مسائل با ساختار مشخص مناسب است.

Self-Ask

در این نسخه، مدل به‌جای دریافت مستقیم اطلاعات، ابتدا سؤال‌های فرعی تولید می‌کند و سپس هر یک را پاسخ می‌دهد. این چارچوب در مسائل استدلالی چندمرحله‌ای مؤثر است.

ترکیب با درخت تفکر

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

ترکیب با خودسازگاری

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

ملاحظات امنیتی در روش ReAct

روش ReAct به‌دلیل تعامل با ابزارهای بیرونی، سطح حمله را گسترده‌تر می‌کند. ملاحظات امنیتی اصلی:

  • تزریق پرامپت: مهاجم می‌تواند با تزریق دستور، مدل را وادار به فراخوانی ابزار مخرب کند. برای جزئیات، پست تزریق پرامپت چیست را ببینید.
  • Least Privilege: هر ابزار باید فقط دسترسی‌های لازم را داشته باشد.
  • Sandbox: اجرای اقدام‌های مخرب باید در یک محیط ایزوله محدود شود.
  • تأیید انسانی: برای اقدام‌های حساس، تأیید انسانی الزامی باشد.
  • Audit Logging: همه اقدام‌ها ثبت و بررسی شوند.

برای آشنایی با راهکارهای دفاعی، پست دفاع در برابر تزریق پرامپت را ببینید.

ترکیب با سایر تکنیک‌ها

روش ReAct یک چارچوب انعطاف‌پذیر است و می‌تواند با تکنیک‌های دیگر ترکیب شود:

پرسش‌های پرتکرار درباره روش ReAct

روش ReAct چه تفاوتی با زنجیره تفکر دارد؟

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

آیا ReAct همیشه دقت را افزایش می‌دهد؟

خیر. اگر ابزارها ضعیف باشند یا پرامپت پایه اشتباه باشد، ReAct می‌تواند خطاها را تشدید کند. اثربخشی این چارچوب به کیفیت ابزارها، طراحی پرامپت و مدیریت حلقه بستگی دارد.

چه تعداد ابزار برای یک عامل ReAct مناسب است؟

تعداد ابزار به نوع مسئله بستگی دارد. در مسائل ساده، ۲ تا ۵ ابزار کافی است. در مسائل پیچیده، تعداد بیشتری می‌تواند مفید باشد، اما انتخاب ابزار را دشوارتر می‌کند. راهکار، استفاده از لایه مسیریابی و توصیف دقیق ابزارها است.

آیا ReAct برای سامانه‌های تولیدی مناسب است؟

بله، اما باید ملاحظات امنیتی، مدیریت خطا و محدودسازی دسترسی در طراحی لحاظ شود. بدون این ملاحظات، یک عامل ReAct می‌تواند به یک ریسک امنیتی تبدیل شود.

تفاوت ReAct با Plan-and-Execute چیست؟

در ReAct، مدل گام‌به‌گام تصمیم می‌گیرد و پس از هر مشاهده، مسیر خود را تطبیق می‌دهد. در Plan-and-Execute، مدل ابتدا یک برنامه کامل طراحی می‌کند و سپس آن را اجرا می‌کند. Plan-and-Execute برای مسائل با ساختار مشخص مناسب است، در حالی که ReAct برای مسائل پویا مناسب‌تر است.

آیا می‌توان ReAct را با مدل‌های متن‌باز اجرا کرد؟

بله، اما عملکرد آن به توانایی مدل در پیروی از فرمت ساختاریافته و مدیریت چرخه بستگی دارد. مدل‌های بزرگ‌تر معمولاً در این زمینه عملکرد بهتری دارند.

چگونه از حلقه بی‌پایان در ReAct جلوگیری کنیم؟

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

آیا ReAct با RAG تفاوت دارد؟

بله. RAG یک معماری بازیابی است که اطلاعات مرتبط را قبل از تولید پاسخ فراهم می‌کند. ReAct یک چارچوب تعاملی است که در طول حل مسئله، به‌طور پویا ابزارها را فراخوانی می‌کند. این دو می‌توانند ترکیب شوند: RAG می‌تواند یکی از ابزارهای ReAct باشد.

آیا ReAct برای پشتیبانی مشتری مناسب است؟

بله. عامل ReAct می‌تواند به پایگاه دانش، CRM و سیستم تیکت دسترسی داشته باشد و به‌طور پویا به پرسش‌های مشتری پاسخ دهد. اما باید ملاحظات امنیتی و محدودیت دسترسی لحاظ شود.

چگونه کیفیت یک عامل ReAct را ارزیابی کنیم؟

می‌توان معیارهایی مانند نرخ موفقیت در رسیدن به پاسخ، میانگین تعداد گام‌ها، نرخ خطای ابزار و زمان پاسخ‌دهی را اندازه‌گیری کرد. برای معیارهای ارزیابی، پست معیارهای ارزیابی پرامپت را ببینید.

آیا ReAct جایگزین Fine-tuning است؟

خیر. این دو تکنیک اهداف متفاوتی دارند. Fine-tuning برای تخصصی‌سازی مدل در یک حوزه استفاده می‌شود، در حالی که ReAct یک چارچوب تعاملی است. در برخی پروژه‌ها، ترکیب این دو می‌تواند بهترین نتیجه را بدهد.

نتیجه‌گیری کاربردی

روش ReAct یک چارچوب بنیادین برای ساخت عامل‌های هوشمند است که استدلال و اقدام را در یک چرخه پیوسته ترکیب می‌کند. این چارچوب به مدل‌های زبانی اجازه می‌دهد به‌جای تکیه بر دانش داخلی، اطلاعات موردنیاز خود را از جهان بیرونی بگیرند و بر اساس آن تصمیم بگیرند. همین ویژگی، ReAct را به یک ستون اصلی معماری سامانه‌های عامل‌محور مدرن تبدیل کرده است.

ReAct نشان می‌دهد که در سامانه‌های هوش مصنوعی، توانایی اقدام می‌تواند به‌اندازه توانایی استدلال مهم باشد.

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