Reasoning(推論)とActing(行動)を交互に実行するLLMエージェントの行動パターン。Thought→Action→Observationのループにより、外部ツールとのインタラクションを通じて段階的に問題を解決する。Yao et al.(2022)が提案。
ReAct(Reasoning + Acting)パターンは、Yao et al.が2022年に発表した論文「ReAct: Synergizing Reasoning and Acting in Language Models」で提案されたLLMエージェントの行動パターンである。LLMが「考える(Thought)」「行動する(Action)」「結果を観察する(Observation)」の3ステップを交互に繰り返すことで、外部環境とインタラクションしながら問題を解決する。
従来のChain-of-Thought(CoT)プロンプティングが推論のみを行うのに対し、ReActは推論と行動を統合することで、外部知識の取得やツール利用が可能になる。これにより、LLM単体では解けない問題(最新情報の検索、計算、データベース操作など)に対応できる。
ReActパターンの基本的な動作フローは以下の通りである。
Thought 1: [タスクについての推論]
Action 1: [実行するアクション(ツール名と入力)]
Observation 1: [アクションの実行結果]
Thought 2: [観察結果を踏まえた次の推論]
Action 2: [次のアクション]
Observation 2: [結果]
...
Thought N: [最終的な推論と結論]
Action N: Finish[最終回答]
各ステップの役割は以下の通りである。
| ステップ | 役割 | 生成主体 |
|---|---|---|
| Thought | 現在の状況分析、次のアクションの計画、推論 | LLM |
| Action | 外部ツールの呼び出し(検索、計算、API等) | LLM(生成)→ 環境(実行) |
| Observation | アクションの実行結果 | 外部環境 |
ThoughtステップではLLMが自由形式のテキストで推論を行う。「何がわかっているか」「何が足りないか」「次に何をすべきか」を明示的に言語化する。この言語化により、LLMの推論プロセスが透明になり、デバッグや改善が容易になる。
| 手法 | 推論 |
|---|
| 行動 |
|---|
| 外部知識 |
|---|
| Hallucination耐性 |
|---|
| 適するタスク |
|---|
| Standard Prompting | なし | なし | なし | 低い | 単純なQA |
| Chain-of-Thought (CoT) | あり | なし | なし | 中程度 | 推論タスク |
| Act-only | なし | あり | あり | 低い(盲目的実行) | 定型操作 |
| ReAct | あり | あり | あり | 高い | 複合タスク |
| Reflexion | あり | あり | あり | 最も高い | 反復改善が必要なタスク |
ReActの最大の強みは、推論と行動の相乗効果(Synergy)にある。推論により行動の方向性が定まり、行動の結果が推論を更新する。CoTだけでは外部情報にアクセスできずHallucinationが発生しやすく、Act-onlyでは行動の根拠が不明確で無駄な行動が増える。
ReActの実装には主に2つのアプローチがある。
Few-shotプロンプトでReActの例を提示し、LLMにパターンを模倣させる。LangChainやLlamaIndexでは、ReActエージェントがこの方式で実装されている。
プロンプトの構成要素:
LangChainのAgentExecutor、OpenAI Agents SDK、CrewAIなどでは、ReActのループがフレームワークレベルで実装されている。LLMのFunction Calling機能を利用することで、ツール呼び出しの精度と安定性が向上する。
| フレームワーク | ReAct実装方式 | ツール連携 | 特徴 |
|---|---|---|---|
| LangChain | AgentExecutor + ReAct prompt | Tools/Toolkits | 豊富なツールエコシステム |
| LlamaIndex | ReAct Agent | QueryEngine連携 | RAGとの統合が強い |
| OpenAI Agents SDK | Runner + ToolCall | Function定義 | ハンドオフ対応 |
| Anthropic Claude | Tool Use + 思考プロセス | Tool定義 | Extended Thinking連携 |
ReActにはいくつかの既知の限界がある。
| 限界 | 詳細 | 改善手法 |
|---|---|---|
| 長期計画の弱さ | 局所的な判断に偏り、長期的な計画が困難 | Plan-and-Solveとの併用 |
| ループ問題 | 同じThought→Actionを繰り返す | 最大ステップ数制限、履歴参照 |
| ツール選択ミス | 不適切なツールを選択する | ツール説明の詳細化、Few-shot例の追加 |
| 計算コスト | ステップ数に比例してトークン消費が増大 | ReWOO(計画と実行の分離) |
| エラー伝播 | 初期のミスが後続ステップに波及 | Reflexionによる自己修正 |
ReWOO(Reasoning WithOut Observation)は、ReActの計算コスト問題を解決するために提案された手法で、計画フェーズですべてのThought/Actionを一括生成し、実行フェーズでまとめて実行する。これにより、LLMの呼び出し回数を削減できる。
ReActパターンは以下の分野で広く活用されている。
A1: ReActはLLMの行動パターン(思考と行動の交互実行)を定義するフレームワークであり、Function CallingはLLMがツールを呼び出すための技術的な仕組みである。ReActの「Action」ステップの実装手段としてFunction Callingが使われることが多い。つまり、ReActは設計パターン、Function Callingはその実装技術という関係である。
A2: 最も重要なのは、(1)ツール定義の明確さ(何ができて何ができないかを明記)、(2)Few-shot例の品質(実際のタスクに近い例を2-3個提示)、(3)Thoughtの具体性を促す指示(「なぜそのアクションを選んだか」を明示させる)である。ツール定義が曖昧だと、LLMが存在しないツールを呼び出したり、誤ったパラメータを渡す確率が上がる。
A3: 対処法は複数ある。(1)最大イテレーション数を設定する(通常10-15回)、(2)過去のThought/Action/Observationを要約してコンテキスト長を管理する、(3)同一Actionの連続実行を検出して別のアプローチを促す、(4)タイムアウトを設定する。根本的には、タスクの分解が不十分な場合にループが発生しやすいため、事前のタスク分解(Plan-and-Solve)と組み合わせることが有効である。
A4: 理論的にはどのLLMでも使えるが、実用的にはGPT-4/4o、Claude 3.5/4系、Gemini 1.5 Pro以上の推論能力を持つモデルが推奨される。小型モデル(7B以下)ではThoughtの品質が低下し、ツール選択の精度も落ちる。ただし、ドメイン特化のファインチューニングを行えば小型モデルでも実用的な性能を達成できる場合がある。