10

14:23 - 16:34

Claudeエージェントのツール・ループの内部

この章では、話者が示す小さなPythonのClaudeエージェントを、処理の順番に沿って読みます。大切なのは、LLMが考えたように見えることと、外部のツールが実際に動くことを分けて考えることです。

以下は、話者のコード説明を整理したものです。スライドにはループの形が示されていますが、ここでは不確かな変数名や細かいPythonの構文を再現しません。話者が伝えている処理の役割と流れに集中します。

まず、コード全体の地図を見る

この例には、モデル、プロンプト、メッセージ、ツール、そしてそれらをつなぐクライアントがあります。クライアントは、LLMへの依頼と外部処理を担当する周囲のプログラムです。処理は次のように分かれます。

  1. モデルとプロンプトから、LLMへのリクエストを作ります。
  2. LLMから返ったレスポンスを調べます。
  3. stop_reason(生成が止まった理由)を見て、次の処理を選びます。
  4. ツールの使用が必要なら、レスポンスに入ったツール名やパラメーターを、別のツール実行処理に渡します。
  5. ツールの結果を、続きの処理で使えるように現在の文脈へ追加します。
  6. ツールが必要でなければ、レスポンスの文章を最終的な答えとして表示します。

LLMがすることと、しないこと

話者の説明では、LLMそのものは、次に来そうな語を確率的に生成する仕組みです。LLMが外部のツールを直接実行するわけではありません。LLMは、問題を解くためにツールが必要だと判断すると、ツールを使うための情報を含むレスポンスを返します。

そのレスポンスには、ツール呼び出しの提案、そのパラメーター、処理を続けるための文脈、そしてプロンプトに関係する情報が入ります。ここで返ってくるのは「このツールを、この値で呼び出してほしい」という提案です。外部処理が完了したという意味ではありません。

生成と実行の境界を、例で確認する

例(学習用):利用者が「東京の天気を調べてください」と頼んだとします。LLMは、天気ツールを使うことと、場所を東京にすることをレスポンスで示せます。しかし、実際に天気サービスへリクエストを送るのは、クライアント側のツール実行処理です。この例は、話者の説明する「提案」と「実行」の分担を理解するための補足です。

while-trueが作るエージェント・ループ

コードの中心にはwhile-trueのループがあります。このループは、LLMへの依頼、レスポンスの確認、ツールの実行、結果の追加を繰り返します。これにより、エージェントは問題を一回だけ説明して終わるのではなく、必要に応じて観察し、判断し、行動を続けられます。

一回の反復(はんぷく)は、次の流れです。

  1. クライアントが、モデル、プロンプト、メッセージ、利用できるツールを使ってLLMに依頼します。
  2. LLMが、文章で答えるか、ツール呼び出しを提案します。
  3. プログラムがstop_reasonを読みます。
  4. ツール使用を示す理由なら、プログラムがレスポンスをget-toolと呼ばれる実行処理へ渡します。
  5. 外部のツールが動き、その結果が現在の文脈に加えられます。
  6. ループは更新された文脈を使って、LLMにもう一度依頼します。

ここでstop_reasonは、単なる説明文ではありません。プログラムが分岐するための制御(せいぎょ)メタデータです。ツール使用で生成が止まったことを示せば、周囲のプログラムは提案された呼び出しを実行します。ツール使用ではなく、最終的な文章を返す理由なら、プログラムはツールを呼ばずに答えを表示します。

このwhile-trueは便利ですが、前の章で見たループの危険性も持ちます。終了条件や別の分岐が正しく働かなければ、処理は無限に続く可能性があります。エージェント同士のやり取りでは、会話の方向が少しずつずれるドリフトも起こりえます。反復が続けば、文脈に含まれるトークン数が増え、費用も上がる可能性があります。今回のコード例は、この危険を完全に解決する設計ではありません。どこでループが続き、どこで別の処理へ進むかを見えるようにしています。

図1: Claudeエージェントのループが、モデルへのリクエスト、予測されたツール呼び出し、ツール結果の追加、最終レスポンスの表示を繰り返す様子です。

このスライドは、話者が説明するPythonのパターンを直接示しています。while-trueの中で、モデルはツール呼び出しとそのパラメーターを提案するか、文章で処理を終えます。ツールが動いた場合、その結果は進行中の文脈に戻されます。スライドの横の部分には、二つの検証ゲートも見えますが、この章ではまずツール・ループの流れに注目します。

二つ目のスライドで、分岐と反復を追う

図2: stop_reasonを確認し、ツール呼び出しを実行し、その結果を追加してループを続ける処理を示すスライドです。

このコードのスライドは、話者が説明した二つ目のコード部分を見える形にしています。ツール使用を示すstop_reasonが返ると、プログラムはツール呼び出しを取り出して実行します。その後、結果を現在の文脈に加え、同じ問題についてLLMに処理を続けさせます。つまり、LLMのレスポンスがそのまま外部の行動になるのではなく、クライアントが間に入り、レスポンスを読んで実行します。

この例をエージェントとして理解する

この構造は、エージェントを「問題を受け取り、判断し、行動するシステム」として見る考え方につながります。モデルは問題を解釈し、次のツール呼び出しに必要な情報を組み立てます。ツールは外部の情報を返したり、外部の行動を実行したりします。クライアントのループは、その結果を次の判断に渡します。したがって、エージェントの能力はLLMだけにあるのではありません。モデル、ツール、そして両者をつなぐ制御処理が一緒に働いています。

最も重要な区別

「LLMがツールを呼び出した」という言い方は便利ですが、内部では二つの段階があります。

  • 生成:LLMが、必要なツールとパラメーターを確率的に提案します。
  • 実行:クライアントがその提案を受け取り、外部のツールを実際に呼びます。

この区別があるからこそ、後の処理で提案を確認できます。話者の講演全体では、その確認にオントロジーやバリデーターを使う考え方へ進みます。この章のコード例は、その検証が入る前の基本的な境界とループを示しています。

100% スペースキーとドラッグで移動 | Ctrl/Cmdとホイールで拡大縮小