agent面试必备25-RAG 核心技术进阶:RAG 评估体系
📏 RAG 核心技术进阶:RAG 评估体系(Evaluation)与面试通关指南
当你的 RAG(检索增强生成)系统终于跑通,能够回答用户问题时,老板或面试官往往会抛出一个灵魂拷问:“你觉得你的 RAG 系统准吗?准确率有多少?你怎么证明它变好了?”
很多初学者在这一步就卡壳了。因为大模型生成的是自然语言,没有绝对唯一的标准答案,传统的代码测试方法完全失效。
在真实的工业落地和高级别的 AI 面试中,“如何评估大模型与 RAG 系统” 是区分新手和资深工程师的分水岭。这篇博客将用大白话带你搞懂 RAG 评估的核心理论(RAG 三元组)、常用框架,并附带面试中极其加分的 LLM-as-a-Judge(大模型作为裁判)实战代码!
💡 一、 为什么传统的 NLP 评估指标不管用了?
在过去做自然语言处理(NLP)时,大家最爱用 BLEU 或者 ROUGE 这类指标。
- 它们的原理:算一下大模型生成的句子和人类写的标准答案之间,重合了几个词。
- 为什么在 RAG 中被淘汰了?
大模型太聪明了,同一个意思它能用一百种不同的句式表达出来。比如标准答案是“苹果很好吃”,模型回答“这颗红富士口感极佳”。意思完全对,但词汇重合度是 0,传统指标会给它打 0 分。
结论:在 RAG 评估中,基于字面重合度的指标已经被淘汰,我们必须转向“基于语义和逻辑”的评估!
📐 二、 业界黄金标准:RAG 三元组 (The RAG Triad)
目前业界公认最权威的 RAG 评估体系,是由 TruLens 和 Ragas 等知名开源框架提出的**“RAG 三元组”**。
在面试中,只要你能流畅地说出这三个指标,面试官就会认定你懂行:
1. 检索相关性 (Context Relevance)
- 评估哪一步:评估“检索(Retrieval)”环节。
- 大白话:你从向量数据库里捞出来的这些文档,和用户提的问题沾边吗?有没有混进来一堆无用的垃圾信息?
- 为什么重要:如果捞出来的资料本身就是错的或无关的,大模型再强也没救。
2. 忠实度 / 事实一致性 (Faithfulness / Groundedness)
- 评估哪一步:评估“生成(Generation)”环节。
- 大白话:大模型最终生成的回答,是不是老老实实基于检索出来的文档?它有没有夹带私货、凭空捏造(也就是我们常说的幻觉 Hallucination)?
- 为什么重要:这是企业应用 RAG 的核心目的——防幻觉。
3. 回答相关性 (Answer Relevance)
- 评估哪一步:评估“端到端(End-to-End)”的整体体验。
- 大白话:大模型最终的回答,有没有真正解答用户提出的问题?是不是答非所问?
- 为什么重要:即便检索的文档是对的,模型也没有胡编乱造,但如果用户问“如何请假”,模型回答“公司年假有 5 天”,这就是典型的答非所问。
⚖️ 三、 怎么打分?引入 LLM-as-a-Judge
既然不能用传统代码算重合词,那用什么来打分?
现在的标准做法是:用魔法打败魔法,让更聪明的大模型(比如 GPT-4o 或 Claude 3.5 Sonnet)来当裁判(LLM-as-a-Judge)!
具体怎么做?
我们给 GPT-4 写一段非常严密的 Prompt,把“用户问题”、“检索到的文档”和“待测 RAG 生成的答案”一起扔给 GPT-4,让 GPT-4 按照我们给定的评分标准(比如 1 到 5 分),一步步推理并打分。
- 常用评估框架:
- Ragas:目前最火的 RAG 评估开源库,与 LangChain 生态结合紧密。
- TruLens:提供了非常酷炫的 UI 看板,能直观看到 RAG 三元组的得分情况。
🎯 四、 高频面试 Q&A 实战演练
Q1:如何在一个没有标准答案(Ground Truth)的场景下评估 RAG 系统?
标准答案:
我们可以使用 无参考评估(Reference-free Evaluation),核心就是利用 LLM-as-a-Judge 评估 RAG 三元组。
虽然我们不知道完美答案是什么,但我们可以让 GPT-4 去判断:1. 检索的文档跟问题相不相关?2. 生成的答案在文档里找不找得到证据?3. 答案有没有回答最初的问题?这三个维度都不需要人工提前写好标准答案即可自动化运行。
Q2:使用大模型当裁判(LLM-as-a-Judge),会有什么风险或缺陷?如何缓解?
标准答案:
主要有三个风险:
- 位置偏见(Position Bias):大模型容易对放在 Prompt 最开头或最末尾的选项打高分。
- 冗长偏见(Verbosity Bias):大模型喜欢给字数多、长篇大论的答案打高分,哪怕里面有废话。
- 自身偏见(Self-enhancement Bias):大模型倾向于给自己生成的答案打高分。
缓解策略:在 Prompt 中明确要求模型“先输出打分理由(Chain of Thought),再输出最终得分”;交换选项顺序进行多次打分取平均;定期抽样少量的评估结果,交由人工进行一致性对齐(Human Alignment)。
Q3:如果你要上线一个 RAG 系统,你的测试集该怎么构建?
标准答案:
绝对不能只靠开发者自己拍脑袋想问题。我会构建一个分层的测试集:
- 基于文档逆向生成(Synthetic Data):利用 LLM 看着知识库文档,反向生成大量“问题-答案”对,作为基础回归测试集。
- 收集真实用户日志(User Logs):把灰度测试中用户真实问过的问题收集起来,重点关注那些被踩(Downvote)的 Query。
- 对抗性边界测试(Edge Cases):专门设计一些故意绕弯、文档里没写、或者包含恶意注入的提问,测试系统的拒答能力和鲁棒性。
💻 五、 面试加分代码:手写一个 LLM 裁判 (Faithfulness 评估)

