Community研究与数据分析github.com

ombharatiya/ai-evals

构建、审查和修复 LLM 应用、RAG 流水线和 AI 智能体的评估,遵循 aievals.co 指南的方法。在真实轨迹上进行错误分析,先做代码检查再使用 LLM 评判,每个失败模式对应一个二值 PASS/FAIL 评判,评判结果依据人工标签校准,并包含训练/开发/测试划分、回归集、威尔逊区间以及在 CI 中的配对发布门控。

ai-evals 是什么?

这是一个 AI 评估技能,旨在帮助开发者按照 aievals.co 指南所述的最佳实践来构建、审查和修复 LLM 应用、RAG 流水线和智能体的评估。其核心理念是:在编写任何指标之前先观察真实输出(轨迹),只衡量实际发现的失败模式,在信任每个 LLM 评判之前先用人工标签进行校准,并对每个数值都给出置信区间。该技能支持多个平台(如 Claude Code、Cursor、Codex),并提供了详细的工作流程(Workflow A-E),涵盖从零开始添加评估、编写 LLM 评判提示、审计现有评估信任度、比较两个版本以及将评估集成到 CI 中。它强调“代码检查优先于评判”,每个失败模式使用一个二值评判,校准报告需包含 PASS 召回率和 FAIL 召回率(而非简单一致性),并使用威尔逊区间和配对统计。此外,它提供了默认参数(如样本量、划分比例、评判召回率阈值)和引用文件,方便开发者快速应用。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ombharatiya/ai-evals-skills/tree/HEAD/skills/ai-evals

Installed? Explore more 研究与数据分析 skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

AI 评估(AI evals)

评估(eval)是一种可重复的测试,用于衡量 AI 系统是否完成了其任务。此技能使你能够按照 aievals.co 指南所教授的方式工作:在测量任何内容之前先查看真实输出,测量你实际发现的失败,在信任任何 LLM 评判之前先用人工标签进行校准,并对每个数字都给出区间。

指南位于 https://www.aievals.co 。当你向用户解释某个选择时,应引用其页面。末尾列出的参考文件包含详细信息和来源。

基本规则

在每个评估任务中都遵循以下规则,无论用户要求什么。

  1. 在编写指标之前先查看轨迹。 无法为未观察过的系统指定失败模式。如果用户没有轨迹,先获取一些:生产日志,或者在 100 个真实输入上运行系统。然后阅读它们。
  2. 人工标注;你提出建议。 切勿自己编写真实标签并将其作为人类判断呈现。你可以起草标记为 "provisional": true 的标签供人确认。切勿让模型同时编写输入及其正确答案,除非代码计算出答案(如 SQL 结果、测试、计算器等)。
  3. 代码检查优于评判。 任何字符串匹配、解析器、模式检查、正则表达式或单元测试能决定的内容都是代码检查。在构建任何评估之前,先通过提示词编辑修复可修复的问题。将 LLM 评判保留给剩余的主观失败。
  4. 每个失败模式一个二值评判。 PASS 或 FAIL 加上一句批评。不使用 1-5 等级。多个质量维度意味着多个二值评判,报告为总通过率并附带每个检查的明细。
  5. 在信任评判之前先校准。 将其与人工标签进行比较,并分别报告 PASS 召回率和 FAIL 召回率,每个都带上 N 值。原始一致性永远不是重点:一个总是回答 PASS 的评判在 5% 的输出失败时,能有 95% 的一致性。
  6. 训练集、开发集、测试集。 少量示例仅来自训练集。在开发集上迭代。只读一次测试集,在最后。在更多编辑后再次读取测试集会使其变成第二个开发集。
  7. 固定评判配置。 模型 ID、effort、评判文本、输出模式以及少量示例的顺序都是测量工具的一部分。将它们与每个结果一起记录,并在其中任何一项发生变化时重新校准。不要假设确定性:对开发集运行两次并统计标签翻转次数。
  8. 每个数字都附带 N 和区间。 对于比率,使用威尔逊区间(Wilson interval),切勿使用正态近似。将两个版本在相同输入上作为配对数据进行比较。
  9. 回归集 100% 通过。 它包含复现的生产错误和策略边界。一次失败就阻止发布,而一次不稳定情况则是流程错误。
  10. 在差异上设门控,而不是绝对比率。 使用 references/ci-and-release-gates.md 中的四个等级。
  11. 在运行器中限制开销。 评判运行需要花钱。通过代码强制执行预算 (EVAL_BUDGET_USD),而不是作为打印警告。
  12. 构建最小的可用方案。 断言和大约 30 个标注示例优先于评判,校准过的评判优先于仪表板或评判集成。

