大きな画面での利用をおすすめします — アニメーションと操作がより快適になります。
入力

ReAct ループ

ReAct は、言語モデルの推論とツールの利用を交互に進める方式です。Thought → Action → Observation の順に、次に必要な情報を書き、ツールに取得を依頼し、その結果を読んでから推論を続けます。モデルの学習済み知識だけでは答えられない質問にも対応でき、回答に至る記録を確認できます。

コンテキストは調査ノートに似ています。質問、思考、アクション、ツールの結果を書き加え、モデルは呼び出しのたびにノートを読みます。このレッスンには、ノートとは別にタスクの状態を保存する隠れたメモリはありません。次のターンで必要な情報は、コンテキストに残す必要があります。モデルには学習済みの知識もありますが、今回の検索結果を記録する代わりにはなりません。

本レッスンのモデル出力は、claude-opus-5-5 による実際の実行を記録したものです。各方針の特徴が表れる実行を一つずつ選び、文言は変更していません。ツールは同じ知識ベースに対して再実行するため、画面の観測は検索関数が返した値です。

ReAct ループの仕組み

ループはターン数の上限内で三つの処理を繰り返します。モデルは一回の生成でまず Thought: に次の一手を書き、続けて Action: を書きます。例えば search["Mara Voss"] や finish[1974] です。finish は回答を返してループを終了します。ツールを実行するのはランタイムで、戻り値は Observation: として記録に追加されます。

モデルはテキストを生成し、ランタイムはアクションを解析してツールを実行し、結果を書き戻します。画面では、クエリと結果が runtime の入口を通って破線の境界を越えます。左がモデルのコンテキスト、右が外部世界です。モデル自身に観測結果を書かせると、ツールの戻り値という根拠を失います。

観測の後に書かれた思考は、その内容を引用できます。記録された実行では、映画監督 Mara Voss の名前を検索ページから読み取り、画面の線が思考と参照元の観測を結びます。三つの方針が答える質問は共通です。Aurora Run の監督は何年生まれか? 答えには二段階の検索が必要で、知識ベースは全四ページです。最初のページは同名小説の項目で、作者の生年「1951」という紛らわしい情報が含まれます。その近くに、必要な事実である「2011 年の映画は Mara Voss が監督した」という記述があります。

ステップごとの解説

既定の方針は完全な ReAct です。以下は記録された実行の順序で、ページ番号は画面の 1–4 に対応します。

  1. 開始。 ノートには質問だけがあり、右の知識ベースは未読です。
  2. ターン 1:思考。 モデルはまず Aurora Run の監督を突き止める必要があると考えます。これはサブゴールで、まだ回答ではありません。
  3. ターン 1:アクション。 search["Aurora Run"] を書きます。この時点では未実行で、アクションはまだテキストです。
  4. ターン 1:検索。 ランタイムがクエリを知識ベースに渡すと、ページ 1 のタイトルが一致します。
  5. ターン 1:観測。 結果には、Aurora Run が Henrik Dahl(1951 年生まれ)による 1998 年の小説で、2011 年の映画は Mara Voss が監督したとあります。必要な事実と紛らわしい年が同時に記録されます。
  6. ターン 2。 モデルは、映画の監督は Mara Voss で、1951 年生まれの Henrik Dahl は小説の作者だと書き、Voss の生年が必要だと判断します。紛らわしい年を名指しして退けています。参照した観測との実線に注目してください。続く search["Mara Voss"] はページ 2 を取得し、Mara Voss が 1974 年生まれのノルウェーの映画監督だと分かります。
  7. ターン 3:思考。 直前のページを根拠に、2011 年の映画監督は Mara Voss で、生年は 1974 年だと確認します。
  8. ターン 3:アクション。 finish[1974] で終了します。
  9. 判定。 1974 は正解で、二段階とも取得したページにたどれます。

方針を切り替えて比較します。推論のみ(Reason only)は二回考え、ツールを使いません。記録されたモデルはこの映画も監督も確かには覚えていないと認めますが、出力形式は具体的な年を要求します。そのため「典型的な現代の監督を想定した確信度の低い推測」として 1975 と答えます。惜しいものの、不正解です。最後にページ 1 と 2 が光り、一度も参照しなかった事実が示されます。

