学習内容
このクイックスタートを終えると、Weave と互換性のある OTel スパンを出力する、動作可能なマルチターンエージェントが完成します。また、Weave が会話、ターン、LLM Call、ツール呼び出しをエージェントのコードにどのように対応付けるかを理解し、独自のカスタムエージェントにも同じパターンを適用できるようになります。 このガイドのコードでは、Wikipedia で情報を調べられる小規模な調査エージェントを構築します。3 つの質問 (3 ターン) を行い、回答を得るために Wikipedia を検索するタイミングを LLM で判断します。Weave はすべてのステップ (会話、各質問、各 AI 応答、各 Wikipedia ルックアップ) を記録するため、Weave Agents ビューで何が起きたかを確認できます。 このガイドでは、次の方法を説明します。weave.init()を使用して、エージェントのトレース用に Weave を初期化します。start_conversation/startConversationとstart_turn/startTurnを使用して、会話とターンを開始します。start_llm/startLLMで LLM Call をラップし、使用量を記録します。start_tool/startToolでツール実行をラップし、結果を記録します。- トークン数とコストがレンダリングされるように、すべてのトークン使用量と料金を算出できるモデルを記録します。
- Agents ビューで、記録された会話、ターン、ツール呼び出しを確認します。
Weave SDK がエージェントでどのように動作するか
Weave SDK には、エージェント向けの汎用 OTel インジェストシステムが含まれており、Weave はエージェントのコード内の任意の OTel スパンから情報を取得できます。ただし、Weights & Biases UI の Agents ビューでエージェントのトレースをレンダリングするには、Weave は以下のスパンに対して特別な処理が必要です。
Python では、4 つの関数すべてがコンテキストマネージャーとして機能します (
with weave.start_*(...) as obj:)。終了時に、スパンと属性をフラッシュし、例外時も含めて終了します。TypeScript では、返された各オブジェクトで .end() を呼び出します。例外時のクリーンアップを保証するために try { ... } finally { obj.end(); } を使用してください。
その他の GenAI semantic-convention attributes、例えば gen_ai.usage.* や gen_ai.agent.name は追加のレンダリングを可能にしますが、オプションです。
前提条件
- CoreWeave Forge アカウントと APIキー。
- OpenAI APIキー。
- Python 3.10 以上 (Python の例の場合) 。
- Node.js 18 以上 (TypeScript の例では組み込みの
fetchが必要です) 。
パッケージをインストールする
以下のパッケージを開発環境にインストールしてください:Weave の初期化
weave.init() は W&B で認証を行い、Agents ビューにエージェント スパンを送信する OTel エクスポーターを設定します。project がチームに存在しない場合、Weave は初めて書き込むときに作成します。
ツールを定義する
次のコードは、エージェントの Wikipedia 検索ツールと、ツールをいつ、どのように使用するかを指定する OpenAI ツールスキーマを定義します。トレースするマルチターンエージェントを実行する
ツールと Weave の初期化が完了したら、次のステップではそれらを組み合わせて完全なエージェントループを構築します。このループは、会話、ターン、LLM Call、ツール呼び出しがどのようにネストするかを示します。 次の例では、1 つの会話で 3 つのターンを実行します。各ターンでは、次の処理を行います。chatスパンを開始し、ツールを呼び出すかどうかを LLM に判断させます。- LLM がツールをリクエストした場合、呼び出しを囲む
execute_toolスパンを開始し、結果を LLM に返します。 - 2 つ目の
chatスパンを開始して、最終回答を生成します。
トークン使用量とコストを記録する
各chat スパンには、トークン使用量とモデル ID が含まれます。Weave は使用量からトークン数をレンダリングし、使用量とモデル ID からコストを算出します。そのため、値が不完全であったり価格を算出できなかったりすると、トレースの他の部分が正しく見えていても、トークンが 0 in / 0 out、またはコストが Cost - と表示されます。record(...) を使用すると、これらのフィールド (output_messages、response_id、reasoning なども含む) を 1 回の呼び出しで設定できます。適用されるのは、渡したフィールドのみです。
コストを表示するには、次の 2 点が正しく設定されている必要があります。
- 完全な使用量。
input_tokensは、キャッシュされたトークンを含む入力の合計です。Weave はキャッシュ読み取りとキャッシュ書き込みをそれぞれ独自の料金で計算し、入力の合計から差し引きます。そのため、cache_read_input_tokensとcache_creation_input_tokensは、それらを含む合計のinput_tokensに加えて報告する必要があります。プロンプトキャッシュを備えたプロバイダー (Anthropic など) では、キャッシュされたトークンが入力の大半を占めることが多いため、これらを省略すると、使用量とコストがほぼゼロとしてレンダリングされます。 - 価格を算出可能なモデル ID。 コストはモデルをキーにしたルックアップで求められます。Weave は
response_model(プロバイダーが実際に提供したモデル) を優先し、指定がない場合はstart_llmに渡したmodelを使用します。opusやsonnetなどのエイリアスでは価格を算出できずCost -とレンダリングされるため、応答で返される具体的な ID (resp.model) をresponse_modelとして渡してください。
prompt_tokens に含めてカウントするため、上記の例をそのまま適用できます。Anthropic はキャッシュされたトークンを input_tokens とは別に報告するため、Weave が価格計算に使用する合計にそれらを加算してください。
エージェントのトレースを Agents ビューで確認する
weave.init() が実行されると、project へのリンクが出力され、以下を確認できます:
research-botの Agents タブに表示される行。- 3 つのターンからなる 1 つの会話。
- 各ターン (
invoke_agent) に含まれる 2 つのchatスパンと、内部にネストされたexecute_toolスパン。 - 各
chatのトークン数、レイテンシー、モデル、および完全なメッセージ交換。
アプリから会話へのリンク
自分の UI から Weave Agents ビュー内の会話へのディープリンクを作成するには、entity、project、および会話 ID から URL を構築します。weave.init() は entity と project を保持するクライアントを返し、start_conversation は conversation_id を公開します。
次のステップ
- Weave でエージェントをトレースする方法と、Weave SDK で利用できる機能やオプションについて確認してください。
- Weave をエージェントに統合するその他の方法については、エージェントインテグレーションを選択するを参照してください。