AI Eval Harness:把 Prompt 从经验变成工程
来源:对 Prompt 工程、AI 编程和 Agent 架构讨论的补充整理。
核心问题:如果 Prompt 是任务说明书,那么 Harness 就是验证这份说明书是否稳定有效的测试台。
一句话结论
Prompt 决定模型“怎么做”,Harness 决定我们“如何知道它做得对不对”。
没有 Harness,Prompt 调优很容易变成凭感觉改词;有了 Harness,Prompt、模型、工具和上下文策略才能进入工程迭代。
可以这样理解:
Prompt = 写给模型的任务规格说明
Harness = 用来批量运行、记录、比较、评分的评测与回归测试框架1. 为什么需要 Harness?
很多 AI 应用一开始都是这样调 Prompt:
改一句 prompt
↓
手动跑几个例子
↓
感觉效果好一点
↓
上线问题是,这种方式不可复现、不可比较,也很难防止退化。
AI 输出还有几个特点:
- 同一个输入可能有不同输出。
- 模型升级后行为会漂移。
- Prompt 小改动可能影响很多边界案例。
- 工具调用、RAG、上下文压缩都会改变结果。
- 人眼看几个样例,很难覆盖真实分布。
所以需要 Harness,把 AI 能力变成可测试对象。
2. Harness 评测的不是模型本身,而是整个任务系统
一个常见误区是把 eval harness 理解成“测模型智商”。
在应用工程里,Harness 更应该评测完整链路:
input dataset
↓
prompt / system prompt
↓
context construction / RAG / memory
↓
tool definitions / tool results
↓
model
↓
parser / schema validation
↓
scorer / evaluator
↓
report / regression comparison所以它测的不是单独某个 LLM,而是:
在当前 Prompt、上下文、工具、模型和解析逻辑组合下,这个任务系统是否稳定产出合格结果。
3. Harness 的基本组成
一个最小可用的 Harness 通常包含 6 个部分。
1. Evaluation Dataset
也就是测试集。
每条样例至少包含:
{
"id": "case_001",
"input": "用户原始问题或文档片段",
"expected": "期望结果或判断标准",
"tags": ["normal", "edge_case"],
"notes": "为什么这个样例重要"
}样例来源最好是真实任务,而不是只靠人工编造。
可以分为:
- happy path
- edge case
- adversarial case
- regression case
- high-value business case
- safety / compliance case
2. Runner
Runner 负责批量执行任务。
它要记录:
- 使用的模型
- prompt 版本
- 输入样例
- 输出结果
- tool call trace
- token / latency / cost
- 错误信息
- 时间戳
也就是说,每次评测都应该可复现、可追踪。
3. Output Parser
如果输出是结构化结果,必须先解析。
例如 JSON 输出要验证:
- 是否是合法 JSON
- 是否符合 schema
- 是否字段齐全
- 字段类型是否正确
- 是否包含非法值
这一步很重要,因为很多 AI 结果看起来像 JSON,但其实不能被程序稳定消费。
4. Scorer
Scorer 负责判断结果好坏。
常见方式有三类:
精确匹配
适合分类、选择题、固定字段:
expected.status == actual.status规则评分
适合工程任务:
- JSON schema 是否通过
- 是否引用了原文证据
- 是否包含必填字段
- 是否出现禁止内容
- 数值是否在合理范围
LLM-as-Judge
适合开放式输出:
- 摘要质量
- 答案是否忠实原文
- 建议是否可执行
- 风险点是否完整
但 LLM-as-Judge 不能只输出一个分数,最好输出结构化判断:
{
"pass": true,
"score": 4,
"reason": "覆盖了主要事实,但遗漏了一个边界条件",
"missing_points": ["..."]
}5. Report
Report 不只是平均分。
至少要能看:
- 总体通过率
- 各类标签通过率
- 失败样例列表
- 和上一个版本相比是提升还是退化
- token / latency / cost 变化
- 典型失败原因
真正有价值的是 regression report:
prompt_v12 相比 prompt_v11:
- 总通过率:82% → 87%
- edge case:70% → 76%
- 成本:+8%
- 新增退化样例:3 个6. Golden Cases
Golden cases 是最重要的业务样例。
这些样例不一定多,但必须稳定通过。
例如法律/移民/文档解析类任务里,golden cases 可能包括:
- 表格字段抽取
- 证据日期识别
- 用户身份信息合并
- 文档类型判断
- 不确定信息标记
- 不得编造原文中不存在的事实
Golden cases 的作用是防止 Prompt 或模型升级时破坏核心能力。
4. Harness 和 Prompt 工程的关系
Prompt 工程不是孤立的。
更完整的闭环应该是:
设计 Prompt
↓
在 Harness 上跑 eval dataset
↓
查看失败样例
↓
分析失败模式
↓
修改 Prompt / schema / context / tool
↓
再次评测
↓
对比 regression report
↓
决定是否上线所以 Prompt 调优不应该是“凭感觉改句子”,而应该是:
根据失败样例和评测报告,定向修改任务说明、输出格式、上下文构造和评分标准。
5. Harness 特别适合哪些场景?
1. Prompt 版本迭代
每次改 Prompt,都跑一遍固定评测集,确认没有破坏旧能力。
2. 模型切换
例如从一个模型切到另一个模型,需要比较:
- 准确率
- 稳定性
- 成本
- 延迟
- schema 遵守能力
- 工具调用质量
3. RAG 策略调整
例如调整:
- chunk size
- top-k
- reranker
- query rewrite
- metadata filter
- citation 策略
都应该通过 Harness 比较。
4. Agent 工具调用
Agent 不只是回答文本,还会调用工具。
Harness 应该记录和评估:
- 是否选择了正确工具
- tool 参数是否正确
- 是否重复调用
- 是否漏掉必要工具
- tool result 是否被正确使用
- 最终回答是否忠实于 tool result
5. 文档解析 / 信息抽取
非常适合建立 golden dataset:
- 输入文档
- 期望 JSON
- 字段级评分
- 引用页码 / 原文证据
- 不确定字段标记
6. 一个最小 Harness 结构
evals/
cases/
prompt_cases.jsonl
document_cases.jsonl
prompts/
extract_profile_v1.md
extract_profile_v2.md
schemas/
profile.schema.json
run_eval.py
score.py
reports/
2026-05-23_prompt_v2.json每条 case 可以长这样:
{
"id": "doc_001",
"input_file": "fixtures/bank_statement_sample.pdf",
"task": "extract_financial_evidence",
"expected": {
"document_type": "bank_statement",
"account_holder_present": true,
"statement_period_present": true
},
"tags": ["document", "table", "golden"]
}一次评测输出:
{
"run_id": "2026-05-23T12:00:00Z",
"prompt_version": "extract_profile_v2",
"model": "gpt-5.5",
"total": 120,
"passed": 103,
"failed": 17,
"pass_rate": 0.858,
"cost_usd": 3.42,
"latency_p50_ms": 1800,
"latency_p95_ms": 6200
}7. 最重要的工程原则
不要只评估最终自然语言
优先让模型输出结构化中间结果,再评分。
例如不要只看:
这份文档看起来像银行流水。而是要求:
{
"document_type": "bank_statement",
"evidence": [
{
"field": "account_holder",
"value": "...",
"page": 1,
"quote": "..."
}
],
"uncertain_fields": []
}这样 Harness 才能稳定评分。
评估集要版本化
Prompt、模型、case、schema 都要版本化。
否则你无法知道性能变化来自哪里。
失败样例比平均分更重要
平均分只能告诉你“好像变好了”。
失败样例会告诉你:
- 哪类场景坏了
- 为什么坏
- 是否是业务不可接受的坏
- 应该改 Prompt、检索、工具,还是 schema
用 Harness 约束上线,而不是装饰报告
如果 Harness 只是偶尔跑一次,它的价值有限。
更好的方式是放进发布流程:
改 Prompt / 改模型 / 改 RAG 参数
↓
自动跑 eval
↓
核心 golden cases 必须全过
↓
总体指标不能明显退化
↓
人工复核新增失败样例
↓
上线8. 最终总结
Prompt 工程解决的是“如何把任务交代清楚”。
Harness 解决的是“如何证明这个交代方式稳定有效”。
如果没有 Harness,AI 应用很难从 demo 进入生产,因为你无法回答:
- 改 Prompt 后有没有退化?
- 换模型后哪个更好?
- RAG 参数改了是否真的提升?
- Agent 是否稳定调用正确工具?
- 输出 JSON 是否能被下游系统稳定消费?
- 核心业务样例是否仍然通过?
所以,真正工程化的 AI 应用应该是:
Prompt + Schema + Context Strategy + Tooling + Eval HarnessPrompt 是入口,Harness 是质量控制系统。