Loading...
Loading...
设计并实现适用于AI Agent的全面评估系统。适用于为代码Agent、对话Agent、研究Agent或计算机操作Agent构建评估体系的场景。内容涵盖评估器类型、基准测试、8步实施路线图以及生产环境集成方案。
npx skill4agent add supercent-io/skills-template agent-evaluation基于Anthropic的《揭秘AI Agent评估体系》
| 类型 | 轮次 | 状态 | 评估方式 | 复杂度 |
|---|---|---|---|---|
| 单轮对话 | 1 | 无 | 简单评估 | 低 |
| 多轮对话 | N | 对话记录 | 按轮次评估 | 中 |
| Agent化 | N | 外部环境+历史记录 | 基于结果评估 | 高 |
| 术语 | 定义 |
|---|---|
| Task(任务) | 单个测试用例(提示词+预期结果) |
| Trial(测试轮次) | Agent在单个任务上的一次运行 |
| Grader(评估器) | 评分函数(代码/模型/人工) |
| Transcript(交互记录) | Agent操作的完整记录 |
| Outcome(结果) | 用于评估的最终状态 |
| Harness(评估框架) | 运行评估的基础设施 |
| Suite(测试套件) | 相关任务的集合 |
# 示例:基于代码的评估器
def grade_task(outcome: dict) -> float:
"""通过测试通过率评估代码任务"""
tests_passed = outcome.get("tests_passed", 0)
total_tests = outcome.get("total_tests", 1)
return tests_passed / total_tests
# SWE-bench风格评估器
def grade_swe_bench(repo_path: str, test_spec: dict) -> bool:
"""运行测试并检查补丁是否解决问题"""
result = subprocess.run(
["pytest", test_spec["test_file"]],
cwd=repo_path,
capture_output=True
)
return result.returncode == 0# 示例:客服Agent的大模型评分标准
rubric:
dimensions:
- name: empathy
weight: 0.3
scale: 1-5
criteria: |
5: 认可用户情绪,使用暖心话术
3: 礼貌但缺乏人情味
1: 冷漠或敷衍
- name: resolution
weight: 0.5
scale: 1-5
criteria: |
5: 完全解决问题
3: 部分解决问题
1: 未解决问题
- name: efficiency
weight: 0.2
scale: 1-5
criteria: |
5: 用最少轮次解决问题
3: 轮次合理
1: 反复沟通效率低下def grade_coding_agent(task: dict, outcome: dict) -> dict:
return {
"tests_passed": run_test_suite(outcome["code"]),
"lint_score": run_linter(outcome["code"]),
"builds": check_build(outcome["code"]),
"matches_spec": compare_to_reference(task["spec"], outcome["code"])
}success_criteria:
- empathy_score: >= 4.0
- resolution_rate: >= 0.9
- avg_turns: <= 5
- escalation_rate: <= 0.1def grade_research_agent(task: dict, outcome: dict) -> dict:
return {
"grounding": check_citations(outcome["report"]),
"coverage": check_topic_coverage(task["topics"], outcome["report"]),
"source_quality": score_sources(outcome["sources"]),
"factual_accuracy": verify_claims(outcome["claims"])
}def grade_computer_use(task: dict, outcome: dict) -> dict:
return {
"ui_state": verify_ui_state(outcome["screenshot"]),
"db_state": verify_database(task["expected_db_state"]),
"file_state": verify_files(task["expected_files"]),
"success": all_conditions_met(task, outcome)
}# 创建初始评估套件目录结构
mkdir -p evals/{tasks,results,graders}
# 从代表性任务开始
# - 常规使用场景(60%)
# - 边缘场景(20%)
# - 故障模式(20%)# 将现有QA测试转换为评估任务
def convert_qa_to_eval(qa_case: dict) -> dict:
return {
"id": qa_case["id"],
"prompt": qa_case["input"],
"expected_outcome": qa_case["expected"],
"grader": "code" if qa_case["has_tests"] else "model",
"tags": qa_case.get("tags", [])
}# 规范的任务定义
task:
id: "api-design-001"
prompt: |
设计一个用户管理REST API,要求:
- 支持CRUD操作
- 基于JWT实现认证
- 包含限流功能
reference_solution: "./solutions/api-design-001/"
success_criteria:
- "所有接口均有文档"
- "包含认证中间件"
- "有限流配置"# 确保测试套件的平衡性
suite_composition = {
"positive_cases": 0.5, # 预期成功的用例
"negative_cases": 0.3, # 预期需优雅失败的用例
"edge_cases": 0.2 # 边界条件用例
}# 基于Docker的代码评估隔离环境
eval_environment:
type: docker
image: "eval-sandbox:latest"
timeout: 300s
resources:
memory: "4g"
cpu: "2"
network: isolated
cleanup: always# 推荐:基于结果的评估器
def grade_outcome(expected: dict, actual: dict) -> float:
return compare_final_states(expected, actual)
# 不推荐:基于过程的评估器(过于脆弱)
def grade_path(expected_steps: list, actual_steps: list) -> float:
return step_by_step_match(expected_steps, actual_steps)# 分析交互记录以调试问题
def analyze_transcript(transcript: list) -> dict:
return {
"total_steps": len(transcript),
"tool_usage": count_tool_calls(transcript),
"errors": extract_errors(transcript),
"decision_points": find_decision_points(transcript),
"recovery_attempts": find_recovery_patterns(transcript)
}# 检测评估套件是否失效
def check_saturation(results: list, window: int = 10) -> dict:
recent = results[-window:]
return {
"pass_rate": sum(r["passed"] for r in recent) / len(recent),
"variance": calculate_variance(recent),
"is_saturated": all(r["passed"] for r in recent),
"recommendation": "Add harder tasks" if saturated else "Continue"
}# 评估套件维护清单
maintenance:
weekly:
- 审核失败的评估用例,排查误判
- 检查不稳定的测试用例
monthly:
- 从生产问题中新增边缘场景用例
- 移除已饱和的评估用例
- 更新参考解决方案
quarterly:
- 全面重新校准基准测试
- 审核团队贡献的评估用例# GitHub Actions示例
name: Agent Evals
on: [push, pull_request]
jobs:
eval:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Evals
run: |
python run_evals.py --suite=core --mode=compact
- name: Upload Results
uses: actions/upload-artifact@v4
with:
name: eval-results
path: results/# 实时评估采样
class ProductionMonitor:
def __init__(self, sample_rate: float = 0.1):
self.sample_rate = sample_rate
async def monitor(self, request, response):
if random.random() < self.sample_rate:
eval_result = await self.run_eval(request, response)
self.log_result(eval_result)
if eval_result["score"] < self.threshold:
self.alert("Low quality response detected")# 对比不同版本的Agent
def run_ab_test(suite: str, versions: list) -> dict:
results = {}
for version in versions:
results[version] = run_eval_suite(suite, agent_version=version)
return {
"comparison": compare_results(results),
"winner": determine_winner(results),
"confidence": calculate_confidence(results)
}Level 1: 单元评估(单一能力)
Level 2: 集成评估(组合能力)
Level 3: 端到端评估(完整工作流)
Level 4: 对抗性评估(边缘场景)1. 为新功能编写评估任务
2. 运行评估(预期失败)
3. 实现功能
4. 运行评估(预期通过)
5. 添加到回归测试套件每周:审核评估器准确率
每月:根据反馈更新评分标准
每季度:以人工评估为基准全面审核评估器# 任务定义
task = {
"id": "fizzbuzz-001",
"prompt": "Write a fizzbuzz function in Python",
"test_cases": [
{"input": 3, "expected": "Fizz"},
{"input": 5, "expected": "Buzz"},
{"input": 15, "expected": "FizzBuzz"},
{"input": 7, "expected": "7"}
]
}
# 评估器
def grade(task, outcome):
code = outcome["code"]
exec(code) # 在沙箱中运行
for tc in task["test_cases"]:
if fizzbuzz(tc["input"]) != tc["expected"]:
return 0.0
return 1.0task:
id: "support-refund-001"
scenario: |
客户因商品损坏申请退款。
商品:笔记本电脑,订单号:#12345,损坏情况:屏幕碎裂
expected_actions:
- 认可用户问题
- 验证订单信息
- 提供解决方案选项
max_turns: 5
grader:
type: model
model: claude-3-5-sonnet-20241022
rubric: |
从以下维度评分(1-5分):
- 共情能力:Agent是否认可用户的不满?
- 问题解决:是否提供了明确的解决方案?
- 效率:是否在合理轮次内解决问题?