ストーリー
ReActパターンとは
ReAct(Reasoning + Acting)は、LLMに「思考(Thought)」「行動(Action)」「観察(Observation)」のサイクルを繰り返させるフレームワークだ。
Thought: 問題について推論する
Action: 情報を取得する / ツールを実行する
Observation: 行動の結果を観察する
↓
Thought: 観察結果を踏まえてさらに推論する
Action: 次の行動を決定する
Observation: 結果を観察する
↓
(繰り返し)
↓
Final Answer: 最終回答を出力する
CoTとReActの違い
| 項目 | CoT | ReAct |
|---|---|---|
| アプローチ | 推論のみ | 推論 + 行動 |
| 外部情報 | 使わない | ツールや外部APIを活用 |
| 用途 | 計算・論理問題 | 調査・検索・複合タスク |
| 精度 | 知識範囲内で高い | 最新情報や外部データにも対応 |
| 自己修正 | 限定的 | 観察結果で軌道修正可能 |
ReActの基本構造
プロンプトテンプレート
あなたは以下のツールにアクセスできます:
- search(query): ドキュメントを検索する
- calculate(expression): 計算を実行する
- lookup(key): データベースから値を取得する
タスク: {ユーザーの質問}
以下の形式で回答してください:
Thought: まず何を考えるか
Action: 使用するツールとパラメータ
Observation: ツールの実行結果
(必要に応じてThought/Action/Observationを繰り返す)
Final Answer: 最終回答
実践例
例1: NetShop社の売上調査
あなたはNetShop社のデータアナリストです。以下のツールが使えます:
- query_db(sql): データベースにSQLクエリを実行する
- search_docs(keyword): 社内ドキュメントを検索する
- calculate(expr): 計算を実行する
質問: 「先月の売上が前月比で最も伸びたカテゴリはどれですか?その要因も教えてください」
---
Thought: 先月と前々月のカテゴリ別売上データを取得して比較する必要がある。
まずデータベースから売上データを取得しよう。
Action: query_db("SELECT category, SUM(amount) as total
FROM orders
WHERE order_date >= '2026-01-01' AND order_date < '2026-03-01'
GROUP BY category, DATE_TRUNC('month', order_date)
ORDER BY category")
Observation:
| category | month | total |
|----------|-------|-------|
| 家電 | 1月 | 1200万 |
| 家電 | 2月 | 1500万 |
| 食品 | 1月 | 800万 |
| 食品 | 2月 | 850万 |
| アパレル | 1月 | 600万 |
| アパレル | 2月 | 900万 |
Thought: 前月比の伸び率を計算する。
- 家電: (1500-1200)/1200 = 25%
- 食品: (850-800)/800 = 6.25%
- アパレル: (900-600)/600 = 50%
アパレルが最も伸びている。要因を調べよう。
Action: search_docs("アパレル 2月 キャンペーン 施策")
Observation: 2月にアパレルカテゴリで「春物先取りセール」を実施。
バレンタインギフトキャンペーンも同時開催。
Thought: データと社内ドキュメントの情報を統合して回答できる。
Final Answer: 先月(2月)に前月比で最も売上が伸びたカテゴリはアパレル(+50%、600万→900万)です。
主な要因は「春物先取りセール」と「バレンタインギフトキャンペーン」の同時開催です。
例2: 障害調査
Thought: アラートが発生した。まずエラーログを確認する。
Action: search_logs("ERROR", timerange="last_1h")
Observation: 「Connection refused: port 5432」が大量に出力されている。
Thought: PostgreSQLへの接続が拒否されている。DBサーバーの状態を確認する。
Action: check_service("postgresql")
Observation: PostgreSQLプロセスは起動しているが、max_connectionsに到達。
Thought: コネクション数の上限に到達している。接続元を特定する。
Action: query_db("SELECT client_addr, count(*) FROM pg_stat_activity GROUP BY client_addr")
Observation: app-server-03 から85本の接続がある(通常は20本)。
Final Answer: app-server-03からのDB接続が異常増加(85本、通常20本)し、
max_connectionsに到達したことが原因です。app-server-03のコネクションプール設定を確認してください。
ReActをプロンプトで実装するコツ
1. 利用可能なツールを明確に定義する
利用可能なツール:
1. search(query: string) - テキスト検索を実行
2. calculate(expression: string) - 数式を計算
3. api_call(endpoint: string, method: string) - APIを呼び出す
各ツールの入力形式と出力形式を厳密に記述すること。
2. 停止条件を設定する
以下の条件で推論を停止してください:
- 十分な情報が得られた場合 → Final Answerを出力
- 3回のAction/Observationサイクルで解決しない場合 → 現時点の分析結果と追加調査が必要な項目を出力
3. Observationのフォーマットを指定する
Observationは以下の形式で提供されます:
- 成功: [SUCCESS] 結果データ
- 失敗: [ERROR] エラーメッセージ
- 部分成功: [PARTIAL] 取得できたデータ + 不足情報
ReActの適用場面
| 適用場面 | 理由 |
|---|---|
| 情報収集タスク | 複数のソースから段階的に情報を集める必要がある |
| 障害調査 | 仮説→検証→修正のサイクルが必要 |
| データ分析 | クエリ→結果確認→追加分析の繰り返し |
| AIエージェント | ツール利用の基盤パターン |
まとめ
| 項目 | ポイント |
|---|---|
| ReActとは | 推論(Reasoning)と行動(Acting)を交互に実行するパターン |
| 構造 | Thought → Action → Observation のサイクル |
| CoTとの違い | 外部ツールやデータを活用できる |
| 適用場面 | 情報収集、障害調査、データ分析、AIエージェント |
チェックリスト
- ReActパターンのThought/Action/Observationサイクルを理解した
- CoTとReActの使い分けを判断できる
- ツール定義と停止条件の設定方法を把握した
- 実務でのReAct活用シーンをイメージできた
次のステップへ
次は「Self-Consistencyと多数決」として、複数の推論結果を統合する高度なテクニックを学ぼう。
推定読了時間: 30分