LLMエージェントを1から解説 — ツール使用とループの設計
「考える→道具を使う→結果を見て考え直す」というループはどう設計されているのか。ReAct論文(Yao et al., 2022)の本文だけを根拠に、行動空間に言語を足すという発想、function callingの実装の形、実測された失敗モード(ループの暴走・幻覚したツール呼び出し)まで。
要点
- ReActは行動空間に言語を足した手法で、思考は観測を返さない行動としてループに組み込まれる。
- HotpotQAではReActがCoTに負け(27.4対29.4)、Feverでは勝つ(60.9対56.3)。
- ALFWorldでReActは成功率71%で、行動のみのActの45%を上回った。
- 幻覚の割合はReActが0%、CoTが56%だが、推論エラーはReActが47%、CoTが16%。
- ループの暴走は貪欲デコーディングの最適でなさが疑われ、論文は7/5ステップで打ち切っている。
ReAct: Synergizing Reasoning and Acting in Language Models
一次資料 — この記事の根拠
論文の発表 2022-10-06→この解説の公開 2026-08-063年10か月後
ReAct: Synergizing Reasoning and Acting in Language ModelsShunyu Yao, Jeffrey Zhao, Dian Yu ほか · 2022-10-06 · v3arXiv:2210.03629論文ページ·PDF原文の要旨(Abstract)を読む
While large language models (LLMs) have demonstrated impressive capabilities across tasks in language understanding and interactive decision making, their abilities for reasoning (e.g. chain-of-thought prompting) and acting (e.g. action plan generation) have primarily been studied as separate topics. In this paper, we explore the use of LLMs to generate both reasoning traces and task-specific actions in an interleaved manner, allowing for greater synergy between the two: reasoning traces help the model induce, track, and update action plans as well as handle exceptions, while actions allow it to interface with external sources, such as knowledge bases or environments, to gather additional information. We apply our approach, named ReAct, to a diverse set of language and decision making tasks and demonstrate its effectiveness over state-of-the-art baselines, as well as improved human interpretability and trustworthiness over methods without reasoning or acting components. Concretely, on question answering (HotpotQA) and fact verification (Fever), ReAct overcomes issues of hallucination and error propagation prevalent in chain-of-thought reasoning by interacting with a simple Wikipedia API, and generates human-like task-solving trajectories that are more interpretable than baselines without reasoning traces. On two interactive decision making benchmarks (ALFWorld and WebShop), ReAct outperforms imitation and reinforcement learning methods by an absolute success rate of 34% and 10% respectively, while being prompted with only one or two in-context examples. Project site with code: https://react-lm.github.io
一度の生成では届かない場所
あるホテルの「現在の」客室数を聞かれたモデルを想像してください。学習時に読んだ記憶だけで答えるなら、それは推測です。ReAct論文はこの状況を、chain-of-thought による推論は「静的なブラックボックス」であり、モデルは自分の内部表現だけで思考を生成していて外界に接地していない、と表現しました(§1)。接地していないと、事実の幻覚と、その誤りの伝播が起きます。
では逆に、考えずに道具だけ叩くエージェントはどうか。論文の Figure 1 が示すのは、行動しかしないエージェントが検索そのものはできるのに、集めた情報から最終的な答えを組み立てる段で失敗する様子です(§2)。
人間はどちらもやっている、というのが出発点です。台所で料理をするとき、私たちは行動と行動の間に言葉で考えます。「切り終わったから湯を沸かそう」(進捗の追跡)、「塩がないから醤油で代用しよう」(例外処理)、「生地の作り方が分からないから調べよう」(外部情報が要ると気づく)。この往復を言語モデルに持ち込んだのが ReAct(Reason + Act)です(§1)。
ループの骨格を式で書く
エージェントの標準的な定式化から始めます。時刻 でエージェントは環境から観測 を受け取り、方策 に従って行動 を選ぶ。ここで は、それまでに見たもの・やったこと全部です(§2)。 は「履歴を見て次の一手を決める関数」、 は「その履歴」。文脈から行動への写像が込み入っているほど、この方策を学ぶのは難しくなります。
ReAct の答えは1行で書けます(§2)。
は本来の行動空間(検索する、ボタンを押す)、 は言語の空間です。式(1)は「行動の選択肢に、ただ言葉を書くだけの行動を足す」と言っています。つまり、ハットは「広げた」という印で、 は「足す」以上の意味を持ちません。これまでできた外界への働きかけはそのまま全部残り、そこに「言葉を言う」という項目が1つ増えるだけ、ということです。この言語空間の行動を論文は思考(thought)と呼び、決定的な性質をひとつ与えます。思考は外部環境を変えないので、観測が返ってこない。代わりに文脈が と伸び、次の推論と行動を支えます。
つまりエージェントの「考える」は、副作用のない行動としてループに組み込まれている。各社のフレームワークで見かける Thought → Action → Observation という並びの正体はこれです。
もうひとつ、設計上どうしても効いてくる性質があります。ステップが進むたびに は伸び、モデルは毎回その全部を読み直します。1ステップの入力が線形に伸びるということは、走り切るまでに読むトークンの総量はステップ数の2乗で効いてくるということです。
論文が実際に測ったこと
実験は PaLM-540B を凍結したまま few-shot プロンプトで動かす設定です。HotpotQA には6例、Fever には3例の人手軌跡を与えました(§3.2)。道具は Wikipedia を模した3つだけ——該当ページの冒頭5文を返す search[エンティティ]、その文字列を含む次の文を返す lookup[文字列](ブラウザの Ctrl+F 相当)、そして finish[答え]。論文自身が「最先端の検索器より明らかに弱い」と認めた道具立てで、言語による明示的な推論で検索させることが目的でした(§3.1)。
結果は素直ではありません。表1(PaLM-540B)では HotpotQA の完全一致が Standard 28.7、CoT 29.4、ReAct 27.4。ReAct 単独は CoT に負けています。一方 Fever の正解率は CoT 56.3 に対し ReAct 60.9 で勝ち。両者を切り替える ReAct→CoT-SC が HotpotQA 35.1、CoT-SC→ReAct が Fever 64.6 で最高値でした(§3.3)。
切り替えの規則は単純で、ReAct が既定ステップ数(HotpotQA は7、Fever は5)以内に答えられなければ CoT-SC へ、CoT-SC の多数決が過半に届かなければ ReAct へ退避します(§3.2)。
決定を伴うタスクではもっと明確です。ALFWorld(家庭内タスクのテキストゲーム、134の未見インスタンス)で ReAct は best-of-6 で成功率71%、行動のみの Act は45%、模倣学習の BUTLER は37%。ReAct の最悪の試行48%が、両者の最良を上回っています(§4、表3)。WebShop では Act 30.1% に対し ReAct 40.0%(§4、表4)。
もう1点。ReAct が生成した正解軌跡3,000本で小さいモデルを微調整すると、PaLM-8B の微調整版が PaLM-62B のプロンプト版すべてを、PaLM-62B の微調整版が 540B のプロンプト版すべてを上回りました(§3.3)。
function calling は何をしているのか
ここからは論文の記述にもとづく筆者の解釈です。論文の search[...] は自由文の1行でしたが、現代の function calling は同じことを JSON でやっています。
ctx = [{"role": "user", "content": question}]
for step in range(MAX_STEPS): # 打ち切りは必須(論文は7/5ステップ)
msg = model.generate(ctx, tools=tools) # thought か tool_call が返る
ctx.append(msg)
if msg.tool_call is None:
break # finish 相当
obs = registry[msg.tool_call.name](**msg.tool_call.args)
ctx.append({"role": "tool", "content": obs}) # 観測を文脈に戻す
変わったのは書式が構造化され、機械が引数を検証できるようになったこと。変わっていないのは、思考と行動と観測が1本の文脈に順に積まれ、モデルは毎回その全部を読んで次を決める構造です。MAX_STEPS は飾りではありません。論文も上限を設けており、正解した軌跡のうち上限まで使ったものは HotpotQA で0.84%、Fever で1.33%しかなかったと報告しています(§3.2 脚注3)。上限は性能をほとんど削らず、暴走だけを止めます。
失敗モードは実測されている
論文は HotpotQA の軌跡を人手で分類しました(§3.3、表2)。本記事でいちばん有用な表です。
- 幻覚: CoT の失敗のうち56%が幻覚。ReAct は0%。成功例に紛れる偽陽性も CoT 14%、ReAct 6%。外部知識への接地の効果はここに出ます。
- 推論エラー: 逆に ReAct は47%、CoT は16%。思考・行動・観測を交互に置く構造上の制約が、推論の組み立ての自由度を下げるためだと論文は説明します。
- ループの暴走: その推論エラーの中に、直前の思考と行動を繰り返し生成し続ける ReAct 固有の頻出パターンがあります。論文はこれを「次に取るべき行動を推論できずループから抜け出せない失敗」と位置づけ、原因として貪欲デコーディングの最適でなさを疑い、ビームサーチなどより良いデコーディングが助けになるかもしれないと脚注で述べています(§3.3 脚注6)。
- 検索結果エラー: 失敗の23%は、検索が空を返すか有用な情報を含まないケース。一度起きると軌跡全体が脱線します。
暴走に「デコーディングを疑え」という筋が示されているのは実務上ありがたい話です。同じ出力を吐き続けるとき、最初に見るのはプロンプトではなくサンプリング設定になります。
限界と未検証点
- プロンプト方式では行動と推論の表現力に限りがある。行動空間が大きいタスクほど多くの実演が必要になり、それは容易に文脈長の上限を超える(§1、§6)。
- 人間の専門家には遠く及ばない。WebShop で ReAct 40.0% に対し人間59.6%。人間はもっと多く商品を見て検索語を練り直します(§4)。
- ベンチマークの正解ラベル自体が古びていることがある。ホテルの客室数の例では ReAct だけが最新の答えを取れたのにラベルと一致しませんでした(付録A.2)。
- 主実験のモデルが非公開。再現性は付録のプロンプトと GPT-3 実験に依存します。付録A.1では GPT-3(text-davinci-002)が HotpotQA 30.8、ALFWorld 78.4 で PaLM-540B(29.4 / 70.9)を上回ったと報告されています。
- 外部環境に繋ぐこと自体が危険。Ethics Statement は実験を Wikipedia と WebShop に限定し、実際の購入や編集はできない設計にしたと述べています。「エージェントの権限は絞れ」の根拠はこの時点で書かれていました。
現場ではこう使う
このループを実際に組むのは、社内ナレッジ検索や問い合わせ一次対応を作るアプリ開発者と、それを本番で回す基盤担当です。
触るパラメータ名。 OpenAI 系なら tools / tool_choice / parallel_tool_calls に temperature と max_tokens。Anthropic 系なら tools と stop_reason == "tool_use" の判定。フレームワークなら LangGraph の recursion_limit、AutoGen の max_consecutive_auto_reply。自作するなら MAX_STEPS・トークン上限・実時間上限の3点は必ず持つこと。論文が7/5ステップで打ち切っても正解率をほとんど落とさなかった事実が、その根拠になります。
落とし穴を3つ。 1つ目は同じ思考の再生産。直前と同一の tool_call が2回続いたら止めて別経路へ逃がす検出器を入れます(論文の ReAct→CoT-SC がまさにその設計)。2つ目は存在しない道具・引数を呼ぶ幻覚。JSON Schema で検証し、検証失敗を例外にせず観測として文脈へ返すと、モデルは次の一手で自己修正できます。3つ目はコストの2乗増。上限のないループは、事故に請求書で気づくことになります。
設計レビューでよく問われるのは「ReAct と CoT はどちらが優れているか」です。数字をそのまま答えれば十分——HotpotQA では 27.4 対 29.4 で負け、Fever では 60.9 対 56.3 で勝ち、最良は両者の切り替え。ReAct は幻覚を0%に落とす代わりに推論エラーを47%に増やす。内部知識と外部知識のどちらに寄せるかというトレードオフであって優劣ではない、と答えられれば十分です。
発想自体はRAGの基礎と地続きです。違いは、RAG が「取ってきて1回答える」のに対し、エージェントは「取るかどうか・何を取るかをモデル自身が推論しながら繰り返す」点。ステップが伸びるほど文脈は長くなるので、KVキャッシュの話がそのまま運用コストの話になります。
まとめ
- ReAct は行動空間に言語を足しただけの手法。思考は「観測を返さない行動」としてループに組み込まれる(§2、式(1))
- 結果は一様ではない。HotpotQA では CoT に負け、Fever では勝ち、決定タスクでは大差で勝つ(ALFWorld 71% 対 45%)
- 幻覚0%(CoT は56%)の代わりに推論エラー47%(CoT は16%)。暴走は貪欲デコーディングが疑われている(§3.3、表2、脚注6)
- ステップ上限は性能をほとんど削らない。論文自身が7/5ステップで打ち切っている
原論文: Yao et al., "ReAct: Synergizing Reasoning and Acting in Language Models" (arXiv:2210.03629, 2022 / v3)
コメント
コメントにはログインが必要です