RAG 评估全家桶|四大框架对比 + 核心指标算法揭秘 + 生产实战 Recipe,一篇打通评估全链路
RAG 评估全家桶|四大框架对比 + 核心指标算法揭秘 + 生产实战 Recipe,一篇打通评估全链路
导读:你改了 embedding 模型,"应该"效果更好吧?你加了 reranker,"应该"更准吧?你把 chunk_size 从 500 改到 1024,"应该"更全吧?所有"应该"都是猜测,没有数据支撑。RAG 系统没有评估 = 玄学开发,本文带你从 0 到 1打通评估全链路——4 大维度、4 大框架、5 大指标算法、4 套生产 Recipe、10 大常见坑。
阅读时长:约 30 分钟。适合有 RAG 基础、想从"能跑"走向"能用"的工程师。
一、为什么 RAG 必须要评估?
1.1 没有评估的 RAG 是"玄学"
工程师 A: 我换了 embedding 模型,应该效果更好吧?
工程师 B: 我加了 reranker,应该更准吧?
工程师 C: 我把 chunk_size 从 500 改到 1024,应该更全吧?
问题:所有"应该"都是猜测,没有数据支撑。
1.2 评估解决的核心问题
| 问题 | 不评估时 | 评估后 |
|---|---|---|
| 改动是否引入回归? | 拍脑袋 | 量化对比 |
| 不同模型哪个更好? | 看 demo | 多维度打分 |
| 线上 RAG 表现如何? | 等用户投诉 | 主动发现 |
| prompt 改了影响多大? | 心里没数 | A/B 对比 |
1.3 RAG 评估 vs 传统 ML 评估
| 维度 | 传统 ML | RAG |
|---|---|---|
| 输出 | 结构化(类别/数值) | 自然语言文本 |
| 评估方式 | 精确率/F1 等公式 | LLM-as-judge / Embedding |
| 难点 | 类别不平衡 | 主观性、多面性 |
| 工具 | sklearn.metrics | RAGAS / TruLens / DeepEval |
二、RAG 评估的四大维度
2.1 全图速览
用户问题 (query)
│
┌───────────────┼───────────────┐
│ │ │
▼ ▼ ▼
① 检索阶段 ② 生成阶段 ③ 业务定制
│ │ │
┌───┴───┐ ┌───┴───┐ │
│上下文 │ │答案 │ │
│召回率 │ │忠实度 │ │
│上下文 │ │答案 │ │
│精确度 │ │相关性 │ │
└───────┘ │答案 │ │
│正确性 │ │
└───────┘ │
│
④ 安全/合规
│
毒性/偏见/幻觉
2.2 四大维度速查表
| 维度 | 评估什么 | 防什么 | 典型指标 |
|---|---|---|---|
| 检索质量 | 上下文好不好 | 检索不到 / 检索噪声 | Context Precision / Recall |
| 生成忠实度 | 答案有没有瞎编 | 幻觉 | Faithfulness / Groundedness |
| 生成相关性 | 答案有没有跑题 | 答非所问 | Answer Relevancy |
| 生成正确性 | 答案对不对 | 事实错误 | Correctness / Similarity |
2.3 失败案例 → 对应维度
| 失败现象 | 对应评估维度 |
|---|---|
| 用户问 A,检索到 B(无关文档) | 上下文精确度 |
| 答案漏了关键信息 | 上下文召回率 |
| 答案里有文档没说的内容 | 忠实度(幻觉) |
| 答案东拉西扯不切题 | 答案相关性 |
| 答案和参考答案不一致 | 答案正确性 |
三、四大主流框架对比
3.1 框架定位
| 框架 | 一句话定位 | 核心比喻 |
|---|---|---|
| RAGAS | 离线评估的事实标准 | 考试评分 |
| TruLens | 生产监控的可观察性 | 行车记录仪 |
| DeepEval | pytest 风格的 CI 评估 | 单元测试 |
| LlamaIndex Eval | LlamaIndex 内置 A/B 测试 | 对照实验 |
3.2 核心特征对比
| 维度 | RAGAS | TruLens | DeepEval | LlamaIndex Eval |
|---|---|---|---|---|
| 集成度 | 独立 | 独立 | 独立 | 与 LlamaIndex 绑定 |
| API 风格 | 函数式 | 装饰器 | 类 unittest | 类 LlamaIndex |
| 数据来源 | dataset | 在线请求 | 测试用例 | query_engine 输出 |
| 典型场景 | 模型选型 | 生产监控 | CI/CD | 配置调优 |
| 可视化 | pandas | Streamlit | Confident AI | pandas |
| 学习曲线 | 低 | 中 | 中 | 中(依赖 LlamaIndex) |
3.3 指标对应表(同名不同算法)
| 评估维度 | RAGAS | TruLens | DeepEval | LlamaIndex Eval |
|---|---|---|---|---|
| 忠实度 | Faithfulness | Groundedness | FaithfulnessMetric | FaithfulnessEvaluator |
| 答案相关性 | Answer Relevancy | Answer Relevance | AnswerRelevancyMetric | RelevancyEvaluator |
| 上下文精确度 | Context Precision | Context Relevance | ContextualPrecisionMetric | (无直接对应) |
| 上下文召回 | Context Recall | - | ContextualRecallMetric | (无直接对应) |
| 答案正确性 | Answer Correctness | - | AnswerCorrectnessMetric | CorrectnessEvaluator |
💡 重点洞察:字段名不同但含义一样。比如 RAGAS 的
ground_truth= DeepEval 的expected_output= LlamaIndex 的reference,本质都是"标准答案"。
四、核心心智模型
4.1 RAG 评估的目标函数
RAG 系统质量 = 检索质量 × 生成质量 × 业务定制
检索质量 = α₁·Precision + α₂·Recall + α₃·EntitiesRecall
生成质量 = β₁·Faithfulness + β₂·Relevancy + β₃·Correctness
业务定制 = γ₁·Safety + γ₂·Politeness + ...
权重 α, β, γ 由业务决定(客服 vs 医疗 vs 法律差异巨大)
4.2 评估的三个阶段
开发期(设计/调优)
─────────────────
· 数据集:固定测试集(DatasetGenerator 自动生成)
· 工具:LlamaIndex Eval(A/B 对比)、RAGAS(量化)
· 目标:找到最优配置(chunk_size、embedding、模型等)
上线前(验收/回归)
─────────────────
· 数据集:业务专家标注的金标准集
· 工具:DeepEval(pytest 集成)、RAGAS(深度评估)
· 目标:保证 PR 不引入回归
生产期(监控/调试)
─────────────────
· 数据集:真实用户请求(采样)
· 工具:TruLens(实时追踪)、Confident AI(云看板)
· 目标:发现线上问题、追踪某次失败
4.3 评估的成本曲线
评估准确度
▲
│
1.0 │ ★★★ 人工评估(成本极高)
│ ★
│ ★ LLM-as-Judge(gpt-4)
│ ★
│ ★ LLM-as-Judge(gpt-4o-mini)
│ ★
│ ★
│ ★ Embedding 相似度
│★
│
└─────────────────────────────────► 评估成本
关键洞察:评估本身也要 ROI——不是越准越好,而是"够用就好"。
五、核心指标的数学本质
这一节是整篇文章最硬核的部分。
5.1 四大指标的算法分类
| 指标 | 算法分类 | 是否需 LLM | 是否需 Embedding |
|---|---|---|---|
| Faithfulness | NLI(自然语言推理) | ✅ | ❌ |
| Answer Relevancy | 反向问题生成 + 余弦相似度 | ✅ | ✅ |
| Context Precision | Precision@k 加权 | ✅ | ❌ |
| Context Recall | NLI(反向,验证参考答案) | ✅ | ❌ |
| Semantic Similarity | 余弦相似度 | ❌ | ✅ |
5.2 Faithfulness 的 NLI 本质
NLI(Natural Language Inference)任务:
给定前提 P 和假设 H,判断关系:
· Entailment(推出):P → H 成立
· Contradiction(矛盾):P → H 不成立
· Neutral(中立):P 推不出 H
Faithfulness 应用:
· 前提 P = 检索到的上下文
· 假设 H = 答案的每条原子陈述
· 判断:上下文能否推出这条陈述?
公式:Faithfulness = |Entailment| / |总陈述|
5.3 Answer Relevancy 的反向问题生成
这是 RAGAS 最巧妙的设计:
正向比较:原问题 vs 答案
→ 短问题 vs 长答案 → 向量分布不同 → 相似度天然偏低
反向比较:让 LLM 根据答案反推 N 个问题
Q_orig = "孙悟空武器?"
Q_gen = ["武器是什么?", "用什么兵器?", "金箍棒是谁的?"]
sim = mean([cos(embed(Q_orig), embed(q_i)) for q_i in Q_gen])
→ 同维度比较,更稳定
→ 多个反向问题求平均,降低方差
5.4 Context Precision 的 Mean Reciprocal Rank
检索结果:[doc1, doc2, doc3, doc4, doc5]
相关性: [✅, ❌, ✅, ❌, ❌]
Precision@1 = 1/1 = 1.0
Precision@2 = 1/2 = 0.5
Precision@3 = 2/3 = 0.67
...
加权(只算 relevant 的位置):
Context Precision = (1.0/1 + 0.67/3) / |relevant|
= (1.0 + 0.22) / 2
= 0.61
5.5 余弦相似度
两个向量 v⃗₁, v⃗₂ 的余弦相似度:
cos(θ) = (v⃗₁ · v⃗₂) / (|v⃗₁| × |v⃗₂|)
取值范围:[-1, 1]
· 1 = 完全同向(语义相同)
· 0 = 正交(语义无关)
· -1 = 反向(语义相反)
工程上通常归一化到 [0, 1]:(cos + 1) / 2
六、LLM-as-Judge 工程化
6.1 LLM 当裁判的 5 种姿势
| 姿势 | 原理 | 代表 |
|---|---|---|
| 直接打分 | “给这个答案 1-10 分” | 朴素 LLM-as-Judge |
| 二元判断 | “这个文档相关吗?是/否” | NLI 风格 |
| CoT 推理 | “先思考再打分” | GEval、TruLens |
| 反向生成 | “根据答案反推问题” | RAGAS Answer Relevancy |
| Pairwise 对比 | “答案 A 和 B 哪个更好?” | LlamaIndex PairwiseComparisonEvaluator |
6.2 LLM 裁判的 5 大偏见
| 问题 | 现象 | 解决方案 |
|---|---|---|
| 位置偏见 | Pairwise 时偏好第一个 | 随机交换位置,求平均 |
| 冗长偏见 | 偏好长答案 | 提示词强调"长度不重要" |
| 格式不稳定 | 输出不是 JSON | 用 function calling / JSON mode |
| 裁判能力不足 | gpt-3.5 评 gpt-4,分数虚高 | 评估器 LLM 比生成器更强 |
| 方差大 | 同一输入多次评分不一致 | 多次采样取平均 |
6.3 ⚠️ 评估器 LLM 的铁律
铁律:评估器 LLM 应该 ≥ 生成器 LLM
生成用 qwen-turbo → 评估用 qwen-plus / qwen-max
生成用 gpt-3.5 → 评估用 gpt-4 / gpt-4o
生成用 7B 开源 → 评估用 70B 开源 或 GPT-4
反模式:
· 评估和生成同模型(裁判不客观)
· 评估用弱模型(评不出细微差异)
· 评估用太强模型(成本爆炸,但收益递减)
七、Answer Relevancy 在短答案上失效(深度避坑)
⚠️ 这是工程中最容易踩的坑——RAGAS Answer Relevancy 的算法软肋。
7.1 失效原理
Answer Relevancy 的隐含假设:答案里包含足够多的"语义信号",让 LLM 能反推出问题。
长答案(正常工作):
Q: "孙悟空武器?"
A: "孙悟空使用金箍棒,重 13500 斤,能大能小。"
LLM 反推: ["孙悟空武器是什么?", "金箍棒多重?", ...]
→ 都和原问题高度相关 ✅
短答案(是/否)失效:
Q: "公司支持退款吗?"
A: "是"
LLM 反推: ???
→ 没有动词/名词/上下文线索 → 只能"猜"问题 ❌
Embedding 相似度计算:
embed("公司支持退款吗?") vs embed("X 是否成立?")
→ 相似度可能很低(虽然语义对,但词汇不同)
→ Answer Relevancy 给极低分(误判"答非所问")
7.2 会失效的答案类型
| 答案类型 | 例子 | 失效程度 |
|---|---|---|
| 纯是/否 | “是” / “否” / “yes” / “no” | 🔴 严重失效 |
| 极短数字 | “3” / “999” | 🔴 严重失效 |
| 单词答案 | “孙悟空” / “北京” | 🟡 中度失效 |
| 多选答案 | “A 和 B” | 🟡 中度失效 |
| 短列表 | “苹果、香蕉、橘子” | 🟢 轻微 |
| 完整句子 | “孙悟空使用金箍棒…” | ✅ 正常工作 |
7.3 4 种解决方案
方案 1:换算法(推荐)—— 用直接 LLM 判断
# DeepEval 的 AnswerRelevancyMetric 不走反向问题生成
from deepeval.metrics import AnswerRelevancyMetric
from deepeval.test_case import LLMTestCase
test_case = LLMTestCase(
input="公司支持 7 天无理由退款吗?",
actual_output="是", # ✅ 短答案也能正确评估
)
metric = AnswerRelevancyMetric(threshold=0.7)
metric.measure(test_case)
# LLM 直接判断"是"回答了"是否"问题,分数正常
方案 2:用 Answer Correctness(需要 ground_truth)
from ragas.metrics import AnswerCorrectness
data = {
"question": ["公司支持 7 天无理由退款吗?"],
"answer": ["是"],
"ground_truth": ["是,公司支持 7 天无理由退款。"],
"contexts": [["公司政策: 支持 7 天无理由退款..."]],
}
# AnswerCorrectness 通过 LLM 拆解 + 实体匹配判断
# 不受答案长度影响
方案 3:用 TruLens 的 relevance(不走反向问题生成)
from trulens.core import Feedback, Select
from trulens.providers.openai import OpenAI
provider = OpenAI()
f_relevance = Feedback(
provider.relevance_with_cot_reasons,
name="Relevance"
).on_input().on_output()
方案 4:组合策略(工业界最常用)
# 不依赖单一指标,组合多个指标交叉验证
metrics = [
Faithfulness(llm=llm),
AnswerRelevancy(llm=llm, embeddings=emb), # 长答案适用
AnswerCorrectness(llm=llm, embeddings=emb), # 需要 ground_truth
ContextRelevancy(llm=llm),
]
# 决策逻辑:
# · Faithfulness 高 + Answer Relevancy 低 + 答案短
# → 可能是"是/否"型,Answer Relevancy 失效,看 Correctness
7.4 业务场景的影响
客服 RAG 系统的常见问题分布:
30% ── 是否类问题("能不能"、"有没有"、"是否") ← Answer Relevancy 失效区
25% ── 列举类问题("有哪些"、"分别是什么")
20% ── 步骤类问题("怎么操作"、"如何退款")
15% ── 数字类问题("几天"、"多少钱"、"几个")
10% ── 实体类问题("谁能"、"哪个部门")
30% 的"是否"类问题——客服场景里 Answer Relevancy 对 1/3 的问题不可靠。
| 业务场景 | Answer Relevancy 适用性 |
|---|---|
| 客服 RAG(大量是否问题) | 🔴 不推荐单独用 |
| 法律咨询(长答案解释) | ✅ 适用 |
| 医疗问答(症状描述) | ✅ 适用 |
| API 文档查询(短答案多) | 🔴 不推荐 |
| 产品比较(优缺点列表) | 🟡 中等 |
7.5 一句话避坑
不要单独依赖 Answer Relevancy 做 go/no-go 决策,尤其是客服、API 文档等短答案场景。组合使用 Faithfulness + Correctness 交叉验证才是工程正解。
八、ground_truth 详解:评估里最贵的东西
8.1 ground_truth 是什么?
ground = 地面、底座、基础
truth = 真相、事实
─────────────────────
ground truth = 地面真相 → "基准事实" / "标准答案" / "金标准"
词源故事(帮助记忆):来自遥感 / 测绘领域。1970s 卫星遥感时,卫星从太空拍地球推测"这块地是森林",但卫星推测可能错。怎么验证?派人实地去看 → “走到 ground(地面)上看 truth(真相)” → ground truth = 实地核实的真值。后来 AI 圈沿用。
8.2 在 RAG 评估数据中的位置
# 一个完整的 RAG 评估数据点
{
"question": "孙悟空的武器是什么?", # 用户问题
"answer": "孙悟空使用金箍棒,重 13500 斤。", # RAG 系统生成的答案
"contexts": ["金箍棒是孙悟空的武器..."], # 检索到的文档
"ground_truth": "孙悟空的武器是金箍棒。" # ← 人工写的"标准答案"
}
ground_truth 就是业务专家针对这个问题,手工写出的"理想答案"——所有评估"对错"的指标都拿它当参照物。
8.3 不同指标对 ground_truth 的依赖
| 指标 | 评估什么 | 需要 ground_truth? |
|---|---|---|
| Faithfulness | 答案 vs 上下文 | ❌ 不需要 |
| Answer Relevancy | 答案 vs 问题 | ❌ 不需要 |
| Context Precision | 上下文 vsground_truth | ✅需要 |
| Context Recall | 上下文 vsground_truth | ✅需要 |
| Answer Correctness | 答案 vsground_truth | ✅需要 |
关键洞察:所有"判断对错"的指标都需要 ground_truth。没有它,只能判断"自洽性",判断不了"事实正确性"。
8.4 标注成本困境
准备 100 条评估数据集的成本:
方案 A:用 LLM 自动生成
· 时间:5 分钟 / 成本:~$1
· 质量:参差不齐(问题太简单/重复)
方案 B:用 DatasetGenerator(LlamaIndex)
· 时间:30 分钟 / 成本:~$5
· 质量:中等(LLM 生成 + 人工筛)
方案 C:业务专家手工标注
· 时间:5-10 小时 / 成本:~$200-500
· 质量:高(业务知识 + 准确答案)
💡 4 个脚本看起来只评估生成阶段的根本原因:标注成本太高,脚本作者做了取舍,不是框架本身局限。
九、生产组合策略:4 套 Recipe
⚠️ 重要原则:评估方案应该由项目本身的规模和特性决定,而不是由团队大小或预算决定。
9.1 选型的 5 个核心维度
- 知识库规模:XS(<1k 文档)→ XL(>100 万)
- 查询量 QPS:极低(<100/天)→ 极高(>100k/天)
- 业务关键性(最重要 ⭐):L1 Demo / L2 内部工具 / L3 C 端产品 / L4 高风险(医疗法律金融)
- 合规要求:公开 / 内部 / 敏感 / 极敏感(强制私有)
- 数据复杂度:纯文本 / PDF / 扫描件 / 跨语言
9.2 Recipe A:小型项目(XS-S 知识库 + L1-L2 业务)
项目特征:
· 知识库: XS-S(< 1万文档)
· QPS: 极低-低(< 1k/天)
· 业务关键性: L1-L2(demo 或内部工具)
典型场景: 个人项目、PoC、技术验证、部门小工具、产品 FAQ
评估方案:
· 工具栈: RAGAS(离线评估)
· 测试集: 50-100 条人工标注
· 主要指标: Faithfulness + Answer Relevancy
· 频次: 每周 1 次完整评估
· 评估 LLM: qwen-plus 或 gpt-4o-mini
9.3 Recipe B:中型项目(M 知识库 + L3 业务)⭐ 最常见
项目特征:
· 知识库: M(1万-10万文档)
· QPS: 中(1k-10k/天)
· 业务关键性: L3(C 端产品,错答影响用户体验)
典型场景: 客服系统、产品助手、企业内部搜索、SaaS AI 功能
评估方案(4 工具协作):
· 开发期: LlamaIndex Eval 做 A/B(chunk_size、splitter 调优)
· 离线评估: RAGAS 完整 4 指标(含 Context Precision/Recall)
· CI/CD: DeepEval 集成 pytest,PR 阻断
· 生产监控: TruLens 实时追踪 + Streamlit 看板
· 测试集: 500+ 条人工标注
· 评估 LLM: qwen-max 或 gpt-4o
9.4 Recipe C:高风险项目(L4 业务,强制合规)
项目特征:
· 知识库: L-XL(> 10万文档)
· 业务关键性: L4(医疗/法律/金融,错答有法律责任)
· 合规: 敏感/极敏感 → 强制私有部署
典型场景: 医疗诊断辅助、法律咨询、金融分析、政务问答
评估方案(全栈 + 合规闭环):
· 工具栈: RAGAS + DeepEval + TruLens + LlamaIndex Eval
· 数据集: 1000+ 条业务专家标注
· 业务定制指标: GEval / AspectCrit(如"建议安全性"、"免责声明")
· 双轨评估: LLM 评估 + 人工抽样复核(每月 5-10%)
· 合规审计: 每月生成评估报告,可追溯
· 在线 A/B: 持续对比模型版本(影子流量)
· 业务专家闭环: 错答案例 → 标注 → 反哺训练
9.5 Recipe D:超大规模项目(XL 知识库 + 极高 QPS)
项目特征:
· 知识库: XL(> 100万文档)
· QPS: 极高(> 100k/天)
· 复杂度: 极复杂(多模态、跨语言)
典型场景: 搜索引擎、行业垂直搜索(法律案例库)、跨企业联合知识库
评估方案(自动化管道):
· 工具栈: 全栈 + 自动化编排(Airflow / Kubeflow)
· 在线 A/B + 影子流量(shadow traffic)
· 实时指标监控 + 异常告警(Prometheus + Grafana)
· 业务闭环: 用户反馈 → 隐式标注 → 模型迭代
· 分布式评估(多机并发,Ray / Spark)
· 持续学习:每周模型微调
9.6 反模式警告
❌ 反模式 1: 大团队做 demo 项目,硬上 Recipe C
问题: 浪费资源,demo 不需要复杂评估
❌ 反模式 2: 小团队做医疗 RAG,用 Recipe A
问题: 合规风险,错答可能导致法律责任
❌ 反模式 3: 用预算倒推方案
问题: 预算不够时砍评估,等于裸奔上线
✅ 正确: 先看业务关键性 → 再看项目规模 → 推导需要的工具/团队/预算
十、10 大常见坑与避坑
10.1 评估器和生成器同模型
# ❌ 反模式:自己评自己
gen_llm = ChatOpenAI(model="gpt-3.5")
eval_llm = ChatOpenAI(model="gpt-3.5") # 同模型评估
# 问题:分数虚高,看不出问题
# ✅ 正确:评估器更强
gen_llm = ChatOpenAI(model="gpt-3.5")
eval_llm = ChatOpenAI(model="gpt-4") # 至少强一档
10.2 RAGAS 字段名搞错
# ❌ 错:用 input/output 而不是 question/answer
data = {"input": [...], "output": [...], "ground_truth": [...]}
# ✅ 对:用 RAGAS 约定的字段名
data = {
"question": [...],
"answer": [...],
"contexts": [[...]],
"ground_truth": [...],
}
10.3 contexts 字段类型错
# ❌ 错:contexts 是字符串列表
data = {"contexts": ["doc1", "doc2"]} # RAGAS 报错
# ✅ 对:contexts 是 List[List[str]]
data = {"contexts": [["doc1", "doc2"]]} # 外层是问题维度
10.4 TruLens 漏贴 @instrument
class RAG:
def retrieve(self, query): # ❌ 漏贴 @instrument
...
@instrument
def query(self, query):
ctx = self.retrieve(query) # retrieve 调用不被记录
# → Feedback 的 selector 找不到数据
# ✅ 每个方法都要贴
class RAG:
@instrument
def retrieve(self, query): ...
10.5 DeepEval 不设阈值
# ❌ 默认 threshold=0,永远 successful=True
metric = AnswerRelevancyMetric()
# ✅ 显式设阈值
metric = AnswerRelevancyMetric(threshold=0.7)
10.6 LlamaIndex 分数范围混淆
# ❌ 直接比较不同范围
if faithfulness > semantic_similarity: # 1-5 vs 0-1
# 永远成立,无意义
# ✅ 归一化后再比
faithfulness_norm = (faithfulness - 1) / 4 # 1-5 → 0-1
10.7 异步事件循环嵌套
# ❌ Jupyter 里直接 asyncio.run
asyncio.run(main()) # RuntimeError
# ✅ 加 nest_asyncio
import nest_asyncio
nest_asyncio.apply()
asyncio.run(main())
10.8 LLM 输出格式不稳定
# ❌ 依赖 LLM 输出 JSON,偶尔失败
prompt = "请输出 JSON: {score: 0-1, reason: ...}"
# ✅ 用 function calling / structured output
llm = ChatOpenAI(model="gpt-4o-mini")
structured_llm = llm.with_structured_output(EvalResult)
10.9 评估数据集泄露到 prompt
# ❌ 把 ground_truth 塞进 RAG 的 prompt(作弊)
prompt = f"问题: {q}\n参考答案: {gt}\n请基于参考答案回答"
# → Faithfulness 必然满分(作弊)
# ✅ RAG 系统不应该看到 ground_truth
prompt = f"问题: {q}\n上下文: {contexts}\n请回答"
# ground_truth 只用于评估阶段
10.10 Answer Relevancy 在短答案失效
(详见第七章)—— 客服、API 文档等短答案场景不要单独依赖 Answer Relevancy。
十一、10 个面试高频题
Q1:为什么需要 RAG 评估?不能直接看 demo 吗?
答:
- Demo 是 cherry-picking(挑好看的),不具代表性
- 改动效果需要量化对比,不能凭感觉
- 线上失败案例需要追溯根因
- 不同模型/prompt 的对比需要统一指标
- CI/CD 自动化必须有可断言的指标
Q2:Faithfulness 和 Answer Relevancy 有什么区别?
答:
- Faithfulness:答案 vs 上下文——答案有没有瞎编
- Answer Relevancy:答案 vs 问题——答案有没有跑题
举例:问"孙悟空武器?“,答"猪八戒用钉耙”
- Faithfulness 高(如果上下文有猪八戒)
- Answer Relevancy 低(答非所问)
Q3:RAGAS、TruLens、DeepEval、LlamaIndex Eval 怎么选?
答:
- RAGAS:离线评估首选,模型选型 / A/B 测试
- TruLens:生产监控首选,实时追踪每次调用
- DeepEval:CI/CD 首选,pytest 风格可断言
- LlamaIndex Eval:LlamaIndex 项目内做配置调优
理想方案:组合使用——开发期 LlamaIndex Eval、离线 RAGAS、CI 用 DeepEval、生产用 TruLens。
Q4:LLM-as-Judge 有什么问题?怎么解决?
答:5 大偏见:
- 位置偏见:Pairwise 时偏好第一个 → 随机交换位置
- 冗长偏见:偏好长答案 → 提示词强调长度不重要
- 格式不稳定:JSON 偶尔出错 → 用 function calling
- 裁判能力不足:弱模型评强模型 → 评估器 ≥ 生成器
- 方差大:同输入多次评分不一致 → 多次采样取平均
Q5:为什么 Answer Relevancy 要反向生成问题?
答:直接对比问题和答案的 embedding 不靠谱——短问题 vs 长答案的向量分布天然不同,相似度总是偏低。
反向生成把答案翻译成问题,统一到同一语义空间比较;同时生成 N 个反向问题求平均,降低单次 LLM 输出的方差。
Q6:Context Precision 和 Context Recall 的区别?
答:
- Context Precision:检索到的文档排序好不好(相关文档排第几)
- Context Recall:检索到的文档全不全(关键信息有没有召回)
举例:库里有 10 篇相关文档
- 检索 5 篇,3 篇相关排在前 3 → Precision 高,Recall 低(漏 7 篇)
- 检索 20 篇,10 篇相关排在后 10 → Precision 低,Recall 高(都召回)
Q7:评估 100 条数据大概花多少钱?
答:
- RAGAS + gpt-4o-mini:~$1-3
- RAGAS + gpt-4:~$30-100
- DeepEval + gpt-4o-mini:~$0.5-2
- TruLens + gpt-4(实时):每千次请求 ~$5-15
- LlamaIndex Eval + qwen-plus:~¥10-30
省钱策略:分层评估(粗筛用便宜模型)、缓存评估结果、增量评估。
Q8:什么是评估器 LLM 的"铁律"?
答:评估器 LLM 应该 ≥ 生成器 LLM。
- 生成用 gpt-3.5 → 评估用 gpt-4
- 生成用 qwen-plus → 评估用 qwen-max
- 生成用 7B 开源 → 评估用 GPT-4 或 70B
原因:弱模型评强模型,无法识别细微差异,分数虚高且方差大。
Q9:DeepEval 怎么集成到 CI/CD?
答:
- 写 pytest 文件:用
LLMTestCase+assert_test - 加阈值:
metric = XxxMetric(threshold=0.7) - 跑 pytest:
pytest tests/eval/ - CI 配置:GitHub Actions 加 pytest 步骤
- PR 阻断:分数 < 阈值则 fail,自动阻止合并
- (可选) 上传 Confident AI 看可视化
Q10:ground_truth 是什么?为什么重要?
答:ground_truth = 业务专家手写的"标准答案",是评估"对错"的参照物。
没有 ground_truth:只能评"答案自洽性"(Faithfulness / Answer Relevancy)
有 ground_truth:能评"答案正确性"(Correctness / Context Recall)
关键洞察:所有"判断对错"的指标都需要 ground_truth。它标注成本最高、最难获得,但价值最大。
十二、总结
回到开头的核心问题,本文给出了完整解法:
| 痛点 | 解决方案 |
|---|---|
| 改动是否引入回归? | 量化对比(RAGAS / DeepEval) |
| 不同模型哪个更好? | 多维度打分(4 大指标) |
| 线上 RAG 表现如何? | 实时追踪(TruLens) |
| prompt 改了影响多大? | A/B 对比(LlamaIndex Eval) |
核心心智模型
RAG 系统质量 = 检索质量 × 生成质量 × 业务定制
检索质量 = α₁·Precision + α₂·Recall
生成质量 = β₁·Faithfulness + β₂·Relevancy + β₃·Correctness
业务定制 = γ₁·Safety + γ₂·Politeness + ...
权重 α, β, γ 由业务决定(客服 vs 医疗 vs 法律差异巨大)。
最重要的认知
评估不是 RAG 的"附加品",而是 RAG 工程化的基石。没有评估的 RAG 是玄学,有评估的 RAG 才是工程。
必读论文
- RAGAS: Automated Evaluation of RAG: arxiv.org/abs/2309.15217
- GEval: NLG Evaluation using GPT-4 with CoT: arxiv.org/abs/2303.16634
- Self-RAG: arxiv.org/abs/2310.11511
- CRAG: arxiv.org/abs/2401.15884
官方文档
| 资源 | 链接 |
|---|---|
| RAGAS | https://docs.ragas.io |
| TruLens | https://www.trulens.org/ |
| DeepEval | https://docs.confident-ai.com/ |
| LlamaIndex Evaluation | https://docs.llamaindex.ai/en/stable/module_guides/evaluating/ |
写在最后:RAG 评估是工程化的"最后一公里"——没有它,你的所有改动都是赌运气;有了它,每一次优化都能被验证。希望这篇笔记能帮你建立完整的评估体系。
如果觉得有用,点赞👍收藏⭐关注三连支持一下,这是我持续分享的动力。
📌 标签建议:RAG LLM RAGAS TruLens DeepEval LlamaIndex 大模型评估 LLM-as-Judge 人工智能 Python
📢 下一篇预告:《从 0 到 1 搭建生产级 RAG:成本、延迟、可靠性的三角权衡》——敬请关注。
更多推荐


所有评论(0)