选择工作流程

用户想要执行阅读
为没有评估的功能添加评估工作流程 Aerror-analysis, judges, datasets
编写或修复 LLM 评判提示工作流程 Bjudges, templates
判断现有评估是否可信工作流程 Cjudges, statistics
判断版本 B 是否优于版本 A工作流程 Dstatistics, ci-and-release-gates
在 CI 中运行评估工作流程 Eci-and-release-gates, datasets

工作流程 A:为功能添加评估

  1. 收集轨迹。 拉取至少 100 个多样化的轨迹,如果系统尚未上线,则在真实输入上运行它。将它们存储为 JSONL,每行带有稳定的 id。应记录的轨迹字段请参考 references/templates.md。
  2. 与用户一起进行错误分析(详细信息见 references/error-analysis.md)。一个人阅读轨迹,并在每个轨迹中首先出现问题的位置写下一行注释。一旦此人标注了至少 30 条,你可以构建一个简单的查看器,并将这些注释聚类为 4 到 7 个命名失败模式。对每个模式计数,并按频率乘以严重程度排序。
  3. 修复廉价的失败。 首先进行提示词和代码修复。重新运行并重新计数。
  4. 为每个规则能检测到的剩余模式编写代码检查。
  5. 为每个剩余的主观模式编写一个评判(工作流程 B)。
  6. 获取人工标签:每个失败模式的目标是 100 到 200 个标签,在开发集和测试集中各包含 30 到 50 个 PASS 和 30 到 50 个 FAIL。100 行的 40% 开发集划分可能无法容纳每类 30 个样本,并且在低失败率下,你必须对失败案例进行过采样以填充 FAIL 侧。从现有数据开始,并说明区间有多宽。
  7. 校准 每个评判在开发集上运行一次,然后在测试集上确认一次。
  8. 从复现的失败中构建回归集,并将测试套件集成到 CI(工作流程 E)。

交付物位于用户仓库中,除非他们已有布局:

evals/
  data/            labeled.jsonl (human labels), regression.jsonl, traces/
  rubrics/         每个失败模式一个文件
  codebook.md      标签、定义、2 个 PASS 和 2 个 FAIL 示例、最后 kappa 值
  checks.*         代码检查
  judge.*          评判调用、固定配置
  calibrate.*      划分、评分、报告、分歧
  run_eval.*       对输出评分、与基线比较、CI 退出代码
  runs/            每次运行一个文件夹:摘要、预测、评判副本

Python 和 TypeScript 的入门代码位于 https://github.com/ombharatiya/ai-evals-skills/tree/main/starters。复制一份而不是从头编写框架。

工作流程 B:编写或修复 LLM 评判

  1. 确认失败模式来自错误分析,并且代码检查无法捕获它。
  2. 编写由四部分组成的提示词(模板见 references/templates.md):角色和精确定义;二值标准("如果 X 则 PASS。如果 Y 则 FAIL,即使响应的其余部分正确。如有疑问,FAIL 并说明原因。");来自训练集的 2 或 3 个少量示例,包括一个看似通过的 FAIL 示例;以及一个严格的输出模式 {"label": "PASS" | "FAIL", "critique": "..."},如果 API 支持,使用结构化输出强制执行。解析器必须在格式错误时失败并报错。
  3. 校准:在开发集上运行,计算 PASS 召回率、FAIL 召回率和 Cohen's kappa,并阅读每个分歧。分别阅读假通过和假失败。如果人工标签错误,则修复标签,而不是评判文本。
  4. 每次迭代更改一件事,按典型影响顺序:评判文本的特定性、少量示例、输出模式,最后是模型交换。
  5. 预计在第二或第三次迭代时达到平台期。然后为边缘情况添加少量示例:两个在粗心阅读时看起来像 FAIL 的 PASS 示例,以及两个看起来像 PASS 的 FAIL 示例。如果 FAIL 召回率仍然没有变化,那么评判模型可能是天花板:在再次更改评判文本之前尝试更强的模型,并将新模型视为从头校准的新工具。
  6. 当 PASS 和 FAIL 召回率在开发集上都达到标准时停止(本指南默认为 0.90;根据错过失败的代价与误报的代价来设定),然后读取一次测试集。

