RAG 系统评估实践指南:检索、生成及系统的评估方式

1. 背景:为什么 RAG 系统评估重要

随着大语言模型在企业知识库、智能客服、法律咨询、医疗问答、代码助手等场景中的广泛应用,RAG 已经成为构建企业级 AI 应用的重要技术方案。

相比直接让大模型依赖自身参数回答问题,RAG 通过"检索外部知识 + 基于上下文生成答案"的方式,让模型能够利用企业内部文档、实时业务数据、政策法规、产品手册等外部知识,从而提升答案的准确性、时效性和可追溯性。

但是,RAG 系统并不是简单地把文档切成 chunk、存进向量数据库,再接一个大模型就能稳定工作的。

在真实生产环境中,一个 RAG 系统可能会遇到很多问题:

  • 正确文档没有被检索到;
  • 正确文档被检索到了,但排序靠后;
  • chunk 切分不合理,导致上下文不完整;
  • 检索结果中混入大量无关内容,干扰模型判断;
  • 答案看似合理,但并没有被检索内容支持;
  • 引用来源不准确;
  • 文档已经过期,导致答案不符合最新业务规则。

这些问题都会直接影响最终回答质量。

因此,RAG 评估的核心价值不只是判断"答案对不对",需要判断:

  • 系统是否找到了正确知识,是否正确使用了知识,是否生成了可信、可追溯的答案。

尤其是在法律、医疗、金融、政务等高风险场景中,一个错误答案可能带来严重后果。此时,单纯依赖人工抽查或问答准确率,已经无法满足生产级系统对稳定性、可解释性和可持续优化的要求。

2. 传统 RAG 评估方法及其问题

2.1 人工抽查

早期评估 RAG 系统时,最常见的方法是人工抽查。

开发者或业务人员准备一批问题,让 RAG 系统回答,然后人工判断答案是否可以接受。例如:

jsx 复制代码
问题:员工如何申请年假?

答案:员工需要在系统中提交年假申请,并经过直属主管审批。

人工判断:正确。

这种方法的优点是简单、直观,适合 demo 阶段或系统早期验证。但它的问题也很明显:

  • 评估成本高;
  • 主观性强;
  • 不同评估人员标准不一致;
  • 覆盖问题数量有限;
  • 很难持续回归测试;
  • 无法定位错误发生在哪个环节。

人工抽查可以告诉我们"这个答案看起来对不对",但很难告诉我们"为什么错、应该改哪里"。

同时,我们也采用人工审查的方式去查看引用是否正确,因为RAG会检索相关内容并结合内容进行回答,那么检索内容是否正确与否非常重要,但是人工校验引用内容是否正确依然存在上述介绍的问题。

2.2 问答准确率

另一种常见方法是构造一个问题集,然后统计系统答对了多少。例如:

总共 100 个问题,系统答对 78 个,那么准确率就是 78%。

这种方法比人工抽查更量化,但对于 RAG 系统来说仍然过于粗糙。

因为 RAG 系统不是一个单纯的问答模型,而是由检索、重排、上下文组装和生成多个环节组成。最终答案错误,可能并不是大模型生成能力不够,而是前面的检索阶段根本没有拿到正确上下文。例如,用户问:

"Skilled Worker visa 是否可以携带配偶?"

如果系统检索到的是 Student visa dependant 页面,而不是 Skilled Worker dependant 页面,那么最终答案即使写得再流畅,也很可能是错的。

所以,仅看最终准确率无法区分:

  • 是检索失败;
  • 还是排序失败;
  • 是上下文组装失败;
  • 还是生成阶段幻觉。

3. 现代 RAG 评估的核心思想:分层评估

在生产级 RAG 系统中,评估不应该只停留在"最终答案是否正确"这一层,而应该从完整链路出发,至少评估三个层面:检索层、生成层和系统层。

评估层级 核心问题 主要关注点
检索层评估 系统有没有找到正确资料? 召回率、排序质量、检索相关性
生成层评估 模型有没有基于资料正确回答? 正确性、忠实度、相关性、引用准确性
系统层评估 系统是否能稳定服务真实用户? 延迟、成本、稳定性、用户反馈、知识更新

3.1 检索层评估

检索层评估关注的是:系统是否找到了正确资料。

