RAG 系列(八):RAG 评估体系——用数据说话

作者:冬奇Lab日期:2026/5/6

为什么"感觉不错"不是标准?

前面七篇文章,我们搭起了一整套 RAG 流程:分块、Embedding、向量库、检索策略。系统跑起来了,你问它几个问题,回答看起来"还不错"。

但问题接踵而至:

  • 迭代后真的变好了吗? 你换了 Embedding 模型、调了 chunk_size、加了 MMR,但回答质量真的提升了吗?还是只是"感觉"变好了?
  • 问题出在哪里? 某个问题回答得很差,是检索阶段没召回相关文档,还是生成阶段模型在胡说八道?
  • 怎么向老板汇报? "我觉得我们的 RAG 系统挺好的"——这句话在数据驱动的团队里毫无说服力。

RAG 系统的评估,不能靠感觉,必须靠数据。

本文会带你从零开始,用 RAGAS 框架建立一套可量化的 RAG 评估体系,让你清楚地知道系统好不好、哪里差、怎么改。


RAGAS 是什么?

RAGAS(Retrieval-Augmented Generation Assessment)是专为 RAG 系统设计的开源评估框架。它的核心思想很朴素:用 LLM 作为裁判,自动判断 RAG 系统的输出质量

为什么用 LLM 当裁判?因为传统的 NLP 评估指标(如 BLEU、ROUGE)只适合做翻译或摘要任务,它们通过字符串匹配来判断相似度,完全无法理解语义。而 RAG 的评估需要理解"这个答案是否基于上下文"、"这个回答有没有答非所问"——这正是 LLM 擅长的。

RAGAS 提出了 4 个核心指标,覆盖了 RAG 系统的两个关键阶段(检索 + 生成):


四个核心指标详解

1. Faithfulness(忠实度)

问题:答案有没有在胡说八道?

Faithfulness 衡量生成答案是否忠实于检索到的上下文。如果模型在回答中加入了上下文里没有的信息,就是"幻觉",Faithfulness 就会低。

通俗理解:考试时Faithfulness高 = 答案全是根据提供的参考资料写的,没有自己瞎编。

计算方式:LLM 被prompt要求逐句检查答案中的每个陈述,判断是否能从上下文中推断出来。可推断的陈述数 / 总陈述数 = Faithfulness。

2. Answer Relevancy(答案相关性)

问题:答案是不是在答非所问?

Answer Relevancy 衡量答案与问题的相关程度。即使答案内容是对的,但如果偏离了问题的核心,这个指标也会低。

通俗理解:你问"怎么学 Python",对方却给你讲了一通 Java 的历史——虽然内容本身没错,但完全跑题了。

计算方式:LLM 根据答案生成若干个问题变体,然后计算这些问题与原始问题的 Embedding 相似度,取平均。

3. Context Precision(上下文精确度)

问题:检索回来的东西里,有多少是垃圾?

Context Precision 衡量检索结果中相关文档片段的比例。如果召回的 4 条上下文里有 2 条完全不相关,Context Precision 就是 0.5。

通俗理解:去图书馆找资料,借了 4 本书,只有 2 本有用——你的检索精确度就是 50%。

计算方式:LLM 逐条判断每个上下文片段是否与问题相关,相关条数 / 总条数。

4. Context Recall(上下文召回率)

问题:该找的东西找到了吗?

Context Recall 衡量所有与问题相关的信息,有多少被成功检索到了。这是检索阶段最核心的指标。

通俗理解:考试复习时,考卷上有 10 个知识点,你的复习资料只覆盖了 6 个——召回率就是 60%。

计算方式:LLM 将标准答案(ground_truth)拆分成多个关键陈述,然后逐条判断这些陈述是否能从检索到的上下文中推断出来。能推断的陈述数 / 总陈述数 = Context Recall。


四个指标的关系

1用户提问
2    ├─→ Context Recall 低?  检索阶段有问题(chunk/embedding/top-k)
3    ├─→ Context Precision 低?  检索混入了噪声
4    ├─→ Faithfulness 低?  生成阶段幻觉(上下文不足或模型不听话)
5    └─→ Answer Relevancy 低?  答案跑题了
6

这四个指标互相独立、互相补充,一起构成了 RAG 系统的"体检报告"。


评估的第一步:构建测试集

评估需要"考题"和"参考答案"。测试集的质量直接决定评估结果的可信度。

