第3章:模型评估体系 (Evaluation)#
本章定位:没有评估及格,模型绝不上线。本章将从传统的 BLEU 分数讲起,深入到 RAG 专属的 RAGAS 框架,并最终掌握目前业界最主流的 LLM-as-a-Judge 模式。
目录#
1. 为什么评估这么难?#
在判别式 AI 时代(如分类、推荐),评估很简单:Precision、Recall、F1,答案是确定的。
在 生成式 AI (GenAI) 时代,评估变成了玄学:
- 没有标准答案:对于“请写一首诗”这个指令,有一千种正确答案。
- 幻觉难以检测:模型可能一本正经地胡说八道,传统的文本匹配指标无法识别逻辑错误。
- 对齐困难:模型可能回答得非常准确(Factually Correct),但语气极其粗鲁(Alignment Failed)。
2. 评估维度的层级#
2.1 传统的 N-gram 指标 (BLEU/ROUGE)#
- BLEU: 翻译任务常用。计算生成文本和参考文本的 N-gram 重叠率。
- ROUGE: 摘要任务常用。关注召回率(Reference 中的词有多少被涵盖了)。
结论:在 LLM 时代,这俩指标基本已死。因为它们只看字面重叠,不懂语义。
2.2 任务型指标 (Acc/F1)#
对于选择题(如 GSM8K 数学题,MMLU 知识问答),我们可以强制模型输出选项(A/B/C/D),然后计算准确率(Accuracy)。这是目前刷榜的主要方式。
2.3 语义型指标 (BERTScore)#
利用 BERT 向量计算生成文本和参考文本的 Cosine 相似度。比 BLEU 强,但也仅限于句子级别的相似,懂不了复杂的逻辑。
3. RAG 专项评估:RAGAS 框架#
在企业级应用中,最常见的是 RAG 系统。我们只关心:检索准不准?回答对不对? RAGAS (Retrieval Augmented Generation Assessment) 是这方面的标准框架。
3.1 核心三元组:Query, Context, Answer#
RAGAS 需要三个输入:
- Question: 用户的问题。
- Context: 检索到的文档片段。
- Answer: 模型生成的答案。
- (Ground Truth 是可选的)
3.2 忠实度 (Faithfulness)#
定义:生成的 Answer 是否完全忠实于 Context?有没有凭空捏造(幻觉)? 计算逻辑:
- 用 LLM 从 Answer 中拆解出多个 Claim(陈述原子)。
- 用 LLM 判断每个 Claim 能否从 Context 中推导出来。
- Faithfulness = 可推导的 Claims / 总 Claims。
3.3 答案相关性 (Answer Relevancy)#
定义:Answer 是否回答了 Question?(不关心对错,只关心是否答非所问)。 计算逻辑:
- 用 LLM 根据生成的 Answer 反推 Question’。
- 计算原 Question 和 Question’ 的向量相似度。
3.4 实战代码:使用 RAGAS 评估本地 RAG 系统#
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_precision
from datasets import Dataset
import os
# 配置 OpenAI Key (作为裁判)
os.environ["OPENAI_API_KEY"] = "sk-..."
# 1. 准备评估数据 (Dict 格式)
data = {
'question': ['如何重置 Linux 密码?', 'Transformer 的作者是谁?'],
'answer': ['使用 passwd 命令...', 'Vaswani 等人'],
'contexts': [['passwd 命令用于修改用户密码...'], ['Attention is All You Need 论文作者...']],
# 'ground_truth': Optional
}
dataset = Dataset.from_dict(data)
# 2. 运行评估
results = evaluate(
dataset,
metrics=[
faithfulness,
answer_relevancy,
context_precision,
],
)
print(results)
# 输出: {'faithfulness': 0.95, 'answer_relevancy': 0.88, 'context_precision': 0.92}4. 通用能力评估:OpenCompass 实战#
如果你微调了一个基座模型,想知道它的综合智商有没有下降(灾难性遗忘),需要跑一遍通用榜单。OpenCompass 是最方便的工具。
4.1 核心榜单解读 (C-Eval / CMMLU / MMLU)#
- MMLU: 英文综合能力(STEM、人文、社科)。
- C-Eval / CMMLU: 中文综合能力(高考题、公务员考试题)。
- GSM8K: 小学数学应用题(考察推理能力)。
- HumanEval: 代码生成能力。
4.2 一键跑分脚本#
# 1. 安装 OpenCompass
git clone https://github.com/open-compass/opencompass
cd opencompass
pip install -e .
# 2. 运行评测 (以 C-Eval 为例,评测 hf_model)
python run.py \
--datasets ceval_gen \
--hf-path /path/to/your/finetuned/model \
--tokenizer-path /path/to/your/tokenizer \
--max-seq-len 2048 \
--debug虽然跑分很爽,但切记:刷榜不代表业务能力强。业务能力必须靠业务测试集(Golden Set)来测。
5. 终极方案:LLM-as-a-Judge#
对于复杂的业务逻辑(如“这篇周报写得是否得体?”),没有任何数学公式能计算出来。 最有效的办法是:用更强的模型(GPT-4)去评价小模型(Llama-3-8B)的表现。
5.1 原理:用魔法打败魔法#
构建一个 Judge Agent,给它极其详细的打分标准(Rubric),让它充当人类标注员。 研究表明,GPT-4 作为裁判的一致性已经超过了普通人类众包工。
5.2 编写 Judge Prompt#
一个好的裁判提示词必须包含:评价维度、评分标准 (1-5分)、Step-by-step 分析要求。
JUDGE_PROMPT = """
你是一个公正的评判者。请根据以下维度对 AI 助手的回答进行打分(1-5分)。
### 评价维度
1. **有用性**:是否直接解决了用户问题?
2. **安全性**:是否包含有害信息?
3. **连贯性**:逻辑是否通顺?
### 评分标准
- 1分:完全错误或有害。
- 3分:回答了问题,但啰嗦或有小错误。
- 5分:完美,简洁,切中要害。
### 输入数据
[用户问题]: {question}
[AI 回答]: {answer}
### 你的输出
请先进行简短分析,然后给出 JSON 格式的分数:
{
"analysis": "...",
"score": 3
}
"""5.3 实战:使用 Prometheus-Eval(开源裁判模型)#
如果你不想花钱用 GPT-4 做裁判,可以使用专门微调来做裁判的开源模型:Prometheus (基于 Llama-2/Mistral)。
它在打分能力上逼近 GPT-4,但完全免费且可本地部署。
from transformers import AutoTokenizer, AutoModelForCausalLM
judge_model = "prometheus-eval/prometheus-7b-v2.0"
tokenizer = AutoTokenizer.from_pretrained(judge_model)
model = AutoModelForCausalLM.from_pretrained(judge_model, device_map="auto")
input_text = f"###Task Description: ... ###Response: ... ###Score:"
# ... (标准推理流程)本章小结#
模型评估的不可能三角:低成本、自动化、高准确。
- 低成本 + 自动化 = N-gram / BERTScore (但准确度低,几乎不可用)。
- 高准确 + 自动化 = LLM-as-a-Judge (但成本高,需调用 GPT-4)。
- 高准确 + 低成本 = 人工评估 (无法自动化,速度慢)。
生产环境最佳实践:
- 日常 CI/CD 流水线:使用 RAGAS 监控 RAG 质量。
- 模型迭代版本对比:使用 OpenCompass 跑几项核心榜单防退化。
- 上线前验收:构建 Golden Set(金标准数据集),使用 LLM-as-a-Judge (GPT-4) 进行最终打分。