想象你是一家公司的市场部员工,老板让你“整理一份关于竞争对手的报告”。你花了一上午查资料,终于找出一摞资料,通宵写了一份报告交上去。 老板看完皱眉头:“这份报告写得挺好,引用了很多内容,但我要的竞品价格对比呢?你怎么写成了竞品公司发展史?” 这个时候,你其实面临了三个问题:你查到的资料到底准不准?报告内容有没有歪曲资料的原意?报告到底有没有回答老板的问题? 这三个问题,恰恰就是 RAG(检索增强生成)系统评估时需要回答的核心三问。 当一个 AI 助手被投喂了大量企业文档、产品手册或知识库时,它内部也经历着同样的流程:先从庞大的资料库中“查资料”(检索),再根据查到的资料“写报告”(生成)。RAG 评估,就是要拆开这个黑盒子,判断到底是“资料没查对”还是“报告写跑偏”了。今天我们就围绕上下文相关性(查得准不准)、忠实度(引用老不老实)、答案相关性(回答好不好)这三个核心要素,像质检员一样逐一拆解。

岗位关联

掌握 RAG 三要素评估,你就能像医生分诊一样快速定位 RAG 系统是“检索环节生病”还是“生成环节生病”,还能给出对症的调优方向。这是每个做 RAG 落地的算法工程师最值钱的核心能力之一。

目录
  1. 可视化演示
  2. 三要素总览
  3. 上下文相关性
  4. 忠实度
  5. 答案相关性
  6. 评估实施
  7. 问题定位
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

三要素总览

还记得开头那个写报告的比喻吗?你的那次失败经历,其实经历了三个独立环节:查资料(从资料堆里挑出相关的文档)、写报告(基于挑出的资料进行归纳总结)、答问题(确保最终内容回应老板的真实需求)。任何一个环节掉链子,老板都会不满意。

RAG 系统完整跑一次问答,也恰好走这三步:检索器先从知识库中捞出若干文档片段(上下文),生成器(大语言模型)根据这些片段撰写回答。RAG 评估的三大核心要素,就是分别给这三步打分——上下文相关性(Contextual Relevance)考检索、忠实度(Faithfulness)考生成、答案相关性(Answer Relevance)考最终问答契合度。

为什么要拆成三个指标而不是只看最终答案好不好?因为三个环节的故障原因完全不同,修法也完全不同。如果最终答案很差,可能是资料没查对(检索词有问题、embedding 模型不匹配),也可能是资料查对了但模型没用好(Prompt 指令不清、生成参数不当),还可能是模型完全答非所问(系统指令理解偏了)。只盯着最终答案,就像老板只丢给你一句“报告不行”,你根本不知道是查资料的问题还是写报告的问题。

三要素就像汽车仪表盘上的三个仪表——油量、水温、速度,分开看各有意义,组合起来才能判断车况。油量低了去加油,水温高了查水箱,速度上不去查发动机。下一节,我们先看第一个仪表盘:上下文相关性。

RAG质量=f(上下文相关性,忠实度,答案相关性)\text{RAG质量} = f(\text{上下文相关性}, \text{忠实度}, \text{答案相关性})
RAG 系统的整体质量可以看作三要素的函数。类似于一个产品的最终用户体验 = 原材料质量 × 加工质量 × 需求匹配度,任何一项拉胯,整体体验都会崩。
  1. RAG 质量代表 RAG 系统整体表现的综合指标。
    RAG质量\text{RAG质量}
  2. f表示某种组合函数,实际使用中可以是加权求和或多个指标的乘积。
    f(⋅)f(\cdot)
  3. 三个自变量分别对应检索、生成、问答三个环节的独立度量。
    上下文相关性,忠实度,答案相关性\text{上下文相关性}, \text{忠实度}, \text{答案相关性}

上下文相关性

你拿着老板的问题“竞品价格对比”去资料库查资料,结果检索员给你抱来一摞“竞品发展史”“公司背景介绍”的文档。你哭笑不得——资料是查了,但没查对。这就是上下文相关性要度量的事:检索出来的资料片段和用户问题之间到底有多相关。

