跳到正文

更多文章

数据质量不要只靠告警:真正有效的是把责任放进流程里 为什么你做的看板没人用:BI 自助分析不是把图放上去就行 临时分析别做完就扔:数据人如何把一次取数变成可复用资产 别让 AI 直接查库:企业问数 Agent 上线前必须补的 5 个底座 数据团队正在被重新定价:会做报表的人,和能推动决策的人
LLM评估体系

BLEU 分数 0.45,用户投诉率 30%。你信哪个?

传统 NLP 评估指标与人类判断之间的相关性,在 LLM 时代几乎崩塌了。BLEU 高不代表答案好,ROUGE 低不代表答案差。LLM 评估需要一套完全不同的体系。


为什么 LLM 评估很难

三个根本性困难

1. 开放域输出,没有唯一正确答案

传统分类模型的评估很简单:预测标签和真实标签对比,算准确率。

LLM 的输出是自由文本。“Flink 的 Checkpoint 机制”这个问题,有无数个”正确”回答——详细的、简洁的、偏原理的、偏实践的。没有一个”golden answer”能覆盖所有合理表达。

2. 人工评估是黄金标准,但不可持续

请人类专家评估每一条输出,是最准确的方法,也是最贵、最慢的方法。每天产生 10 万条输出时,人工评估直接不可行。

3. 传统自动化指标与人类判断相关性差

指标原始设计场景LLM 场景下的问题
BLEU机器翻译评估只看 n-gram 重叠,忽略语义,同义词替换就得低分
ROUGE文本摘要评估关注词汇重叠,长答案比短答案天然高分
Perplexity语言模型评估反映流畅度,不反映正确性;流畅的幻觉也有低困惑度
Exact MatchQA 评估”2024年”和”2024”被判为不同答案

结论:需要一套新的评估框架,兼顾成本、速度和与人类判断的相关性。


三层评估体系总览

层级用途触发时机成本
第一层:自动化评估快速迭代验证,CI/CD 门禁每次 Prompt 变更极低
第二层:LLM-as-Judge更细致的质量评估每次版本发布前,日常抽样中等
第三层:人工评估建立基准,校准自动化指标新模型上线,高风险场景

三层体系的分工:第一层用于快速迭代(分钟级,成本最低);第二层用于质量校验(小时级,成本中等);第三层是黄金标准(天级,成本高),反过来校准前两层的指标。


第一层:自动化评估(RAGAS)

RAGAS(Retrieval Augmented Generation Assessment)是专门为 RAG 系统设计的评估框架,也是目前最被广泛使用的开源 LLM 评估工具之一。

四个核心指标

指标评估对象说明分值范围
Context Recall检索质量理想答案需要的信息,有多少比例在检索结果中?0~1
Context Precision检索质量检索结果中,有多少是真正有用的(非噪声)?0~1
Answer Relevancy生成质量模型的回答是否切题?0~1
Faithfulness幻觉检测回答中的事实是否都来自检索结果(无幻觉)?0~1

一句话记忆:

  • Context Recall = 检索有没有漏掉重要信息
  • Context Precision = 检索有没有引入无关噪声
  • Answer Relevancy = 回答有没有答非所问
  • Faithfulness = 回答有没有编造信息

RAGAS 完整评估流程

from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_recall, context_precision
from datasets import Dataset
eval_data = {
"question": [
"Flink 的 Checkpoint 和 Savepoint 有什么区别?",
"什么是 Kafka 的消费者组?",
],
"answer": [
"Checkpoint 是 Flink 自动触发的容错机制,用于故障恢复。Savepoint 是手动触发的状态快照,专用于版本升级和迁移。",
"消费者组是 Kafka 的消费端抽象,同组内的消费者共同消费一个 Topic 的所有分区,每个分区只被组内一个消费者消费。",
],
"contexts": [
[
"Apache Flink 的 Checkpoint 是一种容错机制,由 Flink 运行时自动触发...",
"Savepoint 是用户手动触发的全局一致性快照...",
],
[
"Kafka 消费者组(Consumer Group)允许多个消费者实例共同消费同一个 Topic...",
],
],
"ground_truth": [
"Checkpoint 自动触发用于故障恢复,Savepoint 手动触发用于版本升级和状态迁移。两者都是全局一致性快照。",
"消费者组使得多个消费者可以协作消费一个 Topic,实现负载均衡,每个分区在同一时刻只能被组内一个消费者消费。",
],
}
dataset = Dataset.from_dict(eval_data)
results = evaluate(
dataset=dataset,
metrics=[context_precision, context_recall, faithfulness, answer_relevancy],
)
print(results)
# {'context_precision': 0.88, 'context_recall': 0.75,
# 'faithfulness': 0.92, 'answer_relevancy': 0.85}

集成到 CI/CD

def run_automated_evaluation(test_cases_path: str, output_path: str) -> bool:
pass_threshold = {
"faithfulness": 0.85, # 幻觉率不超过 15%
"answer_relevancy": 0.80, # 回答相关性不低于 80%
"context_precision": 0.75, # 检索精度不低于 75%
}
with open(test_cases_path) as f:
test_cases = json.load(f)
dataset = Dataset.from_dict(test_cases)
results = evaluate(dataset=dataset, metrics=[faithfulness, answer_relevancy, context_precision])
scores = {
"faithfulness": results["faithfulness"],
"answer_relevancy": results["answer_relevancy"],
"context_precision": results["context_precision"],
}
passed = all(scores[k] >= pass_threshold[k] for k in pass_threshold)
print(f"评估{'通过' if passed else '未通过'}{scores}")
return passed
# CI/CD 中使用
# if not run_automated_evaluation("test_cases.json", "eval_report.json"):
# sys.exit(1) # 失败则阻断部署

MAX 会员专属

本文为 MAX 会员专属内容,升级到 MAX 即可阅读全文。

MAX ¥498/年 · 全部专属文章 + 2300+ 知识文档 + 1v1 咨询

Elazer (石头)
Elazer (石头)

11 年数据老兵,从分析师到架构专家。用真实经历帮数据人少走弯路。

加入免费社群

和数据从业者一起交流成长

了解详情 →

成为会员

解锁全部内容 + 知识库

查看权益 →

1v1 咨询

有具体职业困惑?一小时说清楚

预约咨询 →
← 上一篇 输出倒逼输入:数据人的最强学习策略 下一篇 → 职场认知 25|你才是最大的资产:数据人如何构建个人品牌和职业资本