测试集长什么样?

一个标准的 RAG 测试样本包含四个字段:

1{
2  "question": "RAGAS 框架包含哪四个核心评估指标?",
3  "ground_truth": "RAGAS 四个核心指标是:Faithfulness、Answer Relevancy、Context Precision、Context Recall。",
4  "contexts": ["...", "..."],
5  "answer": "..."
6}
7
  • question:用户问题
  • ground_truth:标准答案(人工编写,不依赖模型)
  • contexts:RAG 系统检索到的上下文(运行后自动填充)
  • answer:RAG 系统生成的答案(运行后自动填充)

两种构建方式

方式优点缺点适用场景
手工标注质量高、边界清晰成本高、耗时长核心测试集、生产验收
LLM 生成效率高、可规模化需人工抽检校正快速构建、扩充覆盖面

本文的测试数据

我们用 8 篇 RAG 相关的技术文章作为知识库(涵盖向量数据库、Embedding、分块策略、混合检索等主题),并为每篇手工编写了 1 个 QA 对:

1[
2  {"question": "什么是 RAG 技术,它主要解决什么问题?", "ground_truth": "RAG..."},
3  {"question": "企业级应用应该选择哪种向量数据库?", "ground_truth": "Qdrant  Weaviate..."},
4  {"question": "中文场景应该选择哪个 Embedding 模型?", "ground_truth": "BGE 系列..."},
5  ...
6]
7

完整数据见 data/knowledge_base.jsondata/manual_testset.json


代码实战(一):搭建可评估的 RAG 系统

在评估之前,我们需要一个可配置的 RAG Pipeline。为什么要可配置?因为我们要对比不同参数(chunk_size、top_k)下的评估结果。

rag_pipeline.py 核心结构

1class RAGPipeline:
2    def __init__(self, chunk_size=512, chunk_overlap=50, top_k=4):
3        self.chunk_size = chunk_size
4        self.chunk_overlap = chunk_overlap
5        self.top_k = top_k
6
7    def build_index(self, docs, force_rebuild=False):
8        # 1. 切分文档
9        splitter = RecursiveCharacterTextSplitter(
10            chunk_size=self.chunk_size,
11            chunk_overlap=self.chunk_overlap,
12            separators=["\n\n", "\n", "。", ";", " ", ""],
13        )
14        chunks = splitter.split_documents(docs)
15
16        # 2. 构建向量索引
17        self.vectorstore = Chroma.from_documents(
18            documents=chunks, embedding=embeddings
19        )
20
21        # 3. 组装 LCEL Chain
22        self.chain = (
23            {"context": retriever | format_docs, "question": RunnablePassthrough()}
24            | prompt | llm | StrOutputParser()
25        )
26
27    def query(self, question):
28        contexts = self.retriever.invoke(question)
29        answer = self.chain.invoke(question)
30        return {"question": question, "answer": answer, "contexts": contexts}
31

关键设计:所有影响质量的参数都暴露为构造函数的参数,这样我们可以在诊断实验中轻松切换配置。


代码实战(二):运行 RAGAS 评估

evaluate.py 评估流程

1def main():
2    # 1. 加载 8 条手工测试数据
3    testset = load_testset("./data/manual_testset.json")
4
5    # 2. 构建 RAG Pipeline(默认配置:chunk=512, overlap=50, top_k=4)
6    pipeline = RAGPipeline(chunk_size=512, chunk_overlap=50, top_k=4)
7    pipeline.build_index(force_rebuild=True)
8
9    # 3. 对每条测试数据执行 RAG,收集 answer  contexts
10    dataset = prepare_dataset(pipeline, testset)
11    # dataset 格式:{question, answer, contexts, ground_truth}
12
13    # 4. 运行 RAGAS 评估
14    result = evaluate(
15        dataset=dataset,
16        metrics=[faithfulness, answer_relevancy, context_precision, context_recall],
17        llm=ragas_llm,        # 评估用的裁判 LLM
18        embeddings=ragas_emb, # 评估用的 Embedding
19    )
20
21    # 5. 打印并保存报告
22    print_report(result, dataset)
23    save_report(result, dataset, "./evaluation_report.json")
24

注意:评估用的 LLM 和 Embedding 可以与 RAG 系统本身使用的不同。RAG 系统可以用轻量级模型(如 glm-4-flash),而评估裁判可以用更强的模型(如 GPT-4)来获得更准确的判断。不过在实际项目中,为了节省成本,通常用同一个模型。