在 RAG 技术语境中,上下文相关性评估的对象是检索器输出的上下文片段。打分方式通常是:把用户问题和每个检索到的文档片段分别交给一个“评分裁判”(通常是 LLM 或专门的打分模型),让裁判对每个片段的有用程度打分。分数高意味着“这段资料直接帮助回答了用户问题”,分数低意味着“这段资料像是凑数的”。

打个形象的比方:上下文相关性评分就是对每份被检索出来的资料盖一个“印章”——「直接有用」「间接有用」「完全无关」。RAGAS 框架的做法是让 LLM 逐段输出一个二值或分级判断,最后算出一个加权比例。如果十段检索结果里只有三段是直接有用的,这个环节的得分就高不了。

你给这些打上了“相关/不相关”的印章之后,一眼就能看出检索员的水平。如果印章大多是“不相关”,那问题大概率出在检索环节——可能是检索词切分不合理,可能是 embedding 模型和你的领域不匹配,也可能是知识库本身就有大量噪音。此时应该去优化检索链路:换 embedding 模型、调 chunk 大小、加 Reranker。而不要去动生成环节——就像资料压根没查对,再怎么会写的报告员也写不出老板要的东西。

Contextual Relevance=∑i=1N1相关(di)N\text{Contextual Relevance} = \frac{\sum_{i=1}^{N} \mathbb{1}_{\text{相关}}(d_i)}{N}
其中 N 是检索返回的片段总数,1相关(d_i) 是指示函数——当第 i 个片段与问题相关时取 1,否则取 0。得分就是“有用片段占比”。
  1. 片段集合检索器返回的 N 个文档片段组成待评估集合。
    d1,d2,…,dNd_1, d_2, \ldots, d_N
  2. 指示函数对每个片段逐个判断是否与问题相关,相关为 1,不相关为 0。
    1相关(di)\mathbb{1}_{\text{相关}}(d_i)
  3. 求和取平均统计相关片段总数,除以总片段数得到一个比例值。
    ∑i=1N1相关(di)N\frac{\sum_{i=1}^{N} \mathbb{1}_{\text{相关}}(d_i)}{N}

忠实度

假设这次检索员表现不错,抱回来的资料都对路。你开始翻着资料写报告。结果报告里有句话:“竞争对手 A 公司的产品价格比 B 公司低 30%”,你翻遍所有资料,发现里面只写了“A 公司近期降价”,压根没有"30%"这个数字——这句是你自己脑补出来的。这就是忠实度要管的事:生成的内容是否严格忠于检索到的上下文,有没有编造上下文里不存在的信息。

忠实度评估的核心思路是声明级拆解,也叫“自下而上”的验证。具体是这样做的:先把模型生成的回答拆成若干个独立的声明(Claim),再把每个声明拿去和检索到的上下文对照,判断它是「被上下文支持」还是「与上下文矛盾」还是「上下文没提过」。最后算一下:

用写报告的比喻来理解:忠实度评估就像“查重+求证”。你写完报告后,逐句核对每句话在资料里有没有依据——有依据的划勾(支持),和资料矛盾的划叉(矛盾),资料里没有的标注“存疑”(幻觉)。忠实度得分 = 有依据的句子数 ÷ 总句子数。RAGAS 框架实现这一指标时,通常用 LLM 先拆解声明,再逐条判断“support“或”contradict”。

忠实度低是最危险的信号,因为它意味着模型在幻觉——一本正经地编造资料里不存在的内容。在金融、医疗、法律等对准确性要求极高的场景,幻觉是致命的。一旦发现忠实度低,修复方向在生成链路:调整 Prompt 要求“严格依据上下文回答、不确定时明确说不知道”,降低 temperature 参数,或者引入“引用溯源”机制——强制模型回答时标注参考来源,便于事后审计。就像给报告员立规矩:“每句话都要给我标出处,没出处的不能写。”

