ADK-Rust v2 · CodeAct エージェント

モデルに書いてもらう ワークフロー。

CodeAct は、AI エージェントが短いプログラムを作成してアクションを実行する方法です。そのプログラムは、承認されたツールのみを呼び出し、その結果を通常のコードと組み合わせて、ADK-Rust ランタイムを通じて回答を返します。

cart_assistant.py
cart = call_tool("fetch_cart", args)
subtotal = sum(item["price"] * item["qty"]
               for item in cart["items"])
rate = call_tool("tax_rate", region)
total = subtotal * (1 + rate)
一時停止・ツール・再開
書く
走る
戻る
total = $141.57 · 3 cart lines

ここから始めましょう

CodeAct エージェントとは何ですか?

CodeAct エージェントは、executable コードを記述して、複数の承認されたツールがどのように連携するかを決定する AI エージェントです。 アプリケーションは制御されたインタープリターでそのコードを実行し、すべての外部アクションに対して責任を負い続けます。

従来のツール呼び出し

モデルは一度に 1 つのアクションを選択します。

  1. 01どのツールを呼び出すかをモデルに尋ねます。
  2. 02そのツールを実行し、その結果をモデルに送り返します。
  3. 03モデルに次に何をするかを尋ね、それを繰り返します。
モデル → fetch_cart → モデル → tax_rate → モデル → 答え

CodeAct

モデルは完全なプロシージャを記述します。

  1. 01利用可能なツールを使用してモデルに短いプログラムを依頼します。
  2. 02プログラムを実行し、実際のツールに到達した場合にのみ一時停止します。
  3. 03プログラムが応答を返すまで、ツールの結果を再開します。
モデル → 1 つのスクリプト ↔ 承認されたツール → 回答

簡単なたとえ

従来のツール呼び出しは、同僚に電卓のボタンを 1 つ押して画面を報告し、次の指示を待つように頼むようなものです。 CodeAct は、その同僚に小さなスプレッドシートの数式を書く許可を与えるようなものです。許可される入力は変わりませんが、計算には変数、条件、ループ、およびいくつかのステップを含めることができます。

このページに表示される 8 つの単語

モデル

スクリプトを作成する LLM。

エージェント

目標を行動と結果に変えるコンポーネント。

ツール

ビジネス データまたはシステムに到達する承認済みの Rust 関数。

スクリプト

現在のエージェントのターン用に書かれたショート プログラム。

ランタイム

execute およびスクリプトを一時停止するインタープリター。

観察

別のターンのためにモデルに返された結果またはエラー。

チェックポイント

一時停止したプログラムを保存し、後で続行できるようにします。

最終結果

入力された回答がアプリケーションに返されます。

アイデアはどこから来たのか

CodeAct は、エージェントのアクション言語に関する調査質問として始まりました。

初期のツール使用エージェントのほとんどは、アクションを自然言語、またはツール名と引数を含む JSON オブジェクトとして表現していました。研究者のXingyao Wang、Yangyi Chen、Lifan Yuan、Yizhe Zhang、Yunzhu Li、Hao Peng、Heng Jiは次のことを尋ねました。 executable Python はより表現力豊かなアクション形式になります.

彼らの論文、 「実行可能コードのアクションにより、より優れた LLM エージェントが導き出される」は、2024 年 2 月にリリースされ、ICML 2024 に登場しました。これは、API-Bank および論文の M³ToolEval ベンチマークで 17 の言語モデルを evaluated しました。著者らは、コード アクションは、テストしたテキストおよび JSON アクション形式よりも最大 20% 高い成功率を達成したと報告しました。

紙面でも紹介されました CodeActInstruct、7,000 のマルチターン インタラクションのデータセット、および execute コードに微調整された CodeActAgent モデルを使用して、結果を観察し、失敗したプログラムを修正して、会話を続行します。これらは、この論文の課題に関する研究結果です。コード アクションがすべての製品で自動的に優れているという意味ではありません。

なぜ CodeAct を使用するのでしょうか?

CodeAct

エージェントがツールと計算を組み合わせる必要がある場合、CodeAct は説得力があります。これにより、アプリケーションがツールとランタイムの境界を維持しながら、ロジックを表現するための使い慣れた言語がモデルに提供されます。

01

いくつかのツールを構成する

スクリプトは、いくつかの承認されたツールを呼び出し、1 つの結果を次のステップに直接渡すことができます。

02

実際の制御フローを使用する

ループ、条件、変数、並べ替え、フィルタリング、および算術は、コードで直接表現されます。

03

モデルのラウンドトリップを削減

何度かツールを選択する必要がある作業を、生成された 1 つのスクリプトで表現できる場合があります。

04

中間データをローカルに保持する

ランタイムは、モデル トランスクリプトに何が含まれるかを決定する前に、大規模なツールの結果をフィルタリングまたは集計できます。

