跳到正文

更多文章

影响力日常操作系统:21天习惯养成计划 从技能雇佣者到价值创造者 互惠账户的运营 影响力的三层架构 组织的注意力经济学
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%
}

MAX 会员专属

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

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

Elazer (石头)
Elazer (石头)

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

加入免费社群

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

了解详情 →

成为会员

解锁全部内容 + 知识库

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