如果检索阶段没有召回正确文档,那么后续生成模型再强,也很难给出可靠答案。因此,检索层评估主要关注正确文档是否被召回、是否排在靠前位置,以及检索结果中是否混入大量无关内容。

常见指标包括 Recall@K、Hit Rate@K、Precision@K、MRR 和 NDCG。

指标 含义 主要作用 示例
Recall@K 前 K 个检索结果中,是否包含应被召回的相关文档 衡量系统有没有把正确资料找出来 Recall@5 = 0.8 表示前 5 个结果覆盖了 80% 的相关资料
MRR Mean Reciprocal Rank,平均倒数排名,关注第一个正确结果排在第几位 衡量正确结果是否排得足够靠前 第一个正确结果排第 1,得分 1;排第 5,得分 1/5
Precision@K 前 K 个结果中,有多少比例是真正相关的 衡量检索结果的"纯度",避免无关内容太多 前 5 个结果中有 4 个相关,Precision@5 = 0.8
Hit Rate@K 前 K 个结果中是否至少命中一个正确文档 判断系统是否"至少找到了一个可用证据" Hit Rate@5 = 1 表示前 5 个结果中至少有一个相关文档
NDCG Normalized Discounted Cumulative Gain,考虑相关性等级和排序位置的综合指标 衡量整体排序质量,适合多个相关文档的场景 高相关文档排在前面时,NDCG 更高
Context Recall 检索到的上下文是否覆盖回答问题所需的关键信息 判断最终上下文是否足够回答问题 标准答案需要 5 个要点,上下文覆盖 4 个,Context Recall = 0.8
Context Precision 检索到的上下文中有多少内容是真正有用的 判断上下文中噪声是否过多 传给模型的 10 个 chunk 中只有 6 个相关,Context Precision = 0.6

在实际 RAG 系统中,Recall@KMRR 通常最重要。

如果 Recall@K 很低,说明正确资料根本没有被找出来。这时应该优化

jsx 复制代码
文档入库
chunk 切分
embedding 模型
BM25 检索
混合检索
query rewrite
metadata filter

如果 Recall@K 不低,但 MRR 很低,说明正确资料虽然被召回了,但排得太靠后。这时应该重排,具体优化方案如下:

jsx 复制代码
reranker
RRF 融合排序
source 权重
时间新鲜度权重
标题和 metadata 加权

如果 Precision@K 很低,说明检索结果中混入了太多无关内容。这会导致模型被噪声干扰,生成错误答案。这时应该优化:

jsx 复制代码
相似度阈值过滤
metadata 过滤
去重策略
reranker
query intent 分类

检索层评估的核心结论是:

如果检索层失败,生成层基本没有机会稳定答对。

所以当 RAG 答案错误时,第一步不要急着改 prompt,而应该先检查检索结果。

3.2 生成层评估

生成层评估关注的是:模型是否基于检索到的资料生成了正确答案。

在 RAG 系统中,一个答案语言流畅,并不代表它可靠。真正重要的是:

jsx 复制代码
答案是否回答了用户问题?
答案是否忠实于检索上下文?
答案是否覆盖了关键条件和例外?
答案中的引用是否真的支持结论?
资料不足时,模型是否能够拒答?

常见指标包括

指标 含义 主要作用 示例
Faithfulness / Groundedness 答案是否忠实于检索上下文 判断模型是否基于资料回答,是否产生幻觉 上下文没有提到"自动获批",答案却写"自动获批"
Answer Correctness 答案结论是否正确 判断最终答案是否符合事实或标准答案 标准答案说"需要满足条件",模型回答"无条件允许",则不正确
Answer Relevance 答案是否真正回答了用户问题 判断答案是否跑题 用户问"能否携带配偶",模型却主要回答"签证费用"
Completeness 答案是否覆盖关键条件、限制和例外 判断答案是否完整 只回答"可以携带配偶",但漏掉"需要满足 dependant 条件"
Citation Accuracy 引用是否真的支持答案中的结论 判断引用是否准确、可追溯 答案说费用,引用却指向 eligibility 页面
Citation Coverage 关键结论是否都有引用 判断答案是否充分可溯源 答案有 3 个关键结论,但只有 1 个有引用
Refusal Accuracy 当资料不足时,系统是否正确拒答 判断系统是否避免无依据回答 用户问"我的申请一定会通过吗",系统应避免给确定结论
Hallucination Rate 答案中有多少内容无法被上下文支持 衡量模型编造信息的比例 答案 5 个事实中有 2 个无依据,幻觉率为 40%
Fluency 答案表达是否自然、清晰、连贯 衡量语言质量 答案事实正确,但表达混乱,也会影响用户体验