Faithfulness=被支持的声明数总声明数\text{Faithfulness} = \frac{\text{被支持的声明数}}{\text{总声明数}}
  1. 拆解声明把生成的回答拆成独立的、可验证的短句(每条含一个事实断言)。
    Answer→{c1,c2,…,cM}\text{Answer} \rightarrow \{c_1, c_2, \ldots, c_M\}
  2. 判定支持将每个声明与上下文对比,判定是否被证据支持。
    Support(cj,Context)∈{0,1}\text{Support}(c_j, \text{Context}) \in \{0, 1\}
  3. 计算比例被支持的声明数除以总声明数,得到忠实度得分。
    Faithfulness=∑j=1MSupport(cj,Context)M\text{Faithfulness} = \frac{\sum_{j=1}^{M} \text{Support}(c_j, \text{Context})}{M}

答案相关性

好了,资料查对了,报告也没编造。但你交上去的报告,老板看了一眼说:“我让你对比价格,你怎么写了 A 公司价格、B 公司价格,就是没说谁更便宜、便宜多少?信息都对,但没回答我的问题。”

最后一个要素——答案相关性——衡量的正是“最终回答和用户问题之间的契合程度”。不看内容是否忠于材料,只看有没有正面、完整地回答用户的问题。一个回答可能上下文相关性很高(资料都对)、忠实度很高(每句都有依据),但如果答非所问,答案相关性就会很低。

RAGAS 的答案是相关性评估有一个很机智的做法——反向提问法。思路是:让 LLM 看着最终答案,反推出“什么样的问题会得到这个答案”,然后把这个反推的问题和用户真实的问题做相似度对比。如果两者很接近,说明答案确实在对的轨道上;如果差得很远,说明跑题了。此外,还会评估完整度(是否覆盖了问题的所有子方面)和冗余度(是否夹杂了大量与问题无关的废话)。

答案相关性低,修复思路要分情况。如果是完整度不够——缺了价格对比、缺了结论——往往意味着 Prompt 没有明确告诉模型“必须覆盖哪些方面”,需要在指令中显式列出回答框架。如果是冗余度太高——夹带了大量无关信息——需要在 Prompt 中加入“只回答用户问的内容,不要扩展”的约束。从老板的视角看,答案相关性就是“这份报告到底有没有用”的终审。前面两步做得再好,这一步失败,用户依然会打差评。

Answer Relevance=sim(Questionuser,Questioninferred(Answer))\text{Answer Relevance} = \text{sim}(\text{Question}_{\text{user}}, \text{Question}_{\text{inferred}}(\text{Answer}))
模型根据生成的答案反推一个“可能的问题”,再计算这个反推问题与用户真实问题的语义相似度。相似度高,说明答案没有跑偏。
  1. 反推问题让 LLM 观察最终回答,生成一个“最可能问出这个回答”的问题。
    Questioninferred(Answer)\text{Question}_{\text{inferred}}(\text{Answer})
  2. 语义相似度计算反推问题与用户真实问题的向量相似度。
    sim(⋅,⋅)\text{sim}(\cdot, \cdot)
  3. 得分相似度越高,答案相关性越强。
    ↑sim⇒↑Answer Relevance\uparrow \text{sim} \Rightarrow \uparrow \text{Answer Relevance}

评估实施

搞清楚了三个指标各自管什么,下一个问题是:实际工作中这些分数怎么算出来、怎么落地? 目前业界主流的方法是借助 RAGAS 框架,用 LLM 当“裁判”给三个指标打分。

LLM 裁判的思路非常直白:把「用户问题、检索到的上下文、模型生成的回答」拼接成一段评估提示词,交给一个能力较强的 LLM(如 GPT-4 或 Qwen-Max),让裁判按照预设的评分标准分别输出三个维度的得分和理由。优点在于语义理解能力强,能捕捉微妙的“相关”与“忠实”;缺点是成本高且不稳定——同一个回答换个裁判模型可能分数就变了。

