ReActとは何か

ReActは「Reasoning + Acting」を組み合わせた造語で、2022年にGoogleとPrincetonの研究者が発表した論文に由来します。LLMに対して「思考(Thought)→ 行動(Action)→ 観察(Observation)」のサイクルを繰り返させることで、複雑なタスクを段階的に解決させる手法です。

従来のLLMは質問に対して一度だけ回答を生成するだけでした。ReActではLLMが自ら「次に何をすべきか」を考え、ツールを呼び出し、その結果を見て次の思考につなげます。この反復ループがあることで、単純な質問応答では不可能だった複数ステップの問題解決が可能になりました。

Reasoning + Acting のサイクル

ReActの動作を具体例で見てみましょう。「東京の今日の天気を調べて、明日の服装を提案して」というタスクを与えた場合、エージェントは以下のように動きます。

Thought(思考)

まず天気情報を取得する必要があると判断します。天気APIを呼び出すのが適切だと考えます。

Action(行動)

天気取得ツールを呼び出します。呼び出すツールの名前と引数(都市名・日付)をLLMが生成します。

Observation(観察)

ツールから返ってきた結果(気温・天気)をコンテキストに追加します。

次のThought

「最高気温13度・雨」という情報をもとに、服装の提案を考えます。この段階では外部ツール呼び出しは不要なので、直接回答を生成して終了します。

このT-A-Oサイクルは、タスクが完了するまで繰り返されます。最大ループ回数の設定をしないと無限ループのリスクがあるため、実装では必ず上限を設けます。

LangChainでのReAct実装

PythonでReActエージェントを作る最もシンプルな方法はLangChainを使うことです。

from langchain.agents import create_react_agent, AgentExecutor
from langchain_core.prompts import PromptTemplate
from langchain_anthropic import ChatAnthropic
from langchain.tools import tool

@tool
def get_weather(city: str) -> str:
    """指定した都市の現在の天気を返す"""
    # 実際にはAPIを呼び出す
    return f"{city}の天気: 曇り、気温13度"

llm = ChatAnthropic(model="claude-opus-4-5")
tools = [get_weather]

prompt = PromptTemplate.from_template("""
以下のツールを使って質問に答えてください。

ツール一覧:
{tools}

形式:
Thought: [次に何をすべきか考える]
Action: [ツール名]
Action Input: [入力値]
Observation: [ツールの結果]
... (繰り返し)
Final Answer: [最終回答]

質問: {input}
{agent_scratchpad}
""")

agent = create_react_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, max_iterations=5)
result = executor.invoke({"input": "東京の今日の天気に合わせた服装を教えて"})

max_iterations=5 が無限ループ防止の安全弁です。複雑なタスクでは10〜15程度に設定することが多いですが、コストとのバランスを考える必要があります。

Claude Codeの場合

Claude Code自体もReActの考え方に基づいて動作しています。ユーザーからの指示を受けたとき、Claude Codeは内部的に以下を繰り返します。

  • ファイルを読んで(Action)現状を把握(Observation)
  • 何を変更すべきか考え(Thought)ファイルを編集(Action)
  • テストを実行して(Action)結果を確認(Observation)
  • エラーがあれば修正方針を立て直す(Thought)

ツールはBash、Read、Edit、Writeなど複数あり、LLMがその場で最適なツールを選択します。1つのユーザー指示に対して10〜30ターンのループが走ることもあります。

ReActの限界と注意点

ReActは強力ですが、いくつかの課題があります。

コストの増大

T-A-Oサイクルのたびにトークンが消費されます。思考テキストもプロンプトに含まれるため、長いチェーンでは費用が積み上がります。不要にループを回さない設計が重要です。

誤った推論の連鎖

1ステップ目の判断ミスが後続のステップに影響します。特に「ツールを呼ぶべきか否か」の判断を誤ると、必要のない行動を続ける場合があります。

ツール設計の重要性

ツールの説明文(docstring)の質がエージェントの精度に直結します。「何を受け取って何を返すか」を明確に書くことが、意図した動作を引き出すポイントです。

まとめ

ReActは現代のAIエージェントの根幹にある考え方で、Claude CodeやLangChainをはじめ多くのフレームワークが採用しています。Thought-Action-Observationのループを理解することで、エージェントがなぜそう動いたかを解読できるようになります。自前でエージェントを構築するときも、まずこの3ステップを意識した設計から始めると整理しやすいでしょう。