实际运行结果

1$ python evaluate.py
2

输出:

1============================================================
2 RAGAS 评估报告
3============================================================
4
5📊 总体得分:
6   faithfulness          : 0.792 ███████████████
7   answer_relevancy      : 0.406 ████████
8   context_precision     : 0.583 ███████████
9   context_recall        : 0.625 ████████████
10
11   平均得分                  : 0.602
12
13📋 逐题明细:
14     # Question                        Faith AnsRel CtxPre CtxRec
15   ---------------------------------------------------------------
16     1 什么是 RAG 技术...                1.00   0.68   1.00   1.00
17     2 企业级应用应该选择哪种...          0.33   0.09   0.33   0.00
18     3 中文场景应该选择哪个...            1.00   0.78   1.00   1.00
19     4 文档分块时 Chunk Size...          1.00   0.86   0.50   1.00
20     5 RAGAS 框架包含哪四个...           1.00   0.64   1.00   1.00
21     6 RRF 融合算法的公式是...            0.00   0.00   0.00   0.00
22     7 HyDE 查询优化技术的...             1.00   0.13   0.00   0.00
23     8 生产级 RAG 系统如何...             1.00   0.07   0.83   1.00
24
25⚠️  最差指标: answer_relevancy (0.406)
26============================================================
27

结果解读

看到这个报告,我们能立即定位问题:

  1. Faithfulness 较高(0.792):说明模型基本能基于检索到的上下文回答,不太会凭空编造。
  2. Answer Relevancy 很低(0.406):这是最大的问题!说明很多答案虽然基于上下文,但没有准确回答问题的核心。
  3. Context Recall(0.625)和 Context Precision(0.583)中等:检索阶段有提升空间。
  4. 第 6 题全面崩溃(0/0/0/0):问的是 RRF 公式,但系统完全没有召回相关文档——这是典型的检索失败案例。

没有这份报告,你只会觉得"第 6 题回答得不太好"。有了报告,你精确知道是检索出了问题,而不是生成出了问题。


代码实战(三):诊断实验——好配置 vs 差配置

评估最大的价值不是打分,而是诊断。下面我们故意制造一个"差配置",看看 RAGAS 能不能发现问题。

diagnose.py 设计思路

参数好配置差配置预期问题
chunk_size512128上下文碎片化,语义断裂
chunk_overlap500边界信息丢失
top_k42召回不足,遗漏相关信息
1# 好配置
2good = RAGPipeline(chunk_size=512, chunk_overlap=50, top_k=4)
3
4# 差配置:chunk 太小 + 无重叠 + 只召回 2 
5bad = RAGPipeline(chunk_size=128, chunk_overlap=0, top_k=2)
6

诊断对比结果

运行 python diagnose.py

1============================================================
2 诊断对比:好配置 vs 差配置
3============================================================
4
5  指标                         好配置        差配置         差异           诊断
6  --------------------------------------------------------------------
7  faithfulness                0.830      0.750     +0.080          正常
8  answer_relevancy            0.502      0.191     +0.312          严重
9  context_precision           0.583      0.375     +0.208          警告
10  context_recall              0.625      0.250     +0.375          严重
11  --------------------------------------------------------------------
12  平均得分                        0.635      0.391     +0.244
13============================================================
14
15  📋 诊断结论:
16      Context Recall 显著下降:检索阶段有问题(chunk 太小 / top-k 太少)
17      Context Precision 显著下降:检索结果中混入了噪声
18      Answer Relevancy 显著下降:答案偏离了问题
19

诊断结论分析

下降指标差配置数值诊断
Context Recall ↓↓0.625 → 0.250chunk 太小导致语义断裂,top_k=2 导致大量相关信息未被召回
Context Precision ↓0.583 → 0.375碎片化后,低质量片段更容易被错误地匹配到查询
Answer Relevancy ↓↓0.502 → 0.191上下文不足 → 模型只能基于有限信息回答 → 答案偏离问题
Faithfulness ↓0.830 → 0.750上下文碎片化后,模型有时不得不"脑补"来填补信息缺口

这个实验完美展示了 RAGAS 的诊断能力:不是笼统地说"差配置更差",而是精确告诉你哪个环节出了问题、严重到什么程度


完整代码