05

exec可能性のある間違いを修正します

構文エラー、例外、または失敗したアサーションは、モデルが次のスクリプトを修正するために使用する観察となる可能性があります。

06

アクションを検査する

開発者は、生成されたプログラム、ツール呼び出し、出力、チェックポイントを execution トレイルとして読み取ることができます。

トレードオフ

いつ避けるべきですか?

たった一つの簡単なアクション

リクエストが 1 つのビジネス操作に明確にマップされている場合、通常の LlmAgent ツール呼び出しが簡単になります。

弱いコード生成

有効なコードを書くのに苦労しているモデルでは、構造化されたツールの呼び出しよりも多くの修正作業が必要になる場合があります。

安全なランタイムがない

生成されたコードには、明示的なアクセスとリソース制限を備えたインタープリターが必要です。無制限の eval または exec には決して渡さないでください。

完全なソフトウェア開発

リポジトリの編集、シェル コマンドの実行、または開発ワークスペースの操作が目的の場合は、CodingAgent を使用します。

ADK-Rust が CodeAct を実装する方法

CodeAct は、ADK-Rust ランタイム内で動作します。

CodeActAgent と並ぶエージェントタイプです LlmAgent。あなたはそれにモデルを与えます、 CodeRuntime、Rust ツール。次に、他の ADK-Rust エージェントが使用するのと同じ Runner、セッション、イベント、コールバック、認可、および出力システムを通じて実行します。

1.モデル

信頼性の高いコードを生成できる ADK-Rust モデル プロバイダーを選択してください。

2.CodeRuntime

Monty をサポートする Python ランタイムを使用するか、言語に依存しない CodeRuntime トレイトを実装します。

3. Rust ツール

入力したツールを登録します。スクリプトは、その呼び出し用に提供されたツールのみにアクセスできます。

4.Runner

ユーザーとセッションを使用してエージェントを実行し、通常の型の ADK-Rust イベントを消費します。

5. セッション

承認または長時間実行ツールによってプログラムが一時停止された場合でも、チェックポイントを保持します。

6. コントロール

確認、再試行、タイムアウト、コールバック、ガードレール、検証された出力を適用します。

最速の作業開始

最初にチェックインされたサンプルを実行します。

これは、決定論的モデル、実際の Monty Python インタープリター、2 つの Rust ツール、インメモリ セッション、および ADK-Rust Runner を使用します。モデル API キーは必要ありません。

Monty アダプターは現在実験的な Git 依存関係であり、Rust 1.95 以降が必要であるため、この例には独自のツールチェーン ファイルが含まれています。

端子
git clone https://github.com/zavora-ai/adk-rust.git
cd adk-rust/examples/codeact_monty_agent

# This example selects Rust 1.95 automatically.
cargo run
検証された出力
=== ADK-Rust CodeAct × Monty (Python) example ===

[cart_assistant]
{
  "lines": 3,
  "region": "CA",
  "subtotal": 132.0,
  "tax_rate": 0.0725,
  "total": 141.57,
  "user": "u-42"
}

Done.

建築

スクリプトはエージェント システム内で実行されます。

このモデルは、executable ロジックを提案します。 CodeRuntime は、そのロジックの進行方法を制御します。 ADK-Rust は、アプリケーションが認識するすべての外部アクション、永続チェックポイント、およびイベントを所有します。

ADK-Rust CodeAct アーキテクチャリクエストは、Runner および CodeAct エージェントを介してコード ランタイムに移動します。実行時ポリシーとセッション チェックポイントが execution を制御している間、ツール呼び出しは ADK-Rust にクロス バックします。1 つのリクエスト、1 つの executable プラン、すべての境界で制御実線の矢印はリクエストと結果を示します。破線の矢印は、一時停止、ポリシー、および永続的な状態を示します。製品ユーザーリクエストRunnerセッション + コンテキストCodeActAgentモデル ↔ スクリプト ループCodeRuntime開始・一時停止・再開ScriptOutput結果・観察・転送ADK-Rust ツール認証、再試行、コールバックセッション状態耐久性のあるチェックポイントランタイムポリシーファイル · 環境 · 制限call_tool はインタープリタを一時停止します。ホストは通話を解決し、同じ継続を再開します。

モデル

ランタイム ブリーフィングとこの呼び出しに使用できるツールを使用してスクリプトを作成します。

CodeRuntime

スクリプトをステップごとに実行し、呼び出し、完了、stdout、およびスクリプト エラーを明らかにします。

ADK-Rustホスト

承認とコンテキストを使用してツールを実行し、状態を保持し、最終結果をストリーミングします。

ソースに基づいた execution のウォークスルー

ケーススタディ: ショッピング カートの価格を CodeAct ターンで計算します。

これは、ADK-Rust リポジトリの決定論的な CodeAct × Monty の例に従います。各境界を選択して、システムのどの部分が動作しているのか、また次の部分に何が表示されるようになるのかを確認します。

