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 Match | QA 评估 | ”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 evaluatefrom ragas.metrics import faithfulness, answer_relevancy, context_recall, context_precisionfrom 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% }
本文作者:Elazer (石头)
原文链接:https://ss-data.cc/posts/llm-evaluation-system
版权声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
未在播放
0:00 0:00