本文的完整代码已开源,包含:

  • rag_pipeline.py — 可配置的 RAG Pipeline
  • evaluate.py — RAGAS 评估主脚本
  • diagnose.py — 好配置 vs 差配置诊断实验
  • generate_qa.py — LLM 自动生成测试集
  • data/knowledge_base.json — 8 篇知识库文档
  • data/manual_testset.json — 8 条手工测试数据

源码地址:

github.com/chendongqi/…


适用场景与注意事项

什么时候需要做 RAGAS 评估?

  • 系统迭代后:更换 Embedding 模型、调整分块策略、升级 LLM 后,跑一遍评估看指标变化
  • 上线前验收:建立 baseline,确保系统达到可接受的质量门槛
  • 问题排查:用户投诉回答质量差时,用指标定位是检索问题还是生成问题

注意事项

  1. 评估成本不低:4 个指标 × N 条测试数据,每条都要调多次 LLM。8 条数据大约需要 3-5 分钟、几百次 API 调用。生产环境建议用异步批量处理。
  2. ground_truth 质量决定评估上限:如果参考答案本身写得不准确,Context Recall 等指标就会失真。
  3. 裁判模型与业务模型可以不同:评估可以用更强的模型(如 GPT-4),RAG 系统本身用轻量模型(如 glm-4-flash),这样评估更准确且成本可控。
  4. 定期更新测试集:知识库更新后,测试集也应同步更新,覆盖新增领域。

小结

本文带你从零建立了一套 RAG 评估体系:

  1. 为什么评估:"感觉不错"不可量化,迭代后不知道变好变坏
  2. RAGAS 四大指标:Faithfulness(防幻觉)、Answer Relevancy(防跑题)、Context Precision(减噪声)、Context Recall(保召回)
  3. 测试集构建:手工标注为主,LLM 生成为辅
  4. 代码实战:完整的 RAG Pipeline + RAGAS 评估 + 诊断对比实验
  5. 真实数据:好配置平均 0.635,差配置平均 0.391,差距一目了然

关键认知:RAG 优化不能拍脑袋。先用 RAGAS 跑一遍评估,找到最差的指标,再针对性优化——这是最高效的改进路径。


参考资料


RAG 系列(八):RAG 评估体系——用数据说话》 是转载文章,点击查看原文


相关推荐


告别重复劳动:一套插件让 AI 替你写代码、修Bug、做测试、上生产
吴文周2026/4/26

Claude Code 团队 AI 插件实践:从新人上线到全栈自动化的渐进式指南 特别鸣谢:本文由 南京大翼航空 团队实践沉淀而成,感谢团队在 AI 辅助研发领域的持续探索与投入。 后续规划:本文为 dw 插件生态的总览。后续将为每个 skill 单独撰写详细教程文章,涵盖实战案例、配置细节和踩坑经验,敬请关注。 本文涉及的研发规范体系均基于 Claude Code 的插件机制实现。插件是 Claude Code 官方提供的扩展方式,支持自定义命令、Skill、Hook、Agent 等,是


开发RN项目时,如何调试iOS真机、Android真机?常见调试问题排查?
光影少年2026/4/17

在开发 React Native(RN)项目时,真机调试是必备技能。下面我从 iOS / Android 真机调试步骤 + 常见问题排查 给你一套实战指南(偏工程经验总结)。 一、iOS 真机调试 1. 基本前提 必须使用 Xcode 需要 Apple ID(免费也行) iPhone 用数据线连接 Mac 2. 配置步骤 ✅ 第一步:信任设备 iPhone 上点击“信任此电脑” ✅ 第二步:Xcode 配置签名 打开: ios/xxx.xcwo


Spark DynamicJoinSelection 规则根据AQE统计信息动态调整Join策略
鸿乃江边鸟2026/4/9