Runner

リクエストはADK-Rustに入ります

Runner は、CodeAct エージェントが開始される前に、ユーザー、セッション、呼び出しコンテキスト、コールバック、および使用可能なツールをアタッチします。

可視信号

CA 税を含むカート u-42 の合計はいくらですか?

16

適切なエージェントの形状を選択する

CodeAct には特定の仕事があります。

モデルが作品をより明確にプログラムとして表現できる場合に使用します。 ADK-Rust は、会話ツールの使用と完全なソフトウェア開発環境のためのエージェント シェイプも提供します。

LlmAgent

会話形式でツールを選択して呼び出します。

以下に最適: 質問、対話、個別のビジネスアクション、そして自然な引き継ぎ。

モデル→ツール→モデル

CodeActAgent

ツールとロジックを 1 つの executable プランで構成します。

以下に最適: 分析、データ変換、バッチ作業、計算、および条件付きフロー。

モデル → スクリプト ↔ ツール → 結果

CodingAgent

ソフトウェア開発ハーネス内で作業します。

以下に最適: リポジトリの編集、シェル コマンド、ビルド、テスト、パッチ、およびコーディング エージェント プロトコル。

エージェント ↔ ワークスペース + シェル

Monty ランタイム

生成されたコードに明確な動作境界を与えます。

ADK-Rust の現在の Python アダプターは、Monty をインプロセスで実行します。ホストは、execution が開始される前に、スクリプトが何を読み取り、書き込み、認識し、消費できるかを決定します。

Monty はまだ実験段階です。現在、固定された Git 依存関係であり、Rust 1.95 以降が必要です。 Monty が crates.io で利用可能になるまで、アダプターは独自のクレート内に存在します。

デフォルトのサンドボックス

ファイルシステムへのアクセスがなく、環境が空です。ネットワークおよびサブプロセスの操作には、Monty サーフェスがありません。

明示的なマウント

選択したホスト ディレクトリを仮想パスにマップし、それぞれに対して読み取り専用または読み取り/書き込みアクセスを選択します。

リソース制限

進行ごとに時間の上限とメモリの上限を設定します。シリアル化された継続は、再開してもこれらの制限を保持します。

1つのツールフォーム

スクリプトは call_tool(name, args) を呼び出します。正確な名前付き引数はシリアル化されずに存続し、ADK-Rust で集中的にバインドされます。

管理された環境

タスクに必要な環境値のみを公開します。ホスト プロセス シークレットが自動的に継承されることはありません。

目に見える障害

構文エラーと例外は、修正可能なスクリプト フィードバックとしてモデルに返されます。ホストのランタイム障害により実行が停止します。

耐久性のあるexecution

一時停止されたプログラムは、永続的なエージェント状態になる可能性があります。

確認ゲート型ツールや長時間実行ツールでは、回答が存在する前にリクエストを終了する必要がある場合があります。 CodeAct は、一時停止したインタープリター、そのトランスクリプト、およびセッションへの保留中の呼び出しのスナップショットを作成するため、同じコード行から別の呼び出しを続行できるようになります。

01

前に保存する

外部ツールの実行が許可される前に継続を永続化します。

02

解決する

実行、承認、拒否、または保留中のツールの結果を待ちます。

03

後で保存

リカバリーが完了した呼び出しを繰り返さないように、戻り値を永続化します。

04

再開

チェックポイントをロードし、その呼び出し境界から同じスクリプトを続行します。

開発者の責任: 外部副作用の後、保存後のチェックポイントの前にクラッシュすると、そのツールが再度実行される可能性があります。非冪等ツールに冪等キーまたは別の重複アクション ガードを与えます。

実装

4 つの部分が完全なエージェントを定義します。

モデルを選択し、CodeRuntime を指定し、スクリプトが呼び出す可能性のあるツールを登録し、通常の ADK-Rust Runner を通じてエージェントを実行します。

ADK-Rust v2
use std::sync::Arc;
use adk_agent::codeact::CodeActAgent;
use adk_codeact_monty::MontyRuntime;

let runtime = MontyRuntime::builder()
    .environ_var("CART_USER", "u-42")
    .environ_var("TAX_REGION", "CA")
    .system_clock(true)
    .build();

let agent = CodeActAgent::builder()
    .name("cart_assistant")
    .model(model)
    .runtime(Arc::new(runtime))
    .instruction("Price the cart by writing Python.")
    .tool(Arc::new(fetch_cart))
    .tool(Arc::new(tax_rate))
    .output_key("priced_cart")
    .build()?;

CodeAct でビルドする

複数ステップのツールの会話を 1 つの読みやすいプログラムに変換します。

決定論的な例から始めて、すべての一時停止と再開を検査してから、製品がすでに使用しているモデルとツールを接続します。