03

2:46 - 5:22

汎用エージェントループとミドルウェアの調整点

この章の要点

エージェントの最小構成は、リクエストを受け取り、LLM(大規模言語モデル)が考え、必要ならツールを使い、その結果をもう一度LLMに返すループです。高度なハーネスは、この基本構造を捨てません。その周りにミドルウェア(middleware)、フック(hook)、要約、コンテキストのオフロードなどを加えます。

1. まず、一般的なループを見る

Harrison Chaseは、エージェントの一般的なアーキテクチャを、LLMを中心にしたループとして説明します。ここでいう「一般的」は、すべての製品が同じ動きをするという意味ではありません。多くの異なるハーネスに共通する、最小限の考え方という意味です。

流れは次のとおりです。

  1. ユーザーまたは別のシステムからリクエストを受け取ります。
  2. ハーネスが、その時点で必要なコンテキストをLLMに渡します。LLMは次の応答を生成します。
  3. 応答がツールの使用を求めている場合、ハーネスはそのツールを呼び出します。
  4. ツールが外部システムで処理し、結果を観測結果(observation)として返します。
  5. ハーネスは観測結果をLLMに戻します。LLMはその新しい情報を使って、次の行動または最終回答を生成します。

重要なのは、ツール呼び出しがエージェントの実行を自動的に終わらせないことです。たとえば、LLMがファイルを読むツールを呼び出したとします。ファイルの内容が観測結果として戻ると、LLMはその内容を読んで、さらに別のツールを呼ぶことも、ユーザーに回答することもできます。この「生成、ツール、観測、再生成」の繰り返しが、エージェントの中心です。

図:汎用エージェントループと、より詳しいハーネスの流れを並べたスライドです。

図は、リクエストがモデルに入り、必要ならツールが動き、観測結果がモデルへ戻り、最後に結果が返る流れを示しています。右側の詳しい流れには、エージェント、モデル、ツールの呼び出しを囲むフックも置かれています。これは基本ループと、そこに処理を追加したハーネスを対比する図です。

2. ループの周りに処理を差し込む

同じ基本ループでも、ハーネスによって実装は大きく異なります。ミドルウェアやフックは、モデルやループそのものの代わりになるものではありません。実行中の流れの前後に処理を差し込むための場所です。プラグインも、このような拡張の仕組みとして考えられます。

話の中で示される主な調整点は、次のとおりです。

  • エージェントを呼び出す前(before_agent
  • 各モデル呼び出しの前(before_model
  • モデル呼び出しを包む処理(wrap_model_call
  • ツール呼び出しを包む処理(wrap_tool_call
  • モデル処理の後(after_model
  • エージェント処理の後(after_agent

たとえば、モデルを呼ぶ前に入力を確認し、モデル呼び出しを包む処理でログを残し、ツール呼び出しを包む処理で結果の形式を整える、といった設計ができます。これらは、リクエストから結果までのループを保ったまま、特定の用途に必要な動作を追加します。

図:最小のエージェントループと、より多くのライフサイクル処理を含むハーネスを比較したスライドです。

このスライドは、最小のループと、エージェント・モデル・ツールの呼び出しを囲む詳しいライフサイクルを左右に並べています。最小の流れを残したまま、前後の処理やラッパーを増やせることが分かります。図の比較は構造を示すものであり、すべてのハーネスが同じ詳細手順を持つという主張ではありません。

図:フックとラッパーを基本ループの周りに置いた、カスタマイズ可能なエージェントフローです。

この図では、before_agentbefore_modelwrap_model_callwrap_tool_callafter_modelafter_agentという調整点が、基本的なリクエスト・モデル・ツール・結果の流れの周りに明示されています。したがって、カスタマイズは必ずしも別のアーキテクチャを一から作ることではありません。既存のループの適切な場所に処理を置くことも、重要なカスタマイズです。

3. ハーネスが与える能力

ハーネスは、ループを動かすための能力(capability)も用意します。話の例には、サンドボックス、ファイルシステム、サブエージェント、メモリーへのアクセスがあります。ここでのサンドボックスは、エージェントが作業する実行環境です。サブエージェントは、作業の一部を別のエージェントに任せる仕組みです。メモリーは、後の実行でも使える情報を扱います。

たとえば、コード作業をするエージェントなら、ハーネスが作業用の環境とファイルへのアクセスを渡します。エージェントはそこでファイルを読み、編集ツールを使い、結果を観測して次の判断をします。調査の一部をサブエージェントに任せる場合も、中心にある「生成して、ツールを使い、観測して、続ける」ループは同じです。

4. 長いコンテキストを管理する

ループを長く続けると、会話やツールの結果が増えます。そこで、モデルを呼び出す前にコンテキストが長すぎないかを確認します。長すぎる場合は、必要な内容を要約してからモデルを呼び出します。要約の目的は、現在のモデル呼び出しに必要な情報を、扱える大きさに減らすことです。

要約とコンテキストのオフロード(context offloading)は似ていますが、同じではありません。要約は、長くなったコンテキストを短くしてから呼び出す方法です。一方、オフロードは、大きなツール呼び出しを包み、その内容をアクティブなコンテキストにすべて残さず、外部へ書き出す方法です。つまり、前者は情報を縮め、後者は大きな内容を現在のコンテキストの外へ移します。

図:実行環境、委任、操作、コンテキスト管理に分けて示したdeepagentsハーネスの事例スライドです。

この事例スライドは、基本のdeepagentsハーネスを、実行環境、委任、操作、コンテキスト管理という要素に分けています。コンテキスト管理の中に、コンテキストのオフロードが示されています。ただし、この画像自体は、ツール呼び出しを包んで内容を書き出す具体的な手順までは示していません。その手順は、話の中の説明として理解してください。

まとめ

この章のポイントは、汎用ループと高度なハーネスを対立させないことです。リクエスト、生成、ツール呼び出し、観測、再生成という核を保ちながら、フックやミドルウェアで処理を加えられます。用途に応じて実行環境、ファイル、サブエージェント、メモリーを与え、長くなったコンテキストは要約またはオフロードで管理します。こうして、共通のループを出発点に、必要な制御だけを段階的に足せます。

なお、この区間の文字起こしには、移行部分の重複や言い直しがあります。また、製品名の一つが「Quad Code」と聞こえる箇所は、正確な綴りが不確かです。この章では、その名前を技術的な根拠として広げず、ループと調整点について確認できる内容に絞っています。

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