为什么需要 Prompt 评估
我们已经讲了 Role Prompting、Instruction Engineering、模板化。但一个尴尬的现实:
大多数 Prompt 优化靠"感觉"。
开发者:我改了一个词,感觉输出好了一点
同事:怎么证明?
开发者:……凭感觉
这导致三个问题:
- 不可复现:今天"感觉好",明天可能"感觉差"
- 不可比较:A 版本和 B 版本哪个更好?无数据支撑
- 不可回归:改了 A 优化了,但 B 退步了吗?不知道
Prompt 评估的目标:用数据替代感觉,建立可量化的优化闭环。
四类评估指标
1. 准确性(Accuracy)
输出是否与标准答案一致:
问题:2+2=?
输出:4 → 准确
输出:5 → 不准确
适合:有唯一解的任务(数学、事实问答、分类)。
度量:
- 精确匹配(Exact Match)
- F1 分数(部分匹配)
- BLEU/ROUGE(文本相似度)
2. 忠实性(Faithfulness)
输出是否基于给定信息,无幻觉:
给定资料:北京人口 2189 万
问题:北京人口多少?
输出:北京人口 2189 万 → 忠实
输出:北京人口 3000 万 → 幻觉
适合:RAG、摘要、翻译。
度量:
- 引用覆盖率(每个事实是否有来源)
- 幻觉率(无来源的事实占比)
3. 相关性(Relevance)
输出是否回答了问题:
问题:如何优化 SQL?
输出:SQL 是结构化查询语言... → 不相关(答非所问)
输出:优化 SQL 的 5 个方法... → 相关
适合:问答、咨询、建议。
度量:
- 语义相似度(输出与问题的向量相似度)
- LLM 评分(让 GPT-4 判断 1-5 分)
4. 格式性(Format Compliance)
输出是否符合格式要求:
要求:输出 JSON
输出:{"name":"张三"} → 符合
输出:张三的姓名是张三 → 不符合
适合:程序化处理场景。
度量:
- JSON 可解析率
- 字段完整率
- 字段类型正确率
评估数据集构建
数据来源
| 来源 | 质量 | 数量 | 适合 |
|---|---|---|---|
| 真实用户问题 | 高 | 中 | 生产评估 |
| 人工标注 | 高 | 小 | 基准测试 |
| 历史日志 | 中 | 大 | 回归测试 |
| LLM 生成 | 中 | 大 | 快速起步 |
| 公开数据集 | 中 | 大 | 通用对比 |
数据集结构
{
"test_cases": [
{
"id": "001",
"input": "总结这篇文章",
"context": "(文章内容)",
"expected": "(期望摘要)",
"tags": ["摘要", "中文"],
"difficulty": "easy"
},
{
"id": "002",
"input": "提取合同金额",
"context": "(合同文本)",
"expected": "50000",
"tags": ["抽取", "数字"],
"difficulty": "medium"
}
]
}
数据集规模
| 阶段 | 数量 | 说明 |
|---|---|---|
| 开发期 | 20-50 | 快速迭代 |
| 测试期 | 100-200 | 回归测试 |
| 上线期 | 500+ | 持续监控 |
经验:20 个高质量测试用例 > 200 个低质量用例。
评估方法
方法 1:人工评估
最准确但最贵:
评估员看输出 → 打分(1-5)→ 统计平均分
适合:最终验收、主观质量评估。 要求:至少 3 个评估员,计算评分一致性(Cohen's Kappa)。
方法 2:LLM-as-Judge
用 GPT-4 评估输出质量:
你是评估专家。请评估以下输出质量:
问题:{question}
期望输出:{expected}
实际输出:{actual}
评分(1-5):
- 准确性:?
- 忠实性:?
- 相关性:?
理由:?
适合:大规模自动化评估。 注意:LLM 评估有偏差,需与人工评估校准。
方法 3:程序化评估
用代码计算客观指标:
def evaluate(output, expected):
# 精确匹配
exact_match = output.strip() == expected.strip()
# 字符相似度
similarity = SequenceMatcher(None, output, expected).ratio()
# 关键词覆盖
keywords = extract_keywords(expected)
coverage = sum(1 for k in keywords if k in output) / len(keywords)
return {
"exact_match": exact_match,
"similarity": similarity,
"coverage": coverage
}
适合:格式化输出、事实抽取、分类任务。
方法 4:A/B 测试
对比两个 Prompt 版本:
100 个测试用例
→ Prompt A 跑一遍 → 得分 85
→ Prompt B 跑一遍 → 得分 88
→ B 更优,但需检查是否有退步的用例
适合:迭代优化、版本决策。
自动化评估流程
┌──────────────────────────────────────────┐
│ Prompt 评估闭环 │
│ │
│ 1. 测试数据集 │
│ ↓ │
│ 2. 运行 Prompt(对每个用例) │
│ ↓ │
│ 3. 评估(人工/LLM/程序) │
│ ↓ │
│ 4. 生成报告(分数+问题用例) │
│ ↓ │
│ 5. 分析瓶颈(哪类用例失败) │
│ ↓ │
│ 6. 优化 Prompt │
│ ↓ │
│ 7. 回归测试(确保没退步) │
│ ↓ │
│ 8. 上线(若优于当前版本) │
└──────────────────────────────────────────┘
代码示例
import json
from openai import OpenAI
client = OpenAI()
def run_eval(prompt, test_cases):
results = []
for case in test_cases:
# 运行 Prompt
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": prompt},
{"role": "user", "content": case["input"]}
]
)
output = response.choices[0].message.content
# 评估
score = llm_judge(case["input"], output, case["expected"])
results.append({
"id": case["id"],
"score": score,
"output": output
})
# 汇总
avg_score = sum(r["score"] for r in results) / len(results)
failures = [r for r in results if r["score"] < 3]
return {
"avg_score": avg_score,
"total": len(results),
"failures": len(failures),
"failure_cases": failures
}
def llm_judge(question, actual, expected):
"""用 GPT-4 做评估员"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": f"""评估输出质量(1-5 分):
问题:{question}
期望:{expected}
实际:{actual}
只输出数字。"""
}]
)
return int(response.choices[0].message.content.strip())
优化策略
策略 1:分析失败模式
失败用例分类:
- 30%:格式不符 → 加强格式约束
- 25%:信息遗漏 → 增加"必须包含"指令
- 20%:幻觉 → 添加"不确定时说明"
- 15%:冗余 → 添加"简洁"约束
- 10%:其他
按失败模式针对性优化,比盲目调 Prompt 高效 10 倍。
策略 2:迭代优化
v1:平均分 72 → 主要问题:格式
v2(加格式约束):78 → 主要问题:幻觉
v3(加忠实性约束):83 → 主要问题:遗漏
v4(加完整性约束):87 → 收益递减,停止
策略 3:回归测试
每次改 Prompt 后,全量跑测试集,确保:
- 改进的目标维度提升了
- 其他维度没退步
- 没有新的失败用例
策略 4:成本优化
评估还需考虑:
- 延迟:响应时间是否达标
- Token 消耗:输入/输出 token 数
- API 费用:单次调用成本
工具推荐
| 工具 | 特点 | 适合 |
|---|---|---|
| LangSmith | LangChain 生态,可视化 | LangChain 用户 |
| Promptflow | 微软出品,企业级 | 企业级评估 |
| Promptfoo | 开源 CLI 工具 | 开发者 |
| OpenAI Evals | OpenAI 官方 | GPT 评估 |
| DeepEval | Python 单元测试风格 | 测试工程师 |
| 自建 | 灵活可控 | 定制需求 |
常见误区
- 误区 1:评估一次就够了。Prompt 优化是迭代过程,每次改动都需评估。
- 误区 2:只看平均分。平均分可能掩盖某类用例的退步,需分类分析。
- 误区 3:测试集太小。20 个用例的统计意义有限,至少 50+。
- 误区 4:LLM 评估 100% 准确。LLM 评估有偏差,需定期人工校准。
- 误区 5:只评估准确率。还需考虑延迟、成本、格式等多维度。
- 误区 6:评估集与训练集混用。评估集必须独立,不能用来"调"Prompt。
与其他 Prompt 技巧的关系
| 技巧 | 与评估的关系 |
|---|---|
| Instruction Engineering | 评估"指令遵循度" |
| Few-shot | 评估"示例有效性" |
| Self-Consistency | 评估"多次采样稳定性" |
| 模板化 | 模板的版本评估 |
最佳实践:先建立评估集,再做优化,每次改动用数据说话。
进阶技巧
- 对抗测试:故意构造刁钻输入,测试 Prompt 鲁棒性
- 多模型评估:同一 Prompt 在 GPT-4/Claude/Gemini 上对比
- 用户反馈闭环:收集线上"赞/踩",持续优化评估集
- CI/CD 集成:Prompt 变更自动触发评估,不达标阻止上线
- A/B 灰度:新 Prompt 灰度 10% 流量,对比效果
小结
Prompt 评估是 Prompt 工程的质量保证环节:从"凭感觉"进化到"数据驱动"。核心要点:
- 四类指标:准确性、忠实性、相关性、格式性
- 三种方法:人工、LLM-as-Judge、程序化
- 闭环流程:测试集 → 运行 → 评估 → 分析 → 优化 → 回归
- 工具辅助:LangSmith/Promptflow 提升效率
当你发现团队在"争论哪个 Prompt 更好"时,就是启动评估体系的信号。
Prompt 工程进阶系列至此完结。从 Role Prompting 到评估优化,5 篇文章覆盖了从"写好一个 Prompt"到"管理 Prompt 质量"的完整闭环。下一篇我们将开启新的主题系列。