在面试中,框架(如 Ragas)只是工具,面试官更想看你懂不懂底层逻辑。以下代码展示了如何手写一个 Prompt 让大模型充当裁判,评估 RAG 的“忠实度/是否产生幻觉”。
import json
def evaluate_faithfulness(user_query: str, retrieved_context: str, generated_answer: str, llm_client) -> dict:
"""
核心考点:手写 LLM-as-a-Judge 评估忠实度(Faithfulness)
目的:检查生成的答案是否完全基于检索到的文档,有没有胡编乱造。
"""
# 1. 设计极其严谨的裁判 Prompt
judge_prompt = f"""
你现在是一个严厉且客观的 RAG 系统评估专家。
你需要评估 [系统生成的答案] 是否忠实于 [检索到的上下文]。
规则:
1. 如果答案中的所有信息都能在上下文中找到确凿证据,请给 5 分。
2. 如果答案包含了上下文中根本没有提到的额外信息(幻觉),请给出 1-4 分,视严重程度而定。
3. 严禁使用你自身的先验知识来判断对错,你唯一的事实来源只能是 [检索到的上下文]。
[用户问题]: {user_query}
[检索到的上下文]: {retrieved_context}
[系统生成的答案]: {generated_answer}
请严格按照以下 JSON 格式输出你的评估结果,必须先写理由,再给分数:
{{
"reasoning": "你的推理过程,指出答案中哪句话在上下文中找不到依据...",
"score": 1到5的整数
}}
"""
# 2. 调用作为裁判的强大模型(通常必须用 GPT-4o 级别的高级模型来当裁判)
# 这里用伪代码代表调用大模型的过程,并要求返回 JSON 格式
response = llm_client.chat(
prompt=judge_prompt,
response_format={"type": "json_object"},
temperature=0.0 # 评分任务必须将温度设为 0,保证结果稳定无随机性
)
# 3. 解析结果
try:
evaluation = json.loads(response.text)
return evaluation
except Exception as e:
return {"reasoning": "解析裁判输出失败", "score": 0}
# ==========================================
# 面试讲解演示:
# ==========================================
# 假设上下文只说了:“年假为5天”。
# 可是我们的 RAG 系统不仅回答了“年假为5天”,还自己瞎编了一句“还可以申请3天病假”。
# 此时,这个评测函数里的 GPT-4 裁判就会精准地指出:
# {"reasoning": "上下文中仅提及了5天年假,完全没有提及病假信息,生成的答案包含了无中生有的幻觉。", "score": 2}
# 💡 面试讲解要点:
# 告诉面试官:“在企业自动化 CI/CD 流水线中,每当我们修改了 Chunking 策略或换了新的大模型,
# 都会在后台自动跑一遍这个 LLM Judge,如果发现平均忠实度得分下降了,这段代码就不能合并上线!
# 这就把玄学的提示词工程,变成了一门可以量化的软件工程。”
所有评论(0)