其中,Faithfulness 是非常关键的指标,Faithfulness 关注的是:答案中的每一个关键事实,是否都能在检索上下文中找到依据?一般可以这样评估:

复制代码
1. 将答案拆成多个原子事实 claim;
2. 判断每个 claim 是否能被上下文支持;
3. 计算被支持的 claim 占比。
例如答案是:
Skilled Worker visa 持有人可以携带配偶和子女,配偶需要满足 dependant partner 的资格要求,并且一定会自动获批。
Claim 是否被上下文支持
Skilled Worker visa 持有人可以携带配偶和子女 支持
配偶需要满足 dependant partner 的资格要求 支持
配偶一定会自动获批 不支持

如果 3 个 claim 中只有 2 个被支持,那么 Faithfulness 就不是满分。

生层层常见的问题有

问题 表现 可能原因 优化方向
答案跑题 没有直接回答用户问题 prompt 不清晰、上下文噪声太多 优化 prompt、提高 context precision
答案幻觉 编造上下文中没有的信息 生成约束不足 加 faithfulness check、要求基于上下文回答
答案不完整 漏掉关键条件或例外 上下文不足、模型总结不完整 parent-child chunk、答案结构化
引用错误 引用不能支持对应结论 citation 颗粒度太粗 claim-level citation、引用校验
过度确定 把"可能""需要满足条件"说成"一定" 缺少风险控制 增加不确定性表达和拒答策略
应该拒答但没有拒答 资料不足仍然强行回答 没有 answerability 判断 加 no-answer gate

3.3 系统层评估

系统层评估关注的是:整个 RAG 系统是否能够在生产环境中稳定运行。

除了答案质量,一个生产级 RAG 系统还需要关注响应延迟、调用成本、知识库更新频率、空检索率、拒答率、用户反馈和回归测试稳定性。

常见指标包括 Latency、Cost per Query、Empty Retrieval Rate、No-answer Rate、User Feedback 和 Index Freshness等。

指标 含义 主要作用 示例
Latency 单次请求的响应时间 判断用户等待时间是否可接受 平均响应 2 秒和 20 秒,用户体验完全不同
Cost per Query 每次请求的平均成本 判断系统是否具备规模化运行能力 包括 embedding、rerank、LLM token 成本
No-answer Rate 系统拒答的比例 判断系统是否经常无法回答 拒答率过高可能说明知识库覆盖不足
User Feedback 用户点赞、点踩、人工纠错 衡量真实用户满意度 高频点踩问题应进入评估集
Regression Stability 系统更新后旧问题是否仍然答对 判断优化是否引入退化 换 embedding 后,旧测试集准确率是否下降
Error Rate 系统运行错误比例 判断系统稳定性 API 超时、检索失败、LLM 调用失败

系统层评估的意义在于,帮助我们判断这个 RAG 系统是否不仅"能答对",而且能够长期、稳定、低成本地服务真实用户。

4. LLM-as-a-Judge 与 RAGAS

在早期阶段,这些判断通常依赖人工评审。但随着大语言模型能力提升,越来越多的 RAG 评估开始引入自动化评估方法,其中最常见的就是 LLM-as-a-Judge ,以及基于这种思想构建的评估框架,例如 RAGAS

4.1 LLM as a Judge

LLM-as-a-Judge的基本思想是:使用一个能力更强或更稳定的大模型作为评估器,让它根据预设评分标准,对 RAG 系统的输出进行打分和解释。

在 RAG 场景中,我们通常会把以下信息一起输入给 Judge LLM:

复制代码
Question:用户问题
Retrieved Context:检索到的上下文
Generated Answer:RAG 系统生成的答案
Reference Answer:标准答案,可选
Citation:答案中的引用,可选

然后让 Judge LLM 判断:

复制代码
答案是否回答了用户问题?
答案是否基于检索上下文?
答案中是否存在上下文没有支持的事实?
答案是否遗漏了关键条件?
引用是否真的支持答案中的结论?
资料不足时,系统是否应该拒答?

相比传统的字符串匹配或人工粗略打分,LLM-as-a-Judge 的优势在于它可以理解语义关系。例如,标准答案是:

复制代码
Skilled Worker visa 持有人通常可以携带符合条件的 partner 和 children。

模型回答是:

复制代码
一般情况下,Skilled Worker 签证持有人可以让配偶或子女作为 dependant 一起申请,但他们需要满足相应条件。

这两个答案在字面上不完全相同,但语义上基本一致。传统字符串匹配很难准确判断,而 LLM-as-a-Judge 可以更好地识别这种语义等价关系。它适合评估答案相关性、忠实度、完整性、引用准确性等传统指标难以覆盖的维度。但它也不是绝对可靠的。Judge LLM 也可能存在偏差、误判、打分不稳定等问题。因此,在生产环境中,通常需要结合人工抽样、明确 rubric、多模型交叉评估和回归测试来提升可靠性。

一个judge prompt设计案例如下

jsx 复制代码
你是一个 RAG 系统评估员。

请根据用户问题、检索上下文和模型答案,评估该答案是否可靠。

你需要判断以下维度:

1. Answer Relevance:答案是否直接回答了用户问题?
2. Faithfulness:答案中的事实是否都能被上下文支持?
3. Completeness:答案是否覆盖了问题所需的关键要点?
4. Citation Accuracy:引用是否支持答案中的关键结论?
5. Refusal Accuracy:如果上下文不足,模型是否正确拒答?

评分规则:
- 1 分:完全满足
- 0.5 分:部分满足
- 0 分:不满足

请输出 JSON 格式:

{
  "answer_relevance": 0-1,
  "faithfulness": 0-1,
  "completeness": 0-1,
  "citation_accuracy": 0-1,
  "refusal_accuracy": 0-1,
  "reason": "简要说明评分原因"
}

4.2 RAGAs

如果说 LLM-as-a-Judge 是一种评估思想,那么 RAGAS 就是一个把这种思想落地到 RAG 场景中的评估框架。

RAGAS,全称是 Retrieval Augmented Generation Assessment。它的目标不是只评估最终答案,而是分别评估 RAG 系统中的检索质量、上下文质量和生成质量。RAGAS 论文将其描述为一个面向 RAG pipeline 的 reference-free evaluation 框架,也就是在很多场景下不需要依赖人工标注的标准答案,就可以对 RAG 系统进行评估

一个典型的 RAGAS 评估样本通常包含以下字段:

字段 含义 是否必须
question 用户问题 必须
answer / response RAG 系统生成的答案 必须
contexts / retrieved_contexts 检索到的上下文 必须
ground_truth / reference 标准答案 部分指标需要
reference_contexts 标准上下文 部分指标需要

RAGAS 官方文档列出了多个面向 RAG 的指标,包括 Context Precision、Context Recall、Response Relevancy、Faithfulness、Noise Sensitivity 等。在实际测试中,我们可以选用我们需要的指标进行评估。

指标 对应层级 评估问题 解释
Context Precision 检索层 检索结果是否把相关内容排在前面? 衡量相关 chunk 是否排在无关 chunk 前面
Context Recall 检索层 检索结果是否覆盖了回答所需的信息? 衡量重要信息是否被成功检索出来
Faithfulness 生成层 答案是否忠实于上下文? 判断答案中的 claim 是否能被检索上下文支持
Response Relevancy / Answer Relevance 生成层 答案是否回答了用户问题? 判断答案是否切题,是否包含无关内容

当然,RAGAS也不是万能的,RAGAS 更适合作为自动化评估的一部分,而不是唯一标准。在实际环境中,我们可能还需要考虑人工复核,用户反馈等等其他补充方式,综合考虑从而提升RAG系统的效果。

5. 如何构建一套 RAG 评估流程

我们已经介绍了评估指标以及评估方法,现在介绍具体如何开展并构建完整的评估管道。

5.1 构建评估数据集

RAG 评估的第一步是构建评估数据集。很多人一开始会直接拿几个问题测试系统效果,但这种方式很难反映真实业务场景。

一个好的评估集应该覆盖不同类型的问题,而不是只包含简单事实问答。

问题类型 示例
简单事实问题 Skilled Worker visa 可以携带配偶吗?
条件判断问题 未婚伴侣是否可以作为 dependant?
多文档问题 dependant 申请需要满足哪些条件以及费用是多少?
时间敏感问题 当前 IHS surcharge 是多少?
概念混淆问题 Spouse visa 和 Skilled Worker dependant 有什么区别?
不可回答问题 我的签证申请一定会通过吗?
多轮上下文问题 那我的孩子呢?

