Claudeエージェント実装:深掘り編
0 / 6 完了
(0%)
LESSON 06
/ 06
評価・トレース・デバッグのエージェント運用

エージェントは 「動いた」だけではダメ。本番運用では「正しく動いたか」「いつ・どこで失敗したか」を継続的に把握する必要があります。
エージェント評価の3軸
| 軸 | 計測方法 |
|---|---|
| 1. タスク完了率 | 目標達成 / 全試行 |
| 2. 効率性 | 所要ターン数・トークン消費・コスト |
| 3. 品質 | 結果の正確性・ハルシネーション率 |
評価データセットの構築
# 評価ケースの設計
評価ケース:
- 入力: ユーザー要求
- 期待: 実行されるべきツール呼び出しの順序
- 期待出力: 最終的な応答
- 合格基準: 完全一致 / 部分一致 / 主観評価
例:
case_001:
input: "先週注文した商品の配送状況を教えて"
expected_tools:
- get_user_orders(date_range="last_week")
- check_shipping_status(order_id="...")
expected_output_pattern: "配送中|配達済み|未発送"
pass_criteria: "正しい注文IDで配送状況確認した"
自動評価の実装
def evaluate_test_case(case, agent):
result = agent.run(case.input)
scores = {
"task_completion": evaluate_completion(result, case),
"tool_correctness": evaluate_tools(result.tool_calls, case.expected_tools),
"output_quality": evaluate_output(result.final_output, case.expected_output_pattern),
"efficiency": result.total_turns / case.max_turns,
"cost": result.total_tokens * cost_per_token,
}
return scores
# LLM-as-Judge による品質評価
def llm_judge(actual, expected):
return call_claude(
system="あなたは評価者です。実際の出力と期待出力を比較し、0.0〜1.0で採点してください。",
user=f"期待: {expected}n実際: {actual}n採点と理由を出力。"
)
トレースの記録
本番では、すべての実行を 詳細にトレース。
# トレース構造
@dataclass
class AgentTrace:
session_id: str
user_id: str
started_at: datetime
ended_at: datetime
goal: str
final_status: str # success/failed/timeout
iterations: List[IterationTrace]
total_tokens: int
total_cost_usd: float
final_output: str
@dataclass
class IterationTrace:
iteration_number: int
started_at: datetime
duration_ms: int
# プランナー
plan_reasoning: str
plan_decision: str # ツール呼び出し or 完了
# ツール実行
tool_call: Optional[ToolCall]
tool_result: Optional[Any]
tool_duration_ms: int
# コスト
input_tokens: int
output_tokens: int
cost_usd: float
分散トレース(OpenTelemetry連携)
from opentelemetry import trace
tracer = trace.get_tracer(__name__)
def agent_loop(goal, tools):
with tracer.start_as_current_span("agent.run", attributes={"goal": goal}):
for i in range(max_iter):
with tracer.start_as_current_span(f"iteration.{i}"):
with tracer.start_as_current_span("planner.call"):
plan = call_claude(...)
with tracer.start_as_current_span("tool.execute", attributes={
"tool.name": plan.tool_name,
"tool.args": json.dumps(plan.tool_args),
}):
result = execute_tool(plan)
if result.error:
span.set_status(StatusCode.ERROR)
ダッシュボードの設計
| パネル | 指標 |
|---|---|
| 1. 概況 | 本日の実行数・成功率・平均コスト |
| 2. 失敗分布 | エラー種別ヒストグラム、頻発エラーTop10 |
| 3. レイテンシ | P50/P95/P99 の応答時間 |
| 4. コスト | 日次コスト推移、ユーザー別ランキング |
| 5. ツール使用 | ツール別呼び出し数、エラー率 |
| 6. ループ検知 | 同一ツール連続呼び出しの検出 |
本番障害時のデバッグ手順
# Step 1: 影響範囲の特定
SELECT
COUNT(*) as failed_sessions,
error_type
FROM agent_traces
WHERE started_at > NOW() - INTERVAL '1 hour'
AND final_status = 'failed'
GROUP BY error_type
ORDER BY failed_sessions DESC;
# Step 2: 共通点の抽出
- 失敗セッションのインプット類似性
- 使用していたツール
- モデルバージョン
# Step 3: 1セッションの詳細確認
SELECT * FROM iteration_traces
WHERE session_id = 'failed_session_id'
ORDER BY iteration_number;
# Step 4: 仮説検証
- ローカルで同じインプットを再現
- ツール呼び出しの結果を検証
- システムプロンプト・ツール定義の変更履歴確認
失敗からの学習
# 失敗ケースを評価データセットに追加
def add_to_eval_dataset(failed_session):
case = {
"input": failed_session.goal,
"actual_outcome": failed_session.final_output,
"actual_tools": failed_session.tool_calls,
"expected": "(人間が補正)",
"category": "regression_test",
}
eval_dataset.append(case)
# 修正後、リグレッションテストとして実行
# 同じ失敗が再発しないか確認
運用上の重要指標
| 指標 | 目標 | 閾値超過時の対応 |
|---|---|---|
| タスク完了率 | >85% | 原因分析、システムプロンプト改善 |
| 平均ターン数 | < 15 | ツール定義改善、タスク分割 |
| P95レイテンシ | < 30秒 | 並列化、キャッシュ追加 |
| 1セッションあたりコスト | < $0.50 | モデル選定見直し、プロンプトキャッシュ |
| ツールエラー率 | < 5% | ツールAPI側の調査 |
| ハルシネーション率 | < 1% | 結果検証ステップ追加 |
このレッスンのまとめ
「評価データセット → 自動評価 → トレース記録 → ダッシュボード → 障害デバッグ → 学習」のサイクルでエージェントを継続改善できます。本コース「Claudeエージェント実装:深掘り編」はこれで修了です。次は「MCPで Claude を業務システムと統合する」または「本番運用」コースへ。
よくある質問
この記事に関連する質問と答えをまとめました。
Q.エージェントの評価指標は何を見る?
A.
タスク完了率・効率性(ターン数・トークン消費)・品質(正確性・ハルシネーション率)の3軸です。LLM-as-Judge による自動評価も組み合わせるのが現実的です。
Q.本番障害時のデバッグ手順は?
A.
影響範囲特定→共通点抽出→1セッションの詳細確認→仮説検証の4ステップ。OpenTelemetry で詳細トレースを取っておけば、原因特定が劇的に早くなります。