工作流程 C:审计现有评估

检查每个项目并报告哪些失败,附上文件和行号:

  • 指标可追溯到有人在真实轨迹中观察到的失败模式。
  • 代码检查覆盖了代码可以决定的内容;评判是二值的,每个失败模式一个。
  • 每个评判都有校准记录:PASS 和 FAIL 召回率,附带 N 和区间,基于评判从未见过的测试集划分。仅靠一致性不算数。
  • 少量示例不包含在开发集或测试集中。
  • 评判配置(模型、effort、评判文本、模式、少量示例)已固定,并与校准时的配置匹配。
  • 每个报告的比率都有 N 和区间;比较是配对的。
  • 存在回归集,在每个 PR 上运行,并且 100% 通过。
  • 发布决策读取配对差异及其区间,而不是绝对阈值。
  • 数据集已版本化(内容哈希),结果指名了哈希值。
  • 一个已 100% 通过几个月的测试套件实际上没有测试任何东西。回归集是唯一的例外。

工作流程 D:比较两个版本

在相同的输入上运行两个版本。报告每个通过率及其威尔逊区间,以及配对差异及其区间:对于二值结果,使用 McNemar 检验或配对自举。首先确定值得检测的最小差异,然后确定样本大小(references/statistics.md)。在必要时按细分进行切片,并在进行多种切片时校正多重比较。来自低能力运行的“无显著差异”并非无差异的证据:说明该运行能够检测到多大的变化。

工作流程 E:CI 中的评估

三个层级:每次推送时运行 10 到 50 个确定性断言的烟雾层(无评判),在更改提示词或模型的 PR 上运行带有校准评判的完整层,以及运行扩展回归集和鲁棒性集的夜间层。在 PR 上发布基线与候选版本的对比表,包含差异、95% 区间以及“发布”、“暂缓”、“调查”或“阻止”的判定。在“调查”、“阻止”、回归集失败或测量损坏(无判定行、任一侧缺失行、使用非校准评判)时使任务失败,并报告“暂缓”由指定人员阅读:“暂缓”意味着区间无法判断变化与否。 从相同系统无变化的 A/A 运行中确定不关心窗口的大小,而不是零噪声下限。不允许静默覆盖:覆盖需要指定人员和书面原因。Fork PR 不获取 API 密钥。详细信息见 references/ci-and-release-gates.md。

如何报告结果

报告表格,而不是句子:

指标值95% 置信区间N评判数据集
FAIL 召回率,退款策略评判(测试集)0.92[0.80, 0.97]48claude-opus-5-5, medium, rubric a1b2c3labeled.jsonl @ 9f8e7d

说明这些数字不能支持什么。写作“区间较宽;标注更多 FAIL 示例”,而不是将弱结果四舍五入成结论。当提到 TPR 或 TNR 时指明正类:一些文献(包括 Hamel Husain 的常见问题解答)将 FAIL 视为正类,因此其 TPR 是捕获到的真实失败的比例。简单的“PASS 召回率”和“FAIL 召回率”避免了混淆。

默认值

除非用户的情况需要其他值,否则使用这些默认值。“网站默认值”指的是 aievals.co 自身的常用数字,而非公开标准。

决策默认值来源
首次错误分析通过100+ 条轨迹,仅第一个失败(Hamel 和 Shankar 常见问题解答);每条 15 到 45 秒FAQ,以及 aievals.co 的节奏说明
失败模式类别轴向编码后 4 到 7 个aievals.co 开放编码指南
每个失败模式的标签数100 到 200Hamel 和 Shankar 常见问题解答
划分15% 训练集,40% 开发集,45% 测试集,分层(入门代码使用每个 id 的哈希值进行划分,因此一行永远不会改变划分;比例仅平均匹配)aievals.co 校准配方
开发集和测试集中每类样本30 到 50 个 PASS 和 30 到 50 个 FAILHamel 和 Shankar 常见问题解答
评判召回率标准PASS 和 FAIL 召回率在开发集上至少为 0.90,并在测试集上确认网站默认值
自动化前的人类一致性kappa 至少 0.6 才继续,0.8 才作为黄金集或门控团队策略,依据指南
比率的区间威尔逊区间,95%aievals.co 统计章节
发布门控窗口主指标的 1 点不关心窗口;2 点轻微回归窗口aievals.co 发布门控章节
回归集每个 PR 100% 通过aievals.co 回归集章节

参考资料

加载与任务匹配的文件:

相关技能