每条样本可以包含:

jsx 复制代码
{
  "question": "Skilled Worker visa 可以携带配偶吗?",
  "gold_answer": "通常可以,但配偶需要满足 dependant partner 的资格要求。",
  "gold_sources": [
    "GOV.UK Skilled Worker visa: your partner and children"
  ],
  "answerable": true,
  "category": "skilled_worker_dependant",
  "difficulty": "medium",
  "freshness_required": true
}

5.2 运行 RAG Pipeline 并保存 Trace

在评估 RAG 系统时,只保存最终答案是不够的。因为最终答案错误时,我们需要知道错误发生在哪个环节。

因此,在每次评估运行时,都应该保存完整 trace。

jsx 复制代码
{
  "question": "Skilled Worker visa 可以携带配偶吗?",
  "rewritten_query": "Can a Skilled Worker visa holder bring their spouse as a dependant?",
  "retrieved_chunks": [
    "chunk_001",
    "chunk_002"
  ],
  "reranked_chunks": [
    "chunk_002",
    "chunk_001"
  ],
  "final_context": [
    "Skilled Worker visa holders may be able to bring their partner and children..."
  ],
  "generated_answer": "可以。Skilled Worker visa 持有人通常可以携带符合条件的配偶作为 dependant。",
  "citations": [
    "GOV.UK Skilled Worker visa: your partner and children"
  ],
  "latency": 2.8,
  "cost": 0.01
}

5.3 分层计算评估指标

拿到评估结果后,可以按照检索层、生成层和系统层分别计算指标。

其中,检索层指标更适合用标注好的 gold_sources 计算;生成层指标可以使用 LLM-as-a-Judge 或 RAGAS 辅助评估;系统层指标则通常来自日志和监控系统。

5.4 进行错误归因

当一个问题回答错误时,我们需要判断它属于哪种错误类型。

错误类型 表现 优化方向
Indexing Failure 正确文档没有入库 检查数据源、爬虫、解析流程
Chunking Failure 文档有答案,但 chunk 切分破坏语义 优化 chunk size、标题继承、parent-child chunk
Retrieval Failure 正确 chunk 没有被召回 混合检索、query rewrite、多查询检索
Ranking Failure 正确 chunk 被召回但排名靠后 reranker、RRF、metadata 加权
Context Failure 正确 chunk 没有进入最终上下文 context packing、去重、topK 调整
Generation Failure 上下文有答案,但模型回答错 prompt、faithfulness check、答案结构化
Citation Failure 引用不支持答案 claim-level citation、引用校验
Freshness Failure 使用了过期文档 文档版本管理、更新时间过滤

5.5 建立回归测试机制

RAG 系统上线后仍然会持续变化。文档会更新,用户问题会变化,embedding 模型、reranker 和 prompt 也可能迭代。

因此,评估不能只做一次,而应该成为持续回归测试的一部分。

版本 Recall@5 Faithfulness Citation Accuracy Latency
V1 baseline 0.72 0.81 0.76 2.1s
V2 hybrid retrieval 0.84 0.83 0.78 2.5s
V3 hybrid + reranker 0.86 0.89 0.85 3.4s

通过这样的版本对比,我们可以判断一次优化到底带来了什么影响。比如加入 reranker 后,Faithfulness 和 Citation Accuracy 提升了,但 Latency 也上升了,那么就需要在效果和成本之间做权衡。

6. 如何根据评估结果优化 RAG 系统

不同错误对应不同优化方法:

错误类型 优化方向
检索不到 加 BM25、混合检索、query rewrite、多查询检索
排名靠后 加 reranker、RRF、权威来源加权
上下文不完整 parent-child chunk、section expansion
噪声太多 metadata filter、阈值过滤、去重
答案幻觉 加 faithfulness 检查、引用约束
引用错误 claim-citation 对齐检查
文档过期 metadata freshness、版本管理

具体介绍优化方法我将在后续文章进行总结。

Reference/ 参考资料

RAG 评估体系 - 全网最全解析 - 知乎

RAGAs: Automated Evaluation of Retrieval Augmented Generation (Es et al., EACL 2024)