No.366
大模型应用有哪些评测指标?
一句话回答
指标要按任务类型选。分类、抽取这类有确定答案的任务,用准确率、精确率、召回率、F1 和精确匹配;开放生成的任务,BLEU、ROUGE 只比较字面重合,和人对质量的判断常常不一致,更多用语义相似度和模型按维度打分(正确性、完整性、忠实度、相关性、安全性)。最终还要看业务指标(采纳率、解决率、转人工率)和性能指标(延迟、成本)。没有一个指标能代表全部,通常组合使用。
详细解析
有确定答案的任务
- 准确率:整体答对的比例。类别不平衡时会误导:95% 的邮件是正常邮件,全部判成"正常",准确率也有 95%
- 精确率、召回率、F1:精确率是判为某类的样本中真正属于这类的比例,召回率是真正属于这类的样本中被找出来的比例,F1 = 2PR / (P + R)。多分类时按类别分别计算,再做宏平均(各类别直接平均)或微平均(先汇总计数再计算)
- 抽取任务:按字段比较,比较前先规范化(去空格、统一日期格式和大小写);人名列表这类多值字段,用集合计算精确率和召回率
- 结构化输出:JSON 能否解析、是否符合 Schema
- 工具调用:是否选对了工具、参数是否正确
开放生成的任务
- BLEU、ROUGE:统计输出和参考答案之间 n-gram(连续 n 个词)的重合程度。BLEU 偏重精确率,来自机器翻译;ROUGE 偏重召回率,来自自动摘要
- 它们的局限:同义改写会被扣分,而"支持"和"不支持"只差一个字,重合度却很高;一个问题往往有多种好的回答,一个参考答案覆盖不了;中文还要先分词。所以只适合作为参考
- 语义相似度:用 Embedding 计算输出和参考答案的余弦相似度,能容忍换说法,但对否定、数字这类关键细节同样不敏感
- 模型打分:按维度让评委模型打分,这是开放生成任务的主要手段(见 LLM-as-a-Judge)
| 维度 | 判断什么 | 典型场景 |
|---|---|---|
| 正确性 | 和参考答案或已知事实是否一致 | 问答 |
| 完整性 | 要点有没有遗漏 | 总结、方案 |
| 忠实度 | 内容是否都有资料依据,有没有编造 | RAG、摘要 |
| 相关性 | 是否回答了问题,有没有答非所问 | 所有对话 |
| 安全性 | 有没有有害内容、隐私泄露、越权的承诺 | 面向用户的应用 |
业务指标和性能指标
- 业务指标:采纳率(代码补全被接受、生成的回复被直接发送)、解决率(客服对话不转人工就结束)、转人工率、满意度、点踩率、重新生成率
- 性能指标:首 token 延迟和总耗时的 P95、P99,每次请求的 token 数和费用,每个成功任务的成本,错误率和超时率(见 首 Token 延迟、成本估算)
按任务选指标
| 任务 | 主要指标 | 辅助指标 |
|---|---|---|
| 分类、意图识别 | 各类别的 F1、混淆矩阵 | 准确率 |
| 信息抽取 | 字段级精确匹配、精确率、召回率 | JSON 合法率 |
| 摘要 | 忠实度、完整性 | ROUGE |
| RAG 问答 | Recall@k、忠实度、正确性 | 引用是否准确 |
| 对话、客服 | 相关性、解决率、转人工率 | 满意度 |
| 代码生成 | 单元测试通过率(pass@k) | 采纳率 |
| Agent | 任务完成率、成本、步数 | 工具调用的正确率 |
代码示例
多值字段(如抽取出的所有人名)在整个评测集上计算微平均的精确率、召回率和 F1:
TypeScript
const normalize = (s: string) => s.trim().toLowerCase()
function microPRF(samples: { predicted: string[]; expected: string[] }[]) {
let tp = 0
let predicted = 0
let expected = 0
for (const s of samples) {
const P = new Set(s.predicted.map(normalize))
const E = new Set(s.expected.map(normalize))
tp += [...P].filter((x) => E.has(x)).length // 抽对的数量
predicted += P.size
expected += E.size
}
const precision = predicted ? tp / predicted : 0
const recall = expected ? tp / expected : 0
const f1 = precision + recall ? (2 * precision * recall) / (precision + recall) : 0
return { precision, recall, f1 }
}
面试官可能追问
代码生成常说的 pass@k 是什么?
每个问题生成 k 个答案,只要有一个通过单元测试就算解决,pass@k 是解决的概率。直接生成 k 个来估算,结果波动很大,常用的无偏估计是:每题生成 n 个(n ≥ k),其中 c 个通过,pass@k = 1 − C(n − c, k) / C(n, k),再对所有题目取平均。它适合"可以多试几次、有测试能自动挑出正确答案"的场景。
准确率很高,为什么上线后效果还是不好?
常见原因:类别不平衡,准确率被多数类撑高,少数关键类别其实做得很差;评测集和线上分布不一致;指标和业务目标没对齐,比如意图识别的准确率很高,但识别错的恰好是最影响用户的那几类。要按类别看指标,并把离线指标和业务指标放在一起看。
离线指标和业务指标对不上,怎么办?
先看具体的样本:离线得分高、用户却不满意的对话,问题出在哪里。通常能发现评分细则漏了某个用户在意的维度,比如简洁、可操作。把这个维度补进评分标准,再积累一段时间的数据,看哪些离线指标的变化和业务指标的变化方向一致,以后优先参考这些指标。
易错点
- 用 BLEU、ROUGE 评价对话或问答的质量
- 类别不平衡时只看准确率
- 只看质量不看成本和延迟,更强的模型往往也更慢、更贵
- 只看平均值:延迟要看 P95、P99,质量要看表现最差的那一类问题
AI 模拟面试官
用自己的话回答,AI 对照参考答案打分、指出遗漏,再追问,最多 3 轮
登录后就可以和 AI 面试官对练,面试记录也会保存下来。登录
这道题你掌握了吗?
选一个最接近的状态,没掌握的题会出现在"我的进度 · 待复习"里。
学习记录暂存在本机浏览器。登录后自动同步到账号,换设备也能看到。