RAG 评测数据集,到底该怎么准备?
之前学 RAGAS 的时候,总以为最难的是算指标,后来才发现,真正卡人的地方其实是数据集根本凑不齐 。
这篇笔记把数据集的准备拆成了两部分: "题"从哪里来 ,以及 "答"从哪里来。只有两样都齐了,整个测评才能跑通。
一、先把数据集的"原材料"分个类
如果只盯着一个空表格看,会觉得需要的东西很杂:问题、AI 回答、标准答案、参考资料......
但从数据是怎么来的这个角度看,其实就两条路:
1️. 从文档出发生成 ------ 让 LLM 替你读文档、出题
这条路的核心逻辑是:把知识文档"喂"给大模型,让它根据文档内容自动造 Q&A 对 。
能直接产出的内容是:
- 原始问题(模拟用户会怎么问)
- 标准答案(基于文档写出的正确回答,也就是 ground truth)
这种方法的代表就是 RAGAS 自带的 TestsetGenerator,以及各种自己调用 LLM 从文档出题的脚本。
2️. 从真实提问出发提取 ------ 找"人类真正关心过什么"
这类数据来自系统过去真实积累的交互痕迹,主要来源有:
- 历史数据加工 :老客服对话、历史 Q&A 库、工单、论坛帖子
能直接拿到:原始问题 + 真实答案 - 人工构建 :业务专家基于文档和用户反馈,手动编写的常见问答对
同样产出:原始问题 + 真实答案
这两条路解决的共同问题是:把"题"和"标答"先准备好 。
但注意,到这里还没有 AI 回答什么事。
二、另一个要单独拿到的:RAG 系统"实战作答"
无论上面用哪种方式把"问题"和"标准答案"准备好了,都还缺一个关键环节------我自己的 RAG 系统,面对这些问题时,到底输出了什么。
这个时候就要用到:
📌 线上 AI 问答 / 直接调用 RAG 系统
做法很简单:把已经准备好的问题,一条条喂给自己的 RAG 系统,让它跑一遍,把输出结果保存下来。
这样能拿到:
- AI 回答(系统生成的最终答复)
- 参考资料(检索阶段召回的文档片段)
至此,数据集的"四大件"------问题、AI 回答、标准答案、参考资料------才算真正凑齐。
三、用 RAGAS 自动生成数据集时,最容易踩的一个坑
我一开始看文档的时候,觉得 RAGAS 的 TestsetGenerator 太方便了:扔进去一堆 Markdown,就能吐出来带问题、标答和参考资料的 CSV。
于是就理所当然地想: "这下可以直接拿这个 CSV 去算 Context Precision 和 Context Recall 了吧?"
------错。
原因在于,这里"参考资料"是两回事,必须仔细区分:
| 指标 | 需要的"参考资料"是哪种? | 说明 |
|---|---|---|
| Context Precision / Context Recall | RAG 系统实际检索到的资料 | 用来判断检索质量如何 |
生成数据集时附带的 reference_contexts |
LLM 生成标准答案时使用的上下文 | 用来保证标答有据可依 |
换句话说,自动生成数据集的"参考资料"是"出题者视角"的上下文,而评测时需要的"参考资料"是"考生(RAG 系统)视角"的上下文,两者的来源完全不一样。
所以哪怕已经拿到了 RAGAS 生成的那份漂亮 CSV,里面包含了:
- 用户问题
- 参考内容(其实是生成标答的依据)
- 标准答案
要想真正算 Context Precision、Context Recall 这类指标,还是必须再把问题丢给自己的 RAG 系统跑一遍,拿到系统自己召回的参考资料和 AI 回答,才能代入公式去评测。
四、把整个流程画成一张"准备清单"
整理成步骤思维的话,就特别清楚:
Step 1:获取"题"和"标答"
- 方式 A :基于 LLM 从文档生成(RAGAS / 自写脚本)
产出:问题 + 标准答案(+ 出题时用的参考上下文,但不能用作检索评测) - 方式 B :历史数据加工 / 人工构建
产出:问题 + 真实答案
Step 2:用 RAG 系统"作答"
- 把 Step 1 的所有问题,输入自己的 RAG 系统
- 产出:AI 回答 + 实际检索到的参考资料
Step 3:对齐到具体指标
- Context Precision / Context Recall:用 RAG 系统的参考资料 + 问题 + 标准答案
- Answer Relevancy / Faithfulness / Answer Correctness:还要加上 AI 回答
这样一看,数据集准备从来不是"生成一份 CSV 就结束",而是一个"拼图"的过程:从不同来源把四个关键字段拼齐。
五、从 RAGAS 运行日志里能学到的东西
顺便记录一下,用 TestsetGenerator 生成数据时,后台在做什么(进度条里那些名词不是装饰,每一步都是有意义的):
- 标题提取 & 按标题切分:读文档结构,理清骨架
- 摘要提取:概括各部分内容,为出题提供"题眼"
- 节点过滤:丢掉太水的段落,只保留信息量大的文本
- 向量化处理:转成 embedding,为后续相似度计算准备
- 主题 & 命名实体提取:找出核心话题、人名/产品名/地名
- 相似度与重叠度计算:为跨段落推理的复杂问题搭桥
- 生成用户画像:虚构不同角色(小白 / 专家),让提问更真实
- 构思应用场景:给问题加一个"发生背景"
- 生成最终样本:综合以上信息,写出完整 Q&A
理解这个流程之后,就能明白为什么它会跑得很慢,也知道生成出来的问题质量很大程度取决于原始文档的规范程度和 LLM 的能力。
小结一句:别把"生成了测试集"当成"可以评测了" 。
生成测试集只是把"题目"和"参考答案"做出来了,真正要评判一个 RAG 系统,还得让系统亲自上考场,把答卷交出来,再拿去对照。