0Pricing
AI Agents · レッスン

ツール呼び出しと入出力のロギング

各ステップで記録すべき内容を学びます。ツール名、入力引数、出力、レイテンシ、エラー、親span idです。

「ツール呼び出しと入出力のロギング」はCoddyKit上の無料AI Agentsレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Agents学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Agentsコースには全4レッスンが含まれています。

このレッスンの一部はまだ翻訳されておらず、英語で表示されています。

ステップごとに記録する情報

各Spanについて、次の情報を取得します。

  • ステップ名(llm_call、tool_call、retrieve)
  • 入力(メッセージ、ツール引数、クエリ)
  • 出力(レスポンス、ツールの結果)
  • メタデータ(モデル、レイテンシー、トークン数、コスト)
  • 失敗した場合はエラー情報

自作のSpanヘルパー

フレームワークを使わない場合の最小限のヘルパーは次のとおりです。

from contextlib import contextmanager
import time, uuid

@contextmanager
def span(name, trace_id, parent_id=None):
    span_id = str(uuid.uuid4())
    start = time.time()
    record = {'trace_id': trace_id, 'span_id': span_id, 'parent_id': parent_id, 'name': name, 'start': start}
    try:
        yield record
    except Exception as e:
        record['error'] = str(e)
        raise
    finally:
        record['duration_ms'] = (time.time() - start) * 1000
        save_span(record)

Using It

trace_id = str(uuid.uuid4())
with span('llm_call_planner', trace_id) as s:
    s['model'] = 'gpt-4o-mini'
    s['messages_in'] = messages
    response = client.chat.completions.create(model='gpt-4o-mini', messages=messages)
    s['response'] = response.choices[0].message.content
    s['tokens_in'] = response.usage.prompt_tokens
    s['tokens_out'] = response.usage.completion_tokens

Spanのネスト

parent_idを渡して、Spanがツリーを形成するようにします。

with span('agent_step', trace_id) as parent:
    with span('llm_call', trace_id, parent_id=parent['span_id']):
        ...
    with span('tool_call:search', trace_id, parent_id=parent['span_id']):
        ...

ツール呼び出しのログ記録

特にツール呼び出しでは、次の情報を記録します。

  • ツール名
  • 引数(JSON)
  • 結果(JSON、長すぎる場合は切り詰める)
  • レイテンシー
  • エラー(発生した場合)

大きなペイロードを切り詰める

ツールの結果が非常に大きくなることがあります(200KBのHTMLなど)。保存する前に切り詰めてください。

def safe_payload(obj, max_chars=8000):
    s = json.dumps(obj)
    return s if len(s) <= max_chars else s[:max_chars] + '...[truncated]'

PIIの秘匿化

保存する前に個人情報を削除します:

import re
EMAIL_RE = re.compile(r'[\w\.-]+@[\w\.-]+')

def redact(text):
    return EMAIL_RE.sub('[email]', text)

print(redact("Contact me at alice@example.com for details."))

構造化ログ出力

1つのスパンにつき1つのJSONレコードを出力し、ELK、Loki、Datadog、BigQueryにパイプします:

import json
import sys

def save_span(record):
    print(json.dumps(record), file=sys.stderr, flush=True)

demo_record = {'span': 'call_llm', 'duration_ms': 120, 'ok': True}
save_span(demo_record)
print("Logged span:", json.dumps(demo_record))

ユーザーセッションと関連付ける

後からユーザーごとにトレースをフィルタリングできるよう、すべてのスパンにsession_idとuser_idを含めます。

サンプリング

大量のトラフィックを処理するエージェントでは、サンプリングします:

import random

def should_trace(user_id):
    return random.random() < 0.10  # 10% of traces
# Always trace errors and slow runs.

random.seed(42)
sampled = sum(should_trace(i) for i in range(1000))
print(f"Traced {sampled} out of 1000 calls (~10% target)")

トレースから再実行する

完全な入力(メッセージ、ツール、引数)を保存しておくと、新しいプロンプトでトレースを再実行し、改善を検証できます。これはeval駆動開発の基盤です。

大きなペイロードを切り詰める理由

ログ内の大きなツール出力を切り詰めるのはなぜでしょうか?

まとめ

すべてのステップ、すべての入力、すべての出力を、構造化し、ネストし、サンプリングします。これが、オブザーバビリティにおけるその他すべての基礎データになります。

よくある質問

「ツール呼び出しと入出力のロギング」レッスンは無料ですか?

はい。「ツール呼び出しと入出力のロギング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Agentsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Agentsコースには全4レッスンが含まれています。

「ツール呼び出しと入出力のロギング」で何を学びますか?

各ステップで記録すべき内容を学びます。ツール名、入力引数、出力、レイテンシ、エラー、親span idです。 ブラウザで直接実行するハンズオンコードでAI Agentsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

AI Agentsを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAI Agentsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「ツール呼び出しと入出力のロギング」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAI Agentsレッスンでコードを書いて実行できますか?

はい。すべてのAI Agentsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. エージェントにトレーシングが必要な理由
  2. ツール呼び出しと入出力のロギング
  3. ステップごとのレイテンシとコスト
  4. エージェント実行の可視化(Langfuse、LangSmith)
← AI Agentsに戻る