ReActフレームワーク:Think、Act、Observe
モデルがThoughtを生成し、Actionを選択し、Observationを受け取り、Final Answerに到達するまで繰り返すReActループを理解します。
「ReActフレームワーク:Think、Act、Observe」はCoddyKit上の無料AI Engineering Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Engineering Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Engineering Academyコースには全4レッスンが含まれています。
ReActフレームワークとは
ReAct(Reasoning + Acting)は、モデルの内部推論と外部アクションを交互に実行するプロンプティングフレームワークです。モデルはすぐに最終回答を出すのではなく、Thoughtを生成し、Actionを選択し、そのアクションの実行結果としてObservationを受け取り、Final Answerを返せるようになるまでこのサイクルを繰り返します。
Think-Act-Observeループ
ReActループの各反復には、次の3つのフェーズがあります。
- Thought:モデルが既知の情報と、次に調べる必要がある情報について推論します。
- Action:モデルがウェブ検索、計算機、データベース検索などのツールを呼び出します。
- Observation:ツール呼び出しの結果が返され、モデルのコンテキストに追加されます。
モデルが結論とともにFinal Answer:を出力するまで、ループは続きます。
ReActトレースの例
ここでは、検索ツールを使って「What is the population of Tokyo?」に回答するReActエージェントの具体的なトレースを示します。各ステップが、前のObservationをもとに組み立てられていることに注目してください。
# ReAct trace (pseudocode showing the reasoning loop)
# Iteration 1
Thought_1 = 'I need to find the current population of Tokyo. I will search for it.'
Action_1 = 'search("Tokyo population 2024")'
Observation_1 = 'According to the 2023 census, Tokyo has approximately 13.96 million people in the city proper.'
# Iteration 2
Thought_2 = 'I have the population. I can now give a final answer.'
Final_Answer = 'The population of Tokyo is approximately 13.96 million people.'ReActが直接プロンプトより優れている理由
直接的なプロンプトでは、モデルは記憶だけを頼りに回答するため、事実に関する質問でハルシネーションが起こりやすくなります。Chain-of-Thoughtプロンプティングは推論を改善しますが、それでも外部情報にはアクセスできません。ReActはこの2つを組み合わせます。つまり、Chain-of-Thoughtのような明示的な推論トレースに加えて、ツール呼び出しによって最新情報を収集できます。
ReActプロンプトの構造
ReActのシステムプロンプトでは、モデルが使用する正確な形式を教えます。利用可能なツールとその説明を列挙し、Thought/Action/Observation/Final Answerのパターンの例を示します。モデルはプロンプトからこの形式に正確に従う方法を学習します。
REACT_SYSTEM_PROMPT = '''You are an AI assistant with access to these tools:
- search(query: str): Search the web for up-to-date information.
- calculator(expression: str): Evaluate a mathematical expression.
- lookup(topic: str): Look up a topic in the knowledge base.
Always follow this exact format:
Thought: [your reasoning about what to do next]
Action: tool_name(arguments)
Observation: [result of the action, provided by the system]
... (repeat as needed)
Final Answer: [your final response to the user]
Begin!'''Thought、Action、Observationの解析
アプリケーションコードは、ReActループのランタイムとして機能します。モデルの各レスポンス後に出力を解析してアクション名と引数を取り出し、対応するPython関数を実行し、結果をObservationとして整形してメッセージ履歴に追加し、再びモデルを呼び出します。
import re
def parse_react_output(text: str):
'''Extract action name and argument from a ReAct model output.'''
action_match = re.search(r'Action:\s*(\w+)\((.*)\)', text)
if action_match:
tool_name = action_match.group(1)
tool_input = action_match.group(2).strip('\"\' ')
return tool_name, tool_input
if 'Final Answer:' in text:
answer = text.split('Final Answer:')[-1].strip()
return 'final', answer
return None, Noneエージェントの実行ループ
実行ループはLLMを呼び出し、その出力を解析し、ツールを振り分け、Observationを追加して、これを繰り返します。モデルがタスクを解決できない場合に無限ループになるのを防ぐため、max_iterationsガードを使用します。
from openai import OpenAI
client = OpenAI()
def run_react_agent(user_query: str, tools: dict, max_iterations: int = 10) -> str:
messages = [
{'role': 'system', 'content': REACT_SYSTEM_PROMPT},
{'role': 'user', 'content': user_query}
]
for i in range(max_iterations):
resp = client.chat.completions.create(model='gpt-4o', messages=messages)
output = resp.choices[0].message.content
messages.append({'role': 'assistant', 'content': output})
tool_name, tool_input = parse_react_output(output)
if tool_name == 'final':
return tool_input
if tool_name and tool_name in tools:
observation = tools[tool_name](tool_input)
messages.append({'role': 'user', 'content': f'Observation: {observation}'})
else:
messages.append({'role': 'user', 'content': 'Observation: Tool not found.'})
return 'Max iterations reached without a final answer.'シンプルなツールを登録する
ツールは単なるPython関数です。ツール名から関数へのマッピングを辞書に登録します。関数は文字列の引数を受け取り、文字列の結果を返します。これによりインターフェースがシンプルになり、モデルがObservationとして受け取る形式とも一貫します。
import math
def calculator_tool(expression: str) -> str:
try:
# Restrict to safe math expressions
allowed_names = {k: v for k, v in math.__dict__.items() if not k.startswith('_')}
result = eval(expression, {'__builtins__': {}}, allowed_names)
return str(result)
except Exception as e:
return f'Error: {e}'
def search_tool(query: str) -> str:
# Stub — replace with real web search API
return f'Top result for "{query}": [placeholder result]'
# Register tools
tools = {
'calculator': calculator_tool,
'search': search_tool
}ReActによるマルチホップ推論
ReActは、複数の情報をつなぎ合わせる必要があるマルチホップ質問で特に効果を発揮します。たとえば、「GPT-4を開発した会社のCEOは誰で、その会社は何年に設立されたか?」という質問です。エージェントはまずCEOを検索し、その結果を使って会社の設立年を調べます。これは、推論によってつながれた2つの別々のツール呼び出しです。
ReActと純粋なChain-of-Thoughtの比較
Chain-of-Thought(CoT)は、モデルに段階的に考えさせることで推論を改善しますが、外部情報にはアクセスできません。ReActはCoTにアクションを追加し、モデルが実際のデータを取得したり、計算を実行したり、事実を検証したりできるようにします。代わりに、ReActは複数のAPI呼び出しを行うため低速ですが、最新情報や専門知識が必要なタスクでははるかに正確です。
トレースを使ってReActをデバッグする
ReActエージェントが誤った回答を生成した場合は、Thought/Action/Observationの完全なトレースを確認します。よくある失敗パターンには、ツールを呼び出さずにモデルがObservationを捏造する、解析エラーによってツールの実行が省略される、Thoughtステップでの推論が誤って間違ったアクションを選択する、といったものがあります。
- コンテキストに追加されたすべてのメッセージをログに記録します
- 次にモデルを呼び出す前に、ツールの出力が実際に追加されていることを確認します
- アクションの正規表現がモデルの出力形式に一致していることを確認します
理解度チェック
ReActフレームワークについて、理解度を確認しましょう。
レッスンのまとめ
このレッスンでは、ReActはThought、Action、Observationをループ内で交互に実行すること、アプリケーションコードはツールを実行してObservationを追加するランタイムとして機能すること、max_iterationsガードはエージェントの無限ループを防ぐことを学びました。次は、エージェントがアプリケーションに必要な処理を正確に実行できるよう、カスタムツールを定義する方法を学びます。
よくある質問
「ReActフレームワーク:Think、Act、Observe」レッスンは無料ですか?
はい。「ReActフレームワーク:Think、Act、Observe」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Engineering Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Engineering Academyコースには全4レッスンが含まれています。
「ReActフレームワーク:Think、Act、Observe」で何を学びますか?
モデルがThoughtを生成し、Actionを選択し、Observationを受け取り、Final Answerに到達するまで繰り返すReActループを理解します。 ブラウザで直接実行するハンズオンコードでAI Engineering Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Engineering Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Engineering Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「ReActフレームワーク:Think、Act、Observe」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Engineering Academyレッスンでコードを書いて実行できますか?
はい。すべてのAI Engineering Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ReActフレームワーク:Think、Act、Observe
- Agent用Toolの定義
- LangChainでReAct Agentを構築する
- エージェントの失敗とループへの対処