近年のLLMエージェント構築において、デファクトスタンダードとなっている「ReAct(Reasoning and Acting)」フレームワーク。
ReAct: Synergizing Reasoning and Acting in Language Models
Shunyu Yao, Jeffrey Zhao, Dian Yu, Nan Du, Izhak Shafran, Karthik Narasimhan, Yuan Cao
2022年の論文公開以降、LangChain等のライブラリにより抽象化され、ブラックボックスとして利用されるケースが増えている。
本稿では、この論文をLangChainの学習の一環としてまとめてみる。
論文内容のざっくりまとめ
Abstract
推論(Reasoning)と行動(Acting)の相乗効果を提案。
LLMが思考トレースとタスク固有のアクションを交互に生成するフレームワーク「ReAct」を定義し、外部環境(Wikipedia等)とのインタラクションを通じて、推論エラーの抑制とハルシネーションの低減を実現したことを要約している。
1. Introduction
既存の言語モデルにおける「Reasoning(CoT等)」と「Acting(WebShop等)」の分離を問題視している。
- Reasoningの欠陥
- 外部知識の欠如による事実誤認と、静的な推論プロセス
- Actingの欠陥
- 抽象的な目標の欠如による迷走
これらを統合することで、人間の認知プロセスに近い
「推論による行動計画の策定」
と
「行動結果による推論の修正」
のループを導入する動機を述べている。
2. ReAct: Synergizing Reasoning and Acting in Language Models
- 環境の定義
- 状態 $s \in S$、行動 $a \in A$、観察 $o \in O$ からなるマルコフ決定過程(MDP)的環境
- 入力シーケンス(Trajectory)の構築
- 時刻 $t$ におけるコンテキスト $c_t$ を $c_t = (x, r_1, a_1, o_1, \dots, r_{t-1}, a_{t-1}, o_{t-1})$ と定義
- 出力の構造
- $c_t$ を入力とし、思考 $r_t$ または行動 $a_t$ を生成する確率分布 $p(r_t, a_t | c_t)$ をモデル化
3. Knowledge-Intensive Reasoning Tasks (HotpotQA, FEVER)
知識集約型タスクにおける評価実験。
- 手法
- Wikipedia APIを外部環境とし、Search, Lookup, Finishの3つのアクションを定義
- 結果
- CoT単体(Reasoningのみ)と比較し、事実情報の正確性が向上。Action単体と比較し、情報探索の効率化を確認
- 分析
- ReActはハルシネーションを自己修正する能力を持つことを定性的に評価
4. Decision Making Tasks (ALFWorld, WebShop)
意思決定・操作型タスクにおける評価実験。
- 環境
- 物理的な部屋の操作(ALFWorld)およびオンラインショッピング(WebShop)
- 知見
- 言語による「Thought(思考)」を介在させることで、疎な報酬設定(Sparse Reward)下でも、長期的目標(Long-term Goal)を見失わずにタスクを完遂可能であることを実証
5. Related Work
- Chain-of-Thought (CoT)
- 推論のみに特化した先行研究との差異
- Modular Deep RL
- 強化学習アプローチに対する、LLMのFew-shot学習による柔軟性の優位性
6. Conclusion
ReActが知識集約型タスクと意思決定タスクの両面で有効であることを結論。
今後の課題として、モデルの微調整(Fine-tuning)による、コンテキスト長の制限およびFew-shot依存の解消を提示。
気になって整理した内容
疎な報酬設定(Sparse Reward)下での問題
問題・課題点
疎な報酬設定(Sparse Reward Setting)とは、強化学習や意思決定タスクにおいて、エージェントが目標を完全に達成した最終段階でしか正の報酬(フィードバック)が得られず、その途中の過程では報酬が「0(ゼロ)」または一定値のままである状態を指す。
この状況下では、以下の現象が発生するため、単純な行動モデル(Actingのみ)ではタスク完遂が困難になる。
- 評価の遅延
- 行動の結果が「正しい方向に向かっているか」が直ちに判明しない
- 探索の困難性
- 偶然にゴールへ到達するまで有益なシグナルが得られないため、試行錯誤(Exploration)の効率が極めて低くなる
ReActでの解決策
LLMの「Thought(思考)」が以下の役割を果たすことで克服可能であることを示している。
-
中間目標の自己生成
- 最終報酬が得られないプロセスにおいて、LLMが自ら「次は〇〇を確認すべきだ」という論理的な中間ステップをコンテキスト内に生成する
-
内部的な報酬関数の代替
- 物理的な報酬が得られなくても、Observation(観察結果)が自身のThought(計画)と整合しているかを言語的に評価することで、事実上の自己フィードバックループを形成する
Observation(観察結果)とは具体的になにか
結論
「外部出力をコンテキストという作業メモリに同期・マッピングする物理的なデータ処理」のこと。
外部環境(Environment)から返却された出力を、エージェント(LLM)の次期推論サイクルにおける入力シーケンス($c_{t+1}$)へ統合する一連のデータ処理工程を指す。
もう少し細かく
- データ受信とシリアライズ(Input)
- 外部ツールの実行完了後、その実行戻り値(Return Value)を同期的に受信する
- データフロー
- 外部プロセス(API、DB、Interpreter等)からシステム側(エージェント制御プログラム)へ、構造化データ(JSON, Binary等)が転送される
- メモリ構造
- 受信データは一時的なバッファに保持され、LLMが解釈可能なUTF-8形式のテキストデータへシリアライズされる
- データフロー
- 外部ツールの実行完了後、その実行戻り値(Return Value)を同期的に受信する
- コンテキスト・トークン・アペンディング(State Transition)
- シリアライズされたテキストを、LLMのコンテキストウィンドウ内に保持されている既存のトークン列(Trajectory)の末尾へ物理的に結合する
- 状態遷移
- 状態 $S_t = (x, r_1, a_1, o_1, \dots, r_t, a_t)$ から、状態 $S_{t'} = (x, r_1, a_1, o_1, \dots, r_t, a_t, \mathbf{o_t})$ への遷移。($x$: 指示, $r$: Thought, $a$: Action, $o$: Observation)
- フォーマッティング
- システム側で定義されたトークン識別子(例:\nObservation: )をプレフィックスとして付与し、LLMが「外部からの入力」として境界を認識できるようにする
- 状態遷移
- シリアライズされたテキストを、LLMのコンテキストウィンドウ内に保持されている既存のトークン列(Trajectory)の末尾へ物理的に結合する
- コンテキスト・ウィンドウの整合性制御
- 結合後のトークン長を算出し、LLMの最大コンテキスト長(Max Context Window)を超過しないよう制御するロジックが介在する
- 内部機構
- トークン・カウンティング
- シリアライズされた $o_t$ を含む全系列のトークン数を計算
- トランケーション/要約(必要時)
- 制限超過が予見される場合、先行する $o_{1 \dots t-1}$ または $r_{1 \dots t-1}$ の一部を削除、あるいは圧縮して、現在時刻 $t$ における推論に必要なメモリ空間を確保する
- トークン・カウンティング
- 内部機構
- 結合後のトークン長を算出し、LLMの最大コンテキスト長(Max Context Window)を超過しないよう制御するロジックが介在する
- 推論フェーズへのトリガー(Output)
- 更新されたコンテキスト $S_{t'}$ をペイロードとして、LLMの推論エンドポイントへ送信(Request)する
- データフロー
- 制御プログラムからLLMエンジンへ、更新されたシーケンス全体が転送される
- 目的
- LLMに対し、直前の $a_t$ に対する結果 $o_t$ を確定した事実(Grounding)として提示し、次ステップ $r_{t+1}$ の生成を誘発する
- データフロー
- 更新されたコンテキスト $S_{t'}$ をペイロードとして、LLMの推論エンドポイントへ送信(Request)する
CoT vs ReAct
Chain-of-Thought (CoT) と ReAct は、LLMの推論プロセスにおける異なるフレームワークであり、その主な相違点は「外部環境との相互作用(閉鎖系 or 開放系)」にある。
エンジニアリングの観点では、
ReActはCoTを拡張し、
外部I/O(Observation)を組み込むための
制御ループを定義したもの
と解釈できる。
Chain-of-Thought (CoT)
- 定義
- LLMが回答に至るまでの論理的な中間ステップを、自己の内部パラメータ(学習済み知識)のみを用いて生成する手法
- データフロー
- 入力に対して、思考プロセスを生成し、最終回答を出力する線形プロセス
- システム境界
- 閉鎖系。外部環境からの入力(Observation)を受け取らず、推論はLLMの内部完結
ReAct
- 定義
- CoTのような「推論(Thought)」に、外部ツールを操作する「行動(Action)」とその結果の「観察(Observation)」を統合したフレームワーク
- データフロー
- Thought → Action → Observation のサイクルを繰り返す動的プロセス
- システム境界
- 開放系。外部環境からの動的なフィードバックをコンテキストに取り込み、それに基づき次ステップの推論を修正
上記を踏まえた、ReActのフローまとめ
1. 初期状態($t=0$)
- Input
- ユーザーからの命令(Query: $x$)および、ReActの動作規則を規定したFew-shotプロンプト($p$)。
- State ($c_0$)
- $c_0 = (p, x)$
- メモリ構造
- LLMのコンテキストウィンドウの先頭に静的な命令セットが配置される
2. 推論サイクル($t=n$)
ステップA:Thought(思考)の生成
- Process
- $p(r_t | c_{t-1})$
- 処理
- LLMが現在のコンテキスト $c_{t-1}$ を参照し、次のアクションの妥当性を言語化($r_t$)する
- 内部機構
- 外部環境には干渉せず、LLM内部の論理空間で中間目標を策定する
ステップB:Action(行動)の生成
- Process
- $p(a_t | c_{t-1}, r_t)$
- 処理
- LLMが特定の書式(例:
search[query])に従い、外部ツールを呼び出すための識別子と引数($a_t$)を出力します。
- LLMが特定の書式(例:
- システム出力
- 生成された $a_t$ がLLMエンジンからエージェント制御プログラムへ送信される
ステップC:Execution(実行)
- 処理
- 制御プログラムが $a_t$ をパースし、該当する外部ツール(API、DB等)を駆動します。
- 注記
- このフェーズはLLMの外部で行われ、LLMの推論は一時停止(Suspend)状態となる
ステップD:Observation(観察)の統合
- Input
- 外部ツールからの戻り値(Raw Data)。
- 処理
- システム側でデータをテキスト化し、識別子を付与して $o_t$ とします。
- 状態遷移
- $c_t = (c_{t-1}, r_t, a_t, o_t)$
- メモリ更新
- $o_t$ をコンテキストの末尾に結合し、LLMへの次回のRequestペイロードを確定させる
3. 終了判定と最終出力
- 条件
- LLMが推論の過程で「タスクの完了」を認識した際、特定のアクション(例:
Finish[answer])を出力する
- LLMが推論の過程で「タスクの完了」を認識した際、特定のアクション(例:
- Output
- 最終的な回答($y$)をユーザーへ返却し、プロセスを終了(Terminate)する
シーケンス上の重要な特性
- 同期性
- $o_t$ がコンテキストに結合されるまで、次の $r_{t+1}$ は生成されません。
- 累積性
- 各サイクルの $r, a, o$ はすべてコンテキストに蓄積されるため、ステップ数に比例して計算コスト(トークン数)が増大します。
- 再帰的修正
- $o_t$ の内容が $r_t$ での予測と乖離していた場合、次サイクルの $r_{t+1}$ において計画の再構成(Dynamic Replanning)が行われる