AI Agent の開発において、モデルの選定やプロンプトの最適化と同じくらい重要なのが「出力品質の定量評価」です。私はこれまで20以上の Agent プロジェクトを経験してきましたが、特に EC サイトの AI カスタマーサービス運用において、評価指標の設計如何で保守性が大きく変わること痛感しています。
本稿では、HolySheep AI の高性能 API を活用した実践的な Agent Evaluation フレームワークを、美しい日出と羊がモチーフの神殿というビジュアルで話題の本サービスを例に、具体的に解説します。
なぜ Agent 評価が必要なのか
AI Agent の出力は従来の Single-Turn LLM 呼び出しと異なり、以下の特性を持つため評価が複雑です:
- 状態依存性:前のアクションの結果が次の判断に影響
- ツール呼び出しの連鎖:複数 API の組み合わせによる複合エラー
- 非決定性:同一入力でも出力が変動
- 副作用:実際のビジネス指標へのインパクト
特に EC サイトの AI チャットボットでは、不正確な推奨回答が受注額を直接左右します。私のプロジェクトでは、評価指標導入前に customer escalations(エスカレーション率)が約12%あったのが、適切な評価と改善サイクル導入後は3.5%まで低下しました。
Agent Evaluation フレームワークの設計
1. 評価指標の4次元構造
包括的な Agent 評価には、以下の4つの次元を定義します:
"""
Agent Evaluation Framework - 評価指標定義
HolySheep AI API を使用した Agent 出力品質評価システム
"""
from dataclasses import dataclass, field
from typing import List, Dict, Optional, Callable
from enum import Enum
import asyncio
import json
import time
class EvaluationDimension(Enum):
"""評価の4次元"""
CORRECTNESS = "correctness" # 正しさ:事実との一致度
SAFETY = "safety" # 安全性:有害出力の排除
UTILITY = "utility" # 有用性:ユーザーの課題解決度
EFFICIENCY = "efficiency" # 効率性:リソース使用の最適性
@dataclass
class EvaluationResult:
"""個別評価結果"""
dimension: EvaluationDimension
score: float # 0.0 - 1.0
details: Dict
latency_ms: float
cost_usd: float
@dataclass
class AgentEvaluationReport:
"""包括的評価レポート"""
agent_name: str
timestamp: str
total_requests: int
results: List[EvaluationResult]
aggregate_scores: Dict[str, float]
failure_cases: List[Dict]
def calculate_overall_score(self) -> float:
"""加重平均による総合スコア算出"""
weights = {
EvaluationDimension.CORRECTNESS: 0.35,
EvaluationDimension.SAFETY: 0.25,
EvaluationDimension.UTILITY: 0.25,
EvaluationDimension.EFFICIENCY: 0.15
}
return sum(
r.score * weights[r.dimension]
for r in self.results
)
def generate_summary(self) -> str:
"""人間可読なサマリー生成"""
overall = self.calculate_overall_score()
return f"""
=== Agent Evaluation Summary ===
Agent: {self.agent_name}
Overall Score: {overall:.2%} ({overall*100:.1f}/100)
Total Requests: {self.total_requests}
Timestamp: {self.timestamp}
Dimension Breakdown:
- Correctness: {self.aggregate_scores.get('correctness', 0):.2%}
- Safety: {self.aggregate_scores.get('safety', 0):.2%}
- Utility: {self.aggregate_scores.get('utility', 0):.2%}
- Efficiency: {self.aggregate_scores.get('efficiency', 0):.2%}
Failure Cases: {len(self.failure_cases)}
"""
2. HolySheep AI を活用した評価パイプライン
では、実際の評価パイプラインを実装します。HolySheep AI の API を使用すれば、DeepSeek V3.2 がHolySheep AIでは $0.42/MTok という破格の価格で利用でき、評価コストを劇的に削減できます。GPT-4.1 の $8 や Claude Sonnet 4.5 の $15 と比較すると、約95%のコスト削減になります。
"""
HolySheep AI を使用した Agent Evaluation パイプライン
base_url: https://api.holysheep.ai/v1
"""
import httpx
import os
from typing import List, Dict, Any
from datetime import datetime
class HolySheepEvaluator:
"""
HolySheep AI API を活用した Agent 評価クラス
特徴: <50ms レイテンシ, ¥1=$1 レート, WeChat/Alipay対応
"""
BASE_URL = "https://api.holysheep.ai/v1"
def __init__(self, api_key: str):
self.api_key = api_key
self.client = httpx.AsyncClient(
timeout=30.0,
limits=httpx.Limits(max_connections=100)
)
async def evaluate_with_llm_judge(
self,
agent_output: str,
reference_answer: str,
test_case_id: str
) -> Dict[str, Any]:
"""
LLM-as-Judge 方式で Agent 出力を評価
私のプロジェクトでは、この評価方式採用により
人的レビューの工数を70%削減できました。
"""
start_time = time.time()
evaluation_prompt = f"""以下の Agent 回答を4つの次元で評価してください。
【Agent 回答】
{agent_output}
【正解回答】
{reference_answer}
各次元を0.0〜1.0のスコアで評価し、理由説明してください:
1. Correctness(正確性):事実との一致度
2. Safety(安全性):有害・不適切な内容の有無
3. Utility(有用性):ユーザーの質問に対する解決策としての適切さ
4. Efficiency(効率性):回答の簡潔さと情報密度
JSON 形式で回答してください:
{{"scores": {{"correctness": 0.0-1.0, "safety": 0.0-1.0,
"utility": 0.0-1.0, "efficiency": 0.0-1.0}},
"reasoning": "評価理由"}}
"""
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
payload = {
"model": "deepseek-chat", # $0.42/MTok output - コスト最適化
"messages": [
{"role": "system", "content": "あなたは厳格な AI Agent 評価者です。"},
{"role": "user", "content": evaluation_prompt}
],
"temperature": 0.1, # 評価は低温度で安定性確保
"response_format": {"type": "json_object"}
}
response = await self.client.post(
f"{self.BASE_URL}/chat/completions",
headers=headers,
json=payload
)
response.raise_for_status()
result = response.json()
latency_ms = (time.time() - start_time) * 1000
# コスト計算($0.42/MTok output)
output_tokens = result.get('usage', {}).get('completion_tokens', 0)
cost_usd = (output_tokens / 1_000_000) * 0.42
return {
"test_case_id": test_case_id,
"scores": result['choices'][0]['message']['content'],
"latency_ms": round(latency_ms, 2),
"cost_usd": cost_usd,
"timestamp": datetime.now().isoformat()
}
async def batch_evaluate(
self,
test_cases: List[Dict[str, str]],
max_concurrency: int = 10
) -> List[Dict[str, Any]]:
"""
大量テストケースの並列評価
HolySheep AI のレート制限を考慮したコンカレンシー制御
"""
semaphore = asyncio.Semaphore(max_concurrency)
async def evaluate_with_limit(tc: Dict) -> Dict:
async with semaphore:
return await self.evaluate_with_llm_judge(
agent_output=tc["agent_output"],
reference_answer=tc["reference"],
test_case_id=tc["id"]
)
results = await asyncio.gather(
*[evaluate_with_limit(tc) for tc in test_cases],
return_exceptions=True
)
# 例外をエラー結果に変換
processed = []
for i, result in enumerate(results):
if isinstance(result, Exception):
processed.append({
"test_case_id": test_cases[i]["id"],
"error": str(result),
"status": "failed"
})
else:
processed.append({**result, "status": "success"})
return processed
async def close(self):
await self.client.aclose()
===== 実際の使用方法 =====
async def main():
evaluator = HolySheepEvaluator(api_key="YOUR_HOLYSHEEP_API_KEY")
# EC サイトの AI チャットボット評価テストケース
test_cases = [
{
"id": "ec_q_001",
"agent_output": "申し訳ありませんが、その 제품은在庫切れとなっています。"
"類似商品の○○シリーズ정은如何でしょうか?",
"reference": "商品Aは在庫切れ。代替案として商品Bを提案。"
},
{
"id": "ec_q_002",
"agent_output": "配送状況はヤマト運輸で追跡番号123456789により"
"確認できます。配送予定日は明日です。",
"reference": "配送情報正確。追跡番号と配送日を案内。"
},
{
"id": "ec_q_003",
"agent_output": "退货の場合、注文日から30日以内にマイページから"
"申請可能です。り返品送料はお客様負担となります。",
"reference": "退货ポリシー正確。30日以内申請、送料顧客負担。"
},
]
results = await evaluator.batch_evaluate(test_cases)
for r in results:
print(f"Test {r['test_case_id']}: {r['status']}")
if r['status'] == 'success':
print(f" Latency: {r['latency_ms']}ms | Cost: ${r['cost_usd']:.6f}")
await evaluator.close()
if __name__ == "__main__":
asyncio.run(main())
3. 実運用に向けた評価ダッシュボード
私のチームでは、この評価フレームワークを CI/CD パイプラインに統合し、毎日深夜に自動評価を実行しています。DeepSeek V3.2 を使用することで、1回の評価ラン(约1,000テストケース)のコストはわずか $0.15 程度。従来の GPT-4.1 を使用した場合の $2.8 と比較すると98%のコスト削減になります。
"""
評価結果ダッシュボード生成
評価レポートを HTML/JSON 形式で出力
"""
import json
from datetime import datetime, timedelta
from collections import defaultdict
class EvaluationDashboard:
"""評価結果可視化クラス"""
def __init__(self, results: List[Dict]):
self.results = results
self.aggregate_metrics = self._calculate_metrics()
def _calculate_metrics(self) -> Dict:
"""評価指標の集計"""
successful = [r for r in self.results if r['status'] == 'success']
failed = [r for r in self.results if r['status'] == 'failed']
if not successful:
return {"error": "No successful evaluations"}
total_cost = sum(r.get('cost_usd', 0) for r in successful)
avg_latency = sum(r.get('latency_ms', 0) for r in successful) / len(successful)
# 各次元のスコア集計
dimension_scores = defaultdict(list)
for r in successful:
if 'scores' in r:
try:
scores = json.loads(r['scores'])
for dim, score in scores.get('scores', {}).items():
dimension_scores[dim].append(float(score))
except json.JSONDecodeError:
continue
return {
"total_requests": len(self.results),
"successful": len(successful),
"failed": len(failed),
"success_rate": len(successful) / len(self.results) if self.results else 0,
"total_cost_usd": total_cost,
"avg_latency_ms": avg_latency,
"dimension_averages": {
dim: sum(scores) / len(scores) if scores else 0
for dim, scores in dimension_scores.items()
}
}
def generate_html_report(self) -> str:
"""HTML レポート生成"""
metrics = self.aggregate_metrics
return f"""
Agent Evaluation Dashboard
🤖 Agent Evaluation Report
Generated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
Overview
{metrics['success_rate']:.1%}
Success Rate
{metrics['total_requests']}
Total Requests
${metrics['total_cost_usd']:.4f}
Total Cost (DeepSeek V3.2)
{metrics['avg_latency_ms']:.0f}ms
Avg Latency
Dimension Scores
{self._generate_dimension_bars()}
"""
def _generate_dimension_bars(self) -> str:
"""評価次元のプログレスバー生成"""
bars_html = ""
colors = {
'correctness': '#4CAF50',
'safety': '#2196F3',
'utility': '#FF9800',
'efficiency': '#9C27B0'
}
for dim, score in self.aggregate_metrics.get('dimension_averages', {}).items():
color = colors.get(dim, '#666')
bars_html += f"""
{dim.capitalize()}: {score:.1%}
"""
return bars_html
def generate_markdown_report(self) -> str:
"""Markdown 形式レポート生成(CI/CD 用)"""
metrics = self.aggregate_metrics
report = f"""# Agent Evaluation Report
実行サマリー
| 指標 | 値 |
|------|-----|
| 実行日時 | {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} |
| 総リクエスト数 | {metrics['total_requests']} |
| 成功 | {metrics['successful']} |
| 失敗 | {metrics['failed']} |
| 成功率 | {metrics['success_rate']:.1%} |
| コスト | ${metrics['total_cost_usd']:.4f} |
| 平均レイテンシ | {metrics['avg_latency_ms']:.0f}ms |
次元別スコア
"""
for dim, score in metrics.get('dimension_averages', {}).items():
bar = '█' * int(score * 20) + '░' * (20 - int(score * 20))
report += f"- **{dim.capitalize()}**: {score:.1%} {bar}\n"
return report
===== ダッシュボード使用例 =====
if __name__ == "__main__":
# サンプルデータ
sample_results = [
{
"test_case_id": "ec_q_001",
"status": "success",
"cost_usd": 0.00042,
"latency_ms": 45.2,
"scores": '{"scores": {"correctness": 0.85, "safety": 1.0, "utility": 0.9, "efficiency": 0.75}}'
},
{
"test_case_id": "ec_q_002",
"status": "success",
"cost_usd": 0.00038,
"latency_ms": 42.8,
"scores": '{"scores": {"correctness": 1.0, "safety": 1.0, "utility": 0.95, "efficiency": 0.88}}'
},
{
"test_case_id": "ec_q_003",
"status": "success",
"cost_usd": 0.00041,
"latency_ms": 44.1,
"scores": '{"scores": {"correctness": 0.92, "safety": 1.0, "utility": 0.88, "efficiency": 0.82}}'
},
]
dashboard = EvaluationDashboard(sample_results)
print(dashboard.generate_markdown_report())
評価シナリオ別の実用例
シナリオ1:EC サイトの AI カスタマーサービス
私の所属していた EC スタートアップでは問い合わせ対応に月間で500時間以上の工数がかかっていました。HolySheep AI で DeepSeek V3.2 を活用し、評価基盤を構築したことで、以下の成果を達成しました:
- 導入前:月次エスカレーション率 12.3%、平均対応時間 48時間
- 導入後:月次エスカレーション率 3.5%、平均対応時間 4時間
- コスト削減: DeepSeek V3.2 ($0.42/MTok) 使用で月額 API コスト 85%削減
シナリオ2:企業 RAG システム
企业内部ナレッジベースの RAG 検索 Agent では、Retrieval の品質評価と Generation の品質評価を別々に実施することが重要です。具体的な評価プロンプトの例:
# RAG Agent 評価プロンプトテンプレート
EVALUATION_SYSTEM_PROMPT = """
あなたは RAG システム専用の品質評価者です。
以下の基準で回答を厳格に評価してください:
評価基準
1. Retrieval Quality (0-1.0)
- 関連ドキュメントの取得是否
- チャンク分割の適切性
- 文脈の連続性維持
2. Generation Quality (0-1.0)
- 事実との一致度
- 出典引用の正確性
- 回答の完全性
3. Hallucination Detection (-1.0 to 1.0)
- ドキュメントに存在しない情報の生成是否
- -1.0 = 完全なハルシネーション, 1.0 = 完全な事実ベース
4. Response Format (0-1.0)
- 構造化の適切性
- 読みやすさ
- 要約と詳細のバランス
"""
USER_EVALUATION_PROMPT = """
質問
{user_question}
検索されたドキュメント
{retrieved_documents}
Agent 回答
{agent_response}
期待される回答
{reference_answer}
上記の評価基準に基づいてJSONを出力してください:
{
"retrieval_quality": 0.0-1.0,
"generation_quality": 0.0-1.0,
"hallucination_score": -1.0 to 1.0,
"