Skip to content

Latest commit

 

History

History
213 lines (139 loc) · 7.44 KB

File metadata and controls

213 lines (139 loc) · 7.44 KB

Claude Code Eval 方法论

评估 AI Coding Agent 不是跑几个 benchmark 出分数,而是建立一套"可重复、可对比、可改进"的反馈系统。


1. 为什么要评估

用 Claude Code 一段时间后,每个人都会遇到这些问题:

  • "它这次改对了,下次同样的任务为什么错了?"
  • "我换了一个 prompt,效果变好了还是变差了?"
  • "团队里每个人用法不一样,怎么知道谁的方法更稳?"
  • "这个 Agent 适不适合我们的代码库?"

没有评估,这些问题只能靠感觉。而感觉是不可靠的、不可迁移的、不可规模化的。

评估的价值不是打分,而是:

  1. 建立基线:当前 Agent 在我这个场景下是什么水平。
  2. 定位问题:失败是因为 prompt、RAG、工具、模型,还是任务本身?
  3. 验证改进:我改了一个配置,真的变好了吗?
  4. 团队共识:让"好不好用"有共同语言。

2. 三个评估层级

我们把 AI Coding Agent 的评估拆成三层:

┌─────────────────────────────────────┐
│  Agent Eval                         │  端到端任务:能不能独立完成?
│  (任务完成度、效率、安全性)          │
├─────────────────────────────────────┤
│  RAG Eval                           │  上下文质量:读到的内容对不对?
│  (检索准确率、答案忠实度)            │
├─────────────────────────────────────┤
│  Prompt Eval                        │  提示词质量:输入输出是否稳定?
│  (指令遵循、鲁棒性、可迁移性)         │
└─────────────────────────────────────┘

2.1 Prompt Eval

目标:验证提示词(系统提示、project instructions、SKILL.md、单次用户输入)是否稳定、可迁移、抗干扰。

核心问题

  • Agent 是否遵循了明确的指令?
  • 同一个 prompt 多次运行,输出差异有多大?
  • 把 prompt 换到另一个模型上,效果是否一致?
  • 用户输入有歧义或恶意时,prompt 是否还能保持行为?

常见失败模式

失败 表现 例子
指令遗漏 忽略 prompt 中的约束 prompt 说"不要修改文件",结果改了
格式不稳定 输出格式时好时坏 有时返回 JSON,有时返回 Markdown
模型敏感 换模型后行为巨变 Claude 4 能做的事,3.5 完全跑偏
输入污染 被用户输入带偏 用户说"忽略前面的指令",Agent 真忽略了

2.2 RAG Eval

目标:验证 Agent 在代码库中检索到的上下文是否相关、完整、不产生幻觉。

核心问题

  • 给定一个查询,检索到的文件/片段是否包含答案?
  • 排名靠前的结果是否更相关?
  • 生成的回答是否基于检索内容,而不是模型记忆?
  • 跨文件调用、类型依赖、版本差异是否被正确处理?

代码库 RAG 的特殊性

  • 代码是结构化的,不只是文本。
  • 一个函数的定义和调用可能分散在多个文件。
  • 同样的函数名在不同模块里含义不同。
  • 需要结合 AST、import 图、git 历史,不只是向量相似度。

2.3 Agent Eval

目标:验证 Agent 能否在给定真实任务下,自主完成目标。

核心问题

  • 任务是否完成?(功能正确性)
  • 花了多少步?多少 token?(效率)
  • 有没有破坏现有功能?(安全性)
  • 失败时能否自我修复?(鲁棒性)

任务分类

类型 例子 成功标准
功能实现 "加一个用户登录接口" 测试通过、接口可用
Bug 修复 "修复 #123 的崩溃" 复现失败、回归通过
代码审查 "审查这个 PR" 找到真正的问题、不误报
重构 "把回调改成 async/await" 行为不变、测试通过
理解查询 "这个项目怎么启动?" 回答准确、引用正确

3. 评测设计流程

推荐按以下步骤设计一次评测:

步骤 1:明确目标

不要问"这个 Agent 好不好",要问"这个 Agent 在 X 场景下做 Y 任务,Z 指标如何"。

好的目标:

评估 Claude Code 在我们 Django 项目中修复单文件 bug 的成功率。

不好的目标:

评估 Claude Code 强不强。

步骤 2:选择层级

如果任务经常失败但不知道原因,从 Agent Eval 开始。
如果 Agent 行为不稳定,从 Prompt Eval 开始。
如果 Agent 读错文件、引用错代码,从 RAG Eval 开始。

步骤 3:构建数据集

每个评测任务需要:

  • 输入:用户指令、初始代码库状态
  • 期望输出:测试通过、文件变更、返回结果
  • 判断标准:自动判断规则 + 人工复核说明

数据集不是越多越好,而是要有代表性、可复现、有区分度

步骤 4:选择指标

不同目标用不同指标:

目标 推荐指标
功能正确性 Pass@K、成功率
效率 平均步数、平均 token 数、耗时
安全性 回归测试通过率、误删/误改率
稳定性 同任务多次运行的标准差
上下文质量 Recall@K、MRR、幻觉率

步骤 5:跑评测并归因

不要只看分数。每个失败案例都要问:

  • 是 prompt 导致的吗?
  • 是 RAG 检索漏了关键文件吗?
  • 是工具调用顺序错误吗?
  • 是模型能力不够吗?
  • 是任务本身描述不清吗?

步骤 6:反馈改进

评估的最终目的是改进。每次评测后应该产出:

  • 改进建议清单
  • 需要调整的 prompt / 配置 / 工具
  • 下一轮评测计划

4. 常见陷阱

陷阱 1:用公开 benchmark 代替真实场景

SWE-bench 很好,但它测的是"能不能修 GitHub issue",不是"能不能在我的代码库里按我的规范工作"。

陷阱 2:只看最终分数

一个 Agent 80% 成功率,另一个 75%,不一定前者更好。要看失败案例的类型和严重性。

陷阱 3:评测集泄露到训练集

如果 Agent 用到了和评测任务相似的公开代码,分数会虚高。

陷阱 4:忽略成本

一个 Agent 成功率 90% 但平均消耗 100 万 token,另一个 85% 但只用 10 万 token,在不同场景下选择会不同。

陷阱 5:没有人工复核

自动指标会漏掉"看起来对但实际有问题"的情况。至少抽 10% 案例人工复核。


5. 最小可运行版本

如果你只想快速开始,最小评测只需要:

  1. 5-10 个有代表性的任务
  2. 一个明确的通过标准(如"测试通过")
  3. 一个运行脚本
  4. 一个记录结果的表格

不要等"评测系统很完善"才开始。先用最简单的方式跑起来,再逐步完善。


6. 与本仓库其他部分的关系