因此,在实际系统中,规则指标 + LLM 裁判 + 人工抽样通常是三管齐下。规则指标(如关键词命中率、重叠度、引用出处的可验证性)便宜且稳定,适合在开发阶段做快速回归测试;LLM 裁判适合在离线评估集上做精细化打分;人工抽样则用于兜底校准——定期抽样 100~200 条问答记录,由人工标注三要素得分,用来验证 LLM 裁判是否“判得准”。就像餐厅出品要过三道关:厨师自查(规则)、主管试菜(LLM)、老板随机抽查(人工)。

评估实施最需要警惕的是“裁判幻觉”——LLM 评估器自身也会出错。当检索到的上下文本身质量很差时,LLM 裁判可能“将错就错”地给出一个不合理的忠实度高分。因此在落地时,务必保留人工抽检这个环节,定期把 LLM 裁判的打分与人工标进行对齐分析。如果发现裁判打分与人工判断系统性偏差,就应该调整评估提示词或更换裁判模型。记住:评估系统本身也需要被评估。

最终得分=w1⋅LLM裁判分+w2⋅规则指标分+w3⋅人工抽检分\text{最终得分} = w_1 \cdot \text{LLM裁判分} + w_2 \cdot \text{规则指标分} + w_3 \cdot \text{人工抽检分}
实际实施中通常以 LLM 裁判分为主,规则指标做回归兜底,人工抽检做可信度校准。权重 w 可根据团队人力和成本灵活调节。
  1. LLM 裁判分用大模型按预设 rubric 打出的三要素分数。
    LLM裁判分\text{LLM裁判分}
  2. 规则指标分基于关键词、重叠度、引用校验等硬规则算出的分数。
    规则指标分\text{规则指标分}
  3. 加权融合三个分数按权重融合得到最终评估结果。
    w1+w2+w3=1w_1 + w_2 + w_3 = 1

问题定位

四个环节讲完了,最后要回答最初的问题:怎么用三要素定位 RAG 系统的故障环节? 这里有一个很实用的排查思路——把三要素的得分组合起来做诊断,就像医生把体温、血压、血常规放在一起看。

第一种模式:上下文相关性低 + 其余两项正常。 这说明检索环节出了问题。排查链路依次是:①检查数据预处理——chunk 切分是否合理(太小可能截断语义,太大可能引入噪音);②检查 embedding 模型是否与领域匹配(通用 embedding 处理法律文书可能效果差);③检查检索策略——top-k 是否设置过大(捞回太多噪音)、是否缺少重排序(Reranker);④检查用户查询是否被正确理解(是否需要 Query 改写模块)。修复动作集中在检索链路。

第二种模式:忠实度低(其他项可能正常也可能偏低)。 这说明生成环节的模型在“自由发挥”。排查方向:①Prompt 是否给了足够强的约束——明确要求“只依据给定上下文,不得自行补充”;②生成参数——temperature 是否过高(过高容易发散);③上下文是否过长导致模型“看不过来”——需要做上下文压缩或摘要;④模型能力是否不足——小参数量模型更容易幻觉,考虑换更强的模型或用 RAG 专用微调模型。

第三种模式:答案相关性低 + 前两项都正常。 这是最微妙的情况——系统确实查到了好资料、也忠实地引用了,但用户不满意。这通常意味着用户意图理解环节出了问题。排查方向:①是否缺少意图识别模块;②Prompt 是否没有明确要求“正面回答问题”;③是否需要多轮对话管理来澄清用户需求;④是否需要后处理环节(如答案摘要、格式规整)来提升契合度。

用诊断灯的思路,你可以在 RAG 系统上线后建立三层监控看板:每天跑一批测试集,分别统计三要素的得分趋势。哪一项下跌,就触发对应链路的告警和排查流程。就像开车时仪表盘上的故障灯——水温灯亮了去查冷却系统,油量灯亮了去加油,不要一见到车出问题就把发动机拆了。RAG 调优的哲学也是如此:先定位,再优化,三要素就是你最趁手的定位工具。

