ReAct(Reasoning + Acting)(リアクトリーズニングアクティング)
LLMが推論(Reasoning)と行動(Acting)を交互に繰り返すことで、ツール使用や外部情報取得を伴うタスクを解くフレームワーク。
ReAct(Reasoning + Acting)とは
ReActは2022年にYao et al.が提案したLLMフレームワークで、「推論(Reasoning)と行動(Acting)を統合する」という考え方が名前の由来。LLMが外部ツール(検索エンジン・計算機・コードインタープリタ等)を使いながらタスクを解くための標準的な設計パターンとなっている。
LangChainやLangGraphのエージェント実装の根幹として採用されており、実用的なLLMアプリケーション開発において最も重要な推論フレームワークの一つ。
基本サイクル:Thought → Action → Observation
ReActの核心はThink-Act-Observeの繰り返しループ。
例: 「エッフェル塔の高さを調べてPythonで表示して」
- Thought 1: 正確な高さを確認する必要がある
- Action 1: Search["エッフェル塔 高さ"]
- Observation 1: エッフェル塔の高さは330m
- Thought 2: コードを書いて実行する
- Action 2: PythonREPL["print(330)"]
- Observation 2: 330
- Final Answer: エッフェル塔の高さ330mを表示しました
LangChainでの実装
LangChainではcreate_react_agentでReActエージェントを構築できる。ツールリスト(DuckDuckGoSearch、PythonREPL等)とReActプロンプトテンプレート(hub.pull("hwchase17/react"))、AgentExecutorを組み合わせて使用する。max_iterations(デフォルト15)で無限ループを防止する。
ReActのプロンプト構造
ReActは特定のフォーマットでLLMに出力させる。Thought行で推論を記述し、Action行でツール名と入力を指定し、Observation行でツール結果を受け取る。最終的にFinal Answerで回答を出力する。
Chain of ThoughtとReActの比較
Chain of Thoughtは外部ツールを使用せず静的な内部推論のみ。ReActは外部ツールで動的に情報取得・計算でき、最新情報や複雑な計算が必要なタスクに対応できる。
重要な課題と対策
幻覚(Hallucination): 存在しないツールを呼び出したり、Observationを捏造する問題。→ 厳格なパース検証で緩和。ループ回避: 同じAction-Observationを繰り返す無限ループ。→ max_iterationsで防止。
ReAct vs. Function Calling
OpenAIのFunction Calling(Tool Use)はReActの考え方をAPIレベルで実装したもの。ReActがプロンプトエンジニアリングで実現するのに対し、Function Callingはモデルが構造化JSON形式でツール呼び出しを出力する。現代的なエージェント設計では両方を組み合わせて使用するケースが多い。
採用実績
LangChain AgentExecutor、Google Bard(初期実装)、Fixie.ai、AutoGPT、MetaGPTなど多数のLLMエージェントフレームワークがReActを基盤として採用している。2023年〜2024年にかけてLLMエージェントの事実上の標準設計パターンとなった。