背景 本文基于Spark 3.5.3 在Spark引入了AQE以后,Spark在运行的时候能够拿到运行时候的Shuffle统计信息,这些信息可以更好的来调整join的策略,当下规则下这种策略的调整是通过增加hint来进行控制的, 规则的目的是防止负优化。 分析 这里会有三种优化场景: 1. 检测大量空分区 → 添加 NO_BROADCAST_HASH HINT 对应的代码如下: private def hasManyEmptyPartitions(mapStats: MapOutputStat


金融和电商行业如何使用网络监控保障业务稳定?
运维行者_2026/4/1

在金融和电商的世界里,系统"稳定"从来不是一句口号------它是真金白银的保障。一笔支付交易卡顿3秒,可能让客户放弃下单;一次核心数据库响应延迟,就可能触发监管警报;一张快递面单打印失败,背后是成百上千个订单履约受阻。这些看似微小的技术波动,在高并发、强实时的业务场景中会被迅速放大,直接侵蚀用户体验、品牌信誉甚至合规底线。 OpManager 深知,对金融与电商企业而言,网络监控的意义远不止"看设备是否在线"。它必须能穿透复杂的IT架构,预判风险、快速定位、自动响应,并在关键时刻成为业务连续


【Linux】网络之http协议
爱吃生蚝的于勒2026/3/24

文章目录 URL🚩HTTP协议格式请求格式HTTP常用方法 响应格式常见状态码HTTP常见Header 🚩模拟实现HTTP服务器⭐Cookie URL 我们所说的网址就是URL 如果在参数中出现?/特殊字符,会自动转义,/ ?字符已经被url特殊处理了 ‘+’被转义为%2b 🚩HTTP协议格式 请求格式 请求行:方法+URL+版本号+\r\n 请求报头:每行一对键值对+\r\n \r\n空行,(没有空行的话无法区分报头和正文) 正文,(怎么确定正文


C++入门基础
全球便秘冠军保持者2026/3/16

C++的第一个程序 #include<stdio.h> int main() { printf("Hello World!\n"); return 0; } 这是我们使用的c++的编译器写的c语言的“Hello World!”,说明c++的编译器可以兼容c语言的语法 那我们来看一下用c++写的“Hello World!” #include <iostream> using namespace std; int main() { cout << "Hello World!"


拒绝写重复代码,试试这套开源的 SpringBoot 组件,效率翻倍~
皮皮林5512026/3/7

目录 1 简介 2 快速入门 2.1 Spring Boot 接口开发现状 2.2 快速入门 1 简介 Graceful Response 是一个 Spring Boot 技术栈下的优雅响应处理器,提供一站式统一返回值封装、全局异常处理、自定义异常错误码 等功能,使用 Graceful Response 进行 web 接口开发不仅可以节省大量的时间,还可以提高代码质量,使代码逻辑更清晰。 强烈推荐你花 3 分钟学会它! 本项目案例工程代码:https://github.com/fe


程序员的明天:AI 时代下的行业观察与个人思考
勇哥Java实战2026/2/27

这篇文章分享了我对 AI 时代下,软件行业发展以及程序员命运走向的 5 点思考,供大家参考。 1 匠人时代落幕 Redis 之父 antirez,最近写了一篇文章 《 Don't fall into the anti-AI hype 》,读完之后,我深有感触。 文章的观点非常明确: AI 不仅改变了编码方式,更重塑了软件行业的价值结构和职业路径,程序员需要从“手动编码”转向“设计系统与与 AI 协作” 。 过去的软件行业,其实有一种很典型的“匠人红利”。谁代码写得更优雅,谁框架更熟,谁对某个


QT & QML 总结备查
瞰百2026/2/19

QT & QML 总结备查 首要注意,在桌面端开发QT可免费商用,而嵌入式端QT商用则收费。 各种 UI 库的总结和对比: Cpp-Learning/C-C++实用库备查.md at main · Staok/Cpp-Learning。 文章所在 Github 仓库 Staok/QT-QML-Learning: QT & QML 总结备查文章 会保持最新,其它地方的不会跟进。 常看常新 QT 安装:网搜 Qt Creator 下载和安装即可。 编译器:对于 Win 上


英语语法笔记:英语不应该成为开发工程师的发展瓶颈
修己xj2026/2/11

前几天,是公司成立二十周年的年会。老板作了一场题为《穿越寒冬,求实存善》的演讲。那一刻我在想:当寒意渐浓,作为领航者,他思考的是如何带领公司扛过这场冬天;那作为程序员的我们,又该如何穿越自己的寒冬呢? Vue 作者尤雨溪曾坦言:“不仅英语差会成为瓶颈,英语好还能成为优势,因为学习效率会比别人高。像我这样半路出家自学的人,只能靠英语了……”确实,无论是阅读技术文档、参与开源社区、在 Stack Overflow 寻找答案,还是追踪最新技术资讯、争取一份远程机会,英语早已不是可选项,而是必修课——是

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客