行動のみ(Act only)は ReAct と同じ二回の検索を実行し、1974 と正答します。1951 年という紛らわしい情報も避けています。ただし、記録の脇には根拠を結ぶ線がありません。思考を書いていないためです。Aurora Run を検索する判断、Mara Voss の抽出、誤った候補の除外は、観察できる記録として残りません。三つの実行では線の違いを見てください。ReAct の思考には観測への実線、推論のみには以前の思考への赤い破線があり、行動のみには思考と根拠を結ぶ線がありません。

ループが必要な理由

二回目のクエリ search["Mara Voss"] は、一回目の検索で監督の名前を読んでから作れます。結果を読む前にこの具体的なクエリを計画へ書くには、まだ得ていない事実が必要です。ループによって、次の判断に新しい証拠を使えます。

行動のみでも正答するなら、思考を書く利点は何でしょうか。この小さな課題では、主な利点は検証のしやすさです。モデルは毎回記録全体を読むため、制作時に記録した行動のみの実行でも、通常は二段階を処理できました。一方、ReAct では誤った年を避けた理由が書かれ、引用元のページと結ばれます。行動のみがある時 1951 と答えた場合、原因を調べるためのサブゴールは記録にありません。推論のみは外部の事実を確認できず、確認できないと認めても、この課題の出力形式では年を推測することになります。

この実装では一ターンにモデルを一回呼び出し、思考とアクションをまとめて生成します。ツール呼び出しは最大一回です。記録はターン数に応じて増え、各呼び出しがそれまでの内容を読み直すため、長い実行では一段階ごとの費用も増えます。上限は max_turns = 4 で、三つの記録はいずれも上限内に完了します。思考を加えると各呼び出しのトークンは増えますが、呼び出し回数は増えません。この二段階の課題では正答率も上がりません。長い課題では、サブゴールがモデルの参照情報と人の検証記録の両方になります。その効果は課題に応じて確かめる必要があります。

次の判断を下すのはモデルです。実行基盤はツールを提供し、アクションを解析して観測を返します。本レッスンのランタイムは、思考の内容や使うツールを決めません。アプリケーションを作る際は、この役割分担を区別してください。

境界ケース

  • 検索に一致がない。 “No matching page found.” が通常の観測として返り、モデルはクエリを変えられます。三つの記録では発生しませんが、プロトコルは同じ形で扱います。
  • ターン数を使い切る。 max_turns までに finish が出なければ、回答なしで終了します。記録された実行はすべて間に合います。
  • アクションの形式が不正。 この最小構成には、解析できないアクションへの処理がありません。実用のランタイムではエラーを捕捉し、観測として返して修正の機会を与えます。
  • 根拠自体が誤っている。 ReAct はツールの結果を追跡できますが、知識ベースの正しさは保証しません。引用がそろった誤答も起こり得ます。

よくある間違い

  • コンテキスト外のタスク状態が残ると思う。 このレッスンに隠れたタスクメモリはありません。次のターンに必要な情報は記録へ残します。
  • モデルに観測を書かせる。 ツールを実行するのはランタイムです。この境界を省くと、観測に見えるものが推測になります。
  • 一度の同じ回答を同じ能力と考える。 二段階の課題で行動のみが正答しても、実運用への一般化はできません。書かれていない推論は直接検査、再生、デバッグできません。
  • 自信や慎重な口調を正しさの基準にする。 推論のみは不確実さを認めながら、誤った年を答えます。出力形式も挙動に影響するため、口調より根拠を確認します。
  • ツール実行後に finish を調べる。 終了判定を先に行わないと、最終回答を検索クエリとして送ってしまいます。

このレッスンでの簡略化

使うのは二つのツール、小さな知識ベース、二段階の検索です。各方針のテキストは claude-opus-5-5 の記録を変更せずに使い、ツールを再実行します。実用システムには、ツールのスキーマ、堅牢なアクション解析、エラー処理、再試行、トークン予算、長い記録の圧縮や要約も必要です。これらは同じループの上に加える仕組みです。