定位策略={上下文相关性低→检索链路忠实度低→生成链路答案相关性低 + 前两项正常→意图理解 / 交互链路\text{定位策略} =\begin{cases}\text{上下文相关性低} & \rightarrow \text{检索链路}\\\text{忠实度低} & \rightarrow \text{生成链路}\\\text{答案相关性低 + 前两项正常} & \rightarrow \text{意图理解 / 交互链路}\end{cases}
三要素像三盏诊断灯:哪盏亮了(低了),就重点排查对应的环节。前两项都亮、只有第三盏暗,问题通常藏在用户意图理解的“最后一公里”。
  1. 条件判断三要素得分构成诊断条件。
    条件分类\text{条件分类}
  2. 检索链路上下文相关性低时重点排查 embedding、chunk、检索策略。
    →检索链路\rightarrow \text{检索链路}
  3. 生成链路忠实度低时重点排查 Prompt 约束、生成参数、模型能力。
    →生成链路\rightarrow \text{生成链路}
  4. 交互链路答案相关性低且前两项正常时排查意图理解与交互设计。
    →意图理解 / 交互链路\rightarrow \text{意图理解 / 交互链路}

AI 应用场景

企业知识库问答系统上线前的评估

阶段:RAG 系统离线评估与调优

解决的问题:某保险公司要把数千份保险条款文档接入智能客服,上线前需要回答“检索得准不准、回答得真不真、用户满意不满意”。传统做法靠人工抽读几十条记录,效率和覆盖度都远远不够。用三要素评估框架,每天自动在千条测试集上跑三个指标,快速暴露短板。

具体案例:评估团队用 RAGAS 框架对 500 条真实用户问题打分,发现上下文相关性平均 0.82(不错)、忠实度平均 0.91(很好),但答案相关性只有 0.55。进一步分析发现,模型经常把“理赔流程”回答成“理赔材料清单”——不是不知道,是没理解用户要的是步骤而非材料。于是团队在 Prompt 中加入了“回答必须包含步骤顺序”的显式框架要求,答案相关性提升到 0.78。

RAG 系统线上监控与告警

阶段:线上质量监控

解决的问题:RAG 系统上线后,需要持续监控质量漂移。直接读用户反馈太滞后,日志里又不能直观看到“检索还是生成出了问题”。通过三要素指标做线上监控,将三个分数落入时序数据库,设定告警阈值。

具体案例:某电商导购助手在 “618 大促” 期间出现回答质量下滑。查看监控发现忠实度突然从 0.88 跌到 0.71,但上下文相关性保持稳定——说明检索没出问题,而是生成链路在某次模型版本更新后行为异常。团队快速回滚模型版本后指标恢复,整个排查过程不到一个小时。

知识库冷启动时的数据质量诊断

阶段:数据准备与预处理验证

解决的问题:新接入一批知识库文档时,不知道切分方式和索引策略是否合理。通过上下文相关性这一单项指标,可以在没有真实用户反馈的情况下快速评估检索质量。

具体案例:某法律咨询公司接入新法规库,首轮评估发现上下文相关性只有 0.4。逐段分析失分样本后发现,切分后的 chunk 经常把一个完整法条拦腰截断。于是将 chunk 切分策略从“固定 500 字符”改为“按法条边界切分”,上下文相关性提升到 0.75,后续忠实度和答案相关性也连带受益。

Python 演示

python88 行
# -*- coding: utf-8 -*-"""使用 LLM 作为裁判,对 RAG 回答进行三要素评估。本示例用简单的规则模拟 LLM 打分逻辑,展示评估流程骨架。"""import refrom collections import Counter  class RAGEvaluator:    """RAG 三要素评估器(模拟版)"""     def __init__(self):        # 记录每项得分        self.score_records = []     def evaluate_context_relevance(self, question, contexts):        """上下文相关性:上下文中有多少比例包含问题关键词"""        q_tokens = set(re.findall(r"[\u4e00-\u9fa5]+", question))        hit_count = 0        for ctx in contexts:            c_tokens = set(re.findall(r"[\u4e00-\u9fa5]+", ctx))            overlap = q_tokens & c_tokens            if len(overlap) / max(len(q_tokens), 1) > 0.5:                hit_count += 1        return hit_count / max(len(contexts), 1)     def evaluate_faithfulness(self, answer, contexts):        """忠实度:回答中的关键实体是否在上下文中出现过"""        answer_tokens = set(re.findall(r"[\u4e00-\u9fa5]{2,}", answer))        ctx_text = "".join(contexts)        ctx_tokens = set(re.findall(r"[\u4e00-\u9fa5]{2,}", ctx_text))        supported = 0        for token in answer_tokens:            if token in ctx_tokens:                supported += 1        return supported / max(len(answer_tokens), 1)     def evaluate_answer_relevance(self, question, answer):        """答案相关性:回答是否包含问题中的核心疑问词"""        q_words = set(re.findall(r"[\u4e00-\u9fa5]{2,}", question))        a_words = set(re.findall(r"[\u4e00-\u9fa5]{2,}", answer))        overlap = q_words & a_words        return len(overlap) / max(len(q_words), 1)     def evaluate(self, question, contexts, answer):        """执行完整评估流程"""        cr = self.evaluate_context_relevance(question, contexts)        fa = self.evaluate_faithfulness(answer, contexts)        ar = self.evaluate_answer_relevance(question, answer)        record = {            "context_relevance": round(cr, 3),            "faithfulness": round(fa, 3),            "answer_relevance": round(ar, 3)        }        self.score_records.append(record)        return record     def summary(self):        """汇总多条评估记录的平均分"""        if not self.score_records:            return {}        avg = Counter()        for rec in self.score_records:            avg.update(rec)        n = len(self.score_records)        return {k: round(v / n, 3) for k, v in avg.items()}  if __name__ == "__main__":    # 模拟一次 RAG 问答    question = "这款手机的价格是多少?"    contexts = [        "该品牌手机目前售价 3999 元。",        "该品牌手机拥有 5000 毫安大电池。",        "该品牌手机支持 5G 网络。"    ]    answer = "这款手机售价 3999 元,性价比很高。"     evaluator = RAGEvaluator()    scores = evaluator.evaluate(question, contexts, answer)    print("单条评估结果:", scores)     # 模拟多条记录,观察整体趋势    evaluator.evaluate("手机续航怎么样?",                       ["该手机电池容量为 5000 毫安。"],                       "续航很好")    print("整体汇总:", evaluator.summary())
目的:演示 RAG 三要素评估的完整骨架——从计算单个指标到汇总多条记录的平均得分,帮你理解评估框架的数据流。

常见误区

误区我之前评估 RAG 系统时只看用户满不满意、回答准不准。分数低就整个系统一起调,经常改了 Prompt 又去调 Embedding,忙活半天也不知道哪里起的作用。

正解就像汽车仪表盘坏了你只看车能不能开——能开不代表没问题,不能开也不知道问题在哪。三要素拆解的核心价值在于定位:上下文相关性低查检索链路,忠实度低查生成链路,答案相关性低查意图理解。不拆解就调优,等于蒙着眼睛修车。

为何常见:因为最终回答质量是用户直接感知的指标,而“拆开看”需要额外的工作量和工具支撑。很多团队早期资源紧张,就跳过了这一层诊断。

误区我觉得只要模型回答都是根据检索资料来的,没有编造,那这个回答质量就肯定没问题。忠实度高了不就代表一切正常吗?

正解忠实度高只代表“没有编造”,不代表“回答了该回答的问题”。就像一个学生抄书抄得一字不差,但抄错了段落,照样不得分。三要素各管一段:上下文相关性管资料质量,忠实度管引用真实性,答案相关性管需求匹配度——三者互补,缺一不可。

为何常见:因为“真实”和“正确”在直觉上容易被混淆。尤其在强调减少幻觉的背景下,大家容易把“没骗人”当成“答得好”。

误区我上线前已经跑过评估集,三个指标都挺高的,所以线上应该没问题。后来用户反馈很多答非所问的情况,但我的评估分数没有预警。

正解评估是一次性的静态体检,而线上数据分布会随时间漂移。三要素应该做成持续的监控指标,像血压计一样定期测量、设定阈值。当知识库更新、模型升级、用户问题分布变化时,分数都会波动,必须用监控系统捕捉这些变化。

为何常见:因为搭建离线评估 Pipeline 已经花了不少功夫,容易产生“做完就结束了”的心态,忽略了评估本身也需要持续运营。

误区我的 RAG 系统三个指标都 0.9 以上,是不是就说明系统质量无敌了?还要做什么人工评估吗?

正解三要素主要评估的是“相关性”和“忠实度”这类质量维度,但系统还有安全性、公平性、鲁棒性、推理能力等维度没有覆盖。RAG 评估应该是一个多维度的体系,三要素是核心但不是全部。另外 LLM 裁判本身也会误判,必须用人工抽检来校准裁判的可信度——就像温度计再准,也要定期用水银标准温度计校核。

为何常见:因为指标体系一旦建立起来,人很容易对数字产生“信仰”,忽略了每个指标都有它的评估盲区。

误区答案相关性得分低了,我第一反应就是这个大模型太笨了,换个更强的模型就好了。换完之后发现分还是上不去,很困惑。

正解答案相关性低可能有三类原因:①检索到的上下文确实包含了正确答案,但模型没有提炼出来(Prompt 指令不明确);②检索到的上下文本身就不完整,模型想答也答不好(此时要回溯上下文相关性);③用户问题本身有歧义,需要多轮澄清。所以答案相关性低不等于“模型笨”,必须先排除检索和意图理解的干扰,再落到模型能力上。

为何常见:因为生成模型是系统的“最终出口”,出了问题人们首先归咎于出口。就像餐厅菜不好吃,可能是食材差、厨师手艺差、也可能是点菜单写错了——不能一上来就换厨师。

面试题

Q1. RAG 评估中,上下文相关性(Contextual Relevance)主要衡量的是什么?

单选题 · mid

  • A.生成内容是否忠于检索到的资料
  • B.检索出来的资料与用户问题的匹配度← 正确答案
  • C.最终回答是否命中用户的真实需求
  • D.模型生成速度是否满足实时性

答案:B。上下文相关性对应的是“查资料”环节,衡量检索器返回的文档片段与用户问题的相关程度。A 是忠实度的职责,C 是答案相关性的职责,D 是性能指标,与三个核心质量要素无关。

Q2. 忠实度(Faithfulness)评估采用的核心策略是?

单选题 · mid

  • A.将回答与用户问题做关键词重叠度比较
  • B.反向提问法生成可能的问题再做相似度比对
  • C.把回答拆成声明逐条与上下文比对支持性← 正确答案
  • D.用 BLEU 分数与参考答案做字面匹配

答案:C。忠实度评估的核心是“声明级拆解”——把生成回答拆成独立的声明(Claim),再逐条判定是否被上下文支持。B 是答案相关性评估中的方法,A 和 D 是浅层文本匹配,无法捕捉“编造信息”这类语义问题。

Q3. 关于 RAG 三要素的定位诊断,以下说法正确的有?

多选题 · mid

  • A.上下文相关性低应优先排查检索链路← 正确答案
  • B.忠实度低应优先排查生成链路的提示词约束← 正确答案
  • C.答案相关性低且前两项正常应排查意图理解← 正确答案
  • D.忠实度低时应优先调整向量检索的 top-k 参数

答案:ABC。A 和 B 是对应环节的标准排查方向,C 是答案相关性低的典型定位。D 错误——忠实度衡量生成是否忠于上下文,与检索的 top-k 参数无关,那是上下文相关性环节的事情。

Q4. “上下文相关性和忠实度都高,但答案相关性低”这组组合通常意味着?

单选题 · easy

  • A.检索器返回了大量无关文档
  • B.模型在生成时大量编造内容
  • C.系统没有准确理解和响应用户需求← 正确答案
  • D.知识库数据本身存在严重噪音

答案:C。资料查得准(上下文相关性高)、引用也忠实(忠实度高),但用户不满意,说明问题在“最后一公里”——对用户意图的理解和响应不到位,属于交互链路或意图理解问题,而不是检索或生成链路。

Q5. RAGAS 框架中,答案相关性评估的“反向提问法”是指?

单选题 · easy

  • A.让模型先回答再反问用户以确认满意度
  • B.由模型根据答案反推可能的问题再与真实问题比对← 正确答案
  • C.将参考答案反向切分后与生成回答对齐
  • D.让评估模型回答一套反向设计的测试题

答案:B。反向提问法让评估 LLM 观察生成答案,反推“什么用户问题会导致这个答案”,然后计算反推问题与真实问题的语义相似度。相似度高说明答案没有跑题。A、C、D 描述的都是其他类型流程。

Q6. 在实际搭建 RAG 评估体系时,合理做法包括哪些?

多选题 · mid

  • A.使用 LLM 裁判对三要素批量打分← 正确答案
  • B.定期用人工抽样校准 LLM 裁判的可信度← 正确答案
  • C.只依赖 LLM 裁判打分,不需要人工干预
  • D.用规则指标做回归测试和快速兜底← 正确答案

答案:ABD。A 是主流的离线评估方式;B 是必要的校准环节——LLM 裁判本身可能有偏差;D 合理,规则指标便宜稳定,适合快速回归。C 错误,完全依赖 LLM 裁判而不做人工校准会导致评估结果失真。

Q7. 某团队在评估时发现,相关上下文确实包含所需信息,但答案相关性得分偏低。最可能的原因是?

单选题 · hard

  • A.检索的 top-k 参数设置过小
  • B.模型在回答时没有严格依据上下文生成
  • C.提示词未显式要求在回答中覆盖问题子方面← 正确答案
  • D.Embedding 模型与领域数据不匹配

答案:C。上下文包含所需信息说明检索没问题,此时答案相关性低通常是因为模型“没被指令引导去完整回答”。C 正确。A 和 D 影响的是上下文相关性环节;B 影响忠实度而不是答案相关性。

Q8. 三层质量把关的比喻中,“主管试菜”对应 RAG 评估的哪个环节?

单选题 · easy

  • A.规则指标自动检测
  • B.LLM 裁判离线打分← 正确答案
  • C.人工抽样校验兜底
  • D.用户在线反馈收集

答案:B。比喻中“厨师自查”对应规则指标快速自测,“主管试菜”对应 LLM 裁判综合评判,“老板抽查”对应人工抽样兜底校准。B 正确。A 对应的是更低成本的自动规则检测,C 对应人工抽样。

Q9. 关于忠实度指标的局限,以下分析正确的有哪些?

多选题 · hard

  • A.忠实度得分高不代表回答一定正确或有用← 正确答案
  • B.上下文本身信息有误时,忠实度高反而意味着“将错就错”← 正确答案
  • C.忠实度可以独立证明系统的可信赖性
  • D.声明级拆解的粒度会影响忠實度评估的可靠性← 正确答案

答案:ABD。A 正确——不编造不等于答得好。B 正确——忠实度只保证“忠于上下文”,不保证上下文本身真实,这需要结合上下文相关性甚至数据质量评估。C 错误——可信赖性是多维度的,忠实度只是其中一面。D 正确——声明的拆分粒度不一致,判别结果会有噪声。

Q10. 线上监控时发现三要素整体下滑,其中答案相关性下降幅度最大、忠实度下降中等、上下文相关性基本不变。最优先排查的方向是?

单选题 · extreme

  • A.知识库文档是否更新或删减导致检索变化
  • B.模型版本是否变更或生成参数是否被调整
  • C.embedding 模型是否被替换成新版本
  • D.测试集是否引入大量 OOD 新类型问题← 正确答案

答案:D。上下文相关性不变说明检索质量稳定,但答案相关性和忠实度同步下滑,说明“生成链路”或“测试集构成”发生了变化。模型版本变更会导致两项生成侧指标同步波动,这是最常见原因。A 和 C 主要影响检索侧(上下文相关性)。D 是评估集问题,虽然可能,但线上模型版本变更的概率更高、优先级应先排查。