很多人搜「what does rag mean in data」,其实是被两个语境绕住了:一个是在讲模型怎么用数据,一个是在讲数据怎么喂给模型。这两件事的边界不清楚,选型就会跑偏。这篇从数据工程的视角把 RAG 的定义拆开,给出数据侧要做的具体动作、排查顺序和不适用的情况,帮你判断手上的数据集值不值得上这一套。
搜「what does rag mean in data」的人,十有八九卡在同一个地方:到底是在说模型怎么用数据,还是在说数据怎么喂给模型。这两个语境混在一起,选型就会跑偏。比如有人以为上了 RAG 就等于把数据接进了模型,其实中间还隔着进料、切块、索引一整条数据流水线,模型只负责消费最末端那一小段。
这篇从数据工程的视角把 RAG 拆开讲:数据侧具体要干哪些活、什么样的数据集值得上、上之前要先过哪些质量闸门、上线后盯什么指标。只给判断标准和动作顺序,不给绝对结论,因为同一套做法放到不同数据上结论可能完全相反。
先把 RAG 这个词在数据语境里的所指定死
RAG 拆开就是检索、增强、生成三段。数据领域的重点全压在前两段:检索是从你的库房里把相关片段捞出来,增强是把这些片段拼进模型的上下文。生成只是消费端,属于模型那侧的活。分不清这条线,就会出现「我数据都洗好了为什么效果还差」这种问题——因为洗数据只管前两段,跟模型怎么解读上下文没关系。
| 对比项 | RAG 改的是什么 | 数据侧主要忙什么 |
|---|---|---|
| 和微调比 | 给模型看什么 | 建库、切块、维护更新链路 |
| 和普通搜索比 | 返回喂模型的片段 | 片段要短、要带来源、要能拼装 |
| 和直接塞上下文比 | 从大库里自动挑 | 先得把大库整理成可检索结构 |
| 和结构化查询比 | 处理自然语言文档 | 非结构化内容的归一化 |
和微调的区别值得单独拎出来说。RAG 改的是「给模型看什么」,微调改的是「模型本身怎么答」。前者数据侧的活是持续性的:文档一变,索引就得跟着变。后者数据侧的活主要是一次性的:把问答对整理成训练集。你要是冲着「文档天天更新」去的,微调那条路基本走不通,因为每次更新都重训一遍不现实。
和普通搜索的区别也容易混。搜索返回一列文档给人点,RAG 返回的是切好的片段喂给模型。所以同一个库,做成搜索页面和做成 RAG 语料,切块粒度、元数据设计、排序目标都不一样。术语基础概念要是还没理顺,可以到站内词典页对照一下,别在名词上卡太久。
数据侧到底要做哪几件活
这四件事是有先后依赖的,顺序错了会返工。进料没弄干净就去切块,切出来的片段里全是页眉页脚;切块边界没定好就去向量化,后面召回质量怎么调都上不去。下面按顺序拆开讲。
- 进料:先做格式归一把 PDF、Word、网页、扫描件统一成纯文本或带结构的中间格式。去页眉页脚、去水印、拆表格。扫描件单独走 OCR 流程,别和文本混在一起处理。验证方式:随机抽几十份原始文件,看解析结果里有没有残留的页码、导航文字。
- 切块:按语义边界切优先按标题层级、段落、列表项这种天然边界切,不要机械按字数硬切。每个片段保留它所属的标题路径和来源标识,方便回答时回溯到原文位置。验证方式:抽一批片段单独读一遍,看有没有把一句话劈成两半的情况。
- 向量化:选嵌入模型并定维度这一步决定了召回的下限。要按你的语种、领域文本特点来选,别直接套通用推荐。定好维度后批量入库,记录清楚用的是哪个模型,因为换模型意味着整库要重算。验证方式:拿几个典型问题去查,看能不能召回到明显相关的片段。
- 索引与元数据:打标签给每条片段挂上来源、时间、权限、文档类型这些标签。后面做时间过滤、权限过滤、引用标注全靠它。验证方式:随便挑一条片段,看能不能凭元数据定位回原始文档和具体位置。
这四步里最容易偷工减料的是元数据。很多人觉得先跑通再说,结果上线后发现要做时间过滤、要做权限隔离,整个库得重灌一遍。进料和切块的具体参数,按你自己的数据试出来,别照搬别人的分块大小。
什么样的数据适合走 RAG,什么情况下不适用
判断标准浓缩成两个变量:内容变化频率,以及答案需不需要出处。两个都高,RAG 很合适;两个都低,别上。下面这个表可以对着你自己的场景填。
| 场景特征 | 变化频率 | 需要引用出处 | 建议 |
|---|---|---|---|
| 产品手册、规章制度 | 高 | 高 | 适合走 RAG |
| 历史归档文档 | 低 | 低 | 直接整理成静态上下文更省事 |
| 报表数值汇总 | 高 | 中 | 走 SQL 或接口,别用 RAG |
| 几页的固定说明 | 低 | 低 | 直接塞进上下文,不用建库 |
| 涉密又无法自建 | 任意 | 任意 | 合规过不去就别硬上 |
- 适合:文档量大,人工翻不过来;内容持续更新,靠人工维护答案不现实;回答必须能指回原文,出错了要能追责;主体是自然语言,不是数字表格
- 不适合:答案是唯一确定的数值汇总,比如「上季度总额是多少」,这种用 SQL 或接口稳得多;文档就几页而且几乎不变,直接塞进上下文比建库省事;强合规要求数据不能出内网又没条件自建,这条过不了后面都免谈
- 边界情况:文档量中等、更新不频繁但答案需要出处,这种可以先做小规模验证,别一上来就全量建库
进料前的数据质量闸门清单
建库之前先过一遍闸门,能省掉后面大量的返工。这几条都是可以在进料阶段拦住的,一旦脏数据进了库,后面调检索、换模型都是在补漏。
- 同一事实在多份文档里说法打架,先合并或标注版本,否则模型会随机挑一个,你还不知道为什么答案每次不一样
- 过期文档要有明确的标记或剔除机制,不然检索命中的就是旧结论,而且看起来还很合理
- 权限边界必须在元数据里体现,别让检索把不该看的片段捞出来拼进上下文,这类问题一旦发生就是事故
- 重复内容要去重,同一份文档的多个副本会让召回结果全是近义片段,挤掉真正有用的内容
- 格式残留要清干净,页眉页脚、导航文字、乱码进库后会污染嵌入向量
清洗和切块的具体做法属于工程细节,没有通用最优解。参数怎么定、分块多大、要不要保留表格结构,都按你自己的数据试出来。数据质量这件事没有一劳永逸的方案,只有持续维护的链路。
怎么判断检索这层做得好不好
检索质量不能靠感觉判断。最实用的办法是先造一批小评测集:几十条「问题 + 应该命中的片段」就够用,改一次配置测一次。没有这个基线,你改了切块策略后觉得效果好了,其实可能只是这批问题碰巧对了。
- 造评测集从真实使用场景里挑几十个问题,人工标注每题应该命中哪些片段。数量不用多,覆盖主要文档类型就行。验证方式:换个人看这份标注,结论基本一致。
- 分方向看结果看两个方向:该召回的没召回,叫漏;不该召回的混进来了,叫脏。这两类的修法完全不同,漏了先查切块和嵌入,脏了先查元数据过滤和相似度阈值。
- 定位问题层级召回不行先查切块粒度和嵌入模型;召回可以但排序不行,再考虑加重排。别一上来就换模型,大部分问题出在数据侧。
- 固定变量再对比调参时固定住数据集和评测集,一次只改一个变量。否则根本分不清是数据变了还是配置变了导致的波动。
这套流程的价值在于把「感觉好不好」变成「哪一类问题多了几条」。检索这层的效果上限由数据决定,模型只是下限保障。
生成侧的数据约束:让答案有据可依
生成侧虽然主要是模型的事,但数据侧要提前做好配合。核心就一条:让每个答案都能追回到具体片段。做不到这一点,出了问题只能干瞪眼。
- 上下文里带上来源标识,要求模型在回答里标出依据,方便人工复核,也方便用户自己判断可信度
- 检索为空时要有兜底话术,明确告诉用户没找到,不能让模型硬编一个答案出来
- 长文档场景注意上下文预算,塞太多片段反而稀释重点,拼装顺序和裁剪规则要提前设计
- 结构化输出的格式约束属于另一条线,这里只关注内容是否来自检索结果
常见的错误是把检索结果一股脑全塞进去,觉得给的信息越多越保险。实际上超长上下文里模型对中间部分的注意力会下降,关键片段反而可能被忽略。裁剪和排序是数据侧要承担的活。
上线后要盯的几个工程指标和降级思路
上线不是终点。RAG 系统的延迟和成本分两段:检索一段,生成一段。这两段的量级和优化方向完全不同,得分开看。
| 指标 | 大头在哪 | 优化方向 |
|---|---|---|
| 延迟 | 嵌入和向量查询 | 批量嵌入、索引调优、结果缓存 |
| 成本 | 每次问答的生成调用 | 控制上下文长度、减少无效检索 |
| 准确率 | 进料和切块质量 | 评测集驱动,按数据侧问题定位 |
| 可追溯性 | 日志记录是否完整 | 记下片段 ID、相似度、最终引用 |
降级策略要提前定:检索服务挂了,是退化成纯模型回答,还是直接报错提示用户稍后再试。这两种选择对应完全不同的用户体验和风险,不能等出事再临时决定。日志这块重点记命中的片段 ID、相似度分数和最终引用,出问题才有得查。
数据视角最常见的几个坑
最后一个部分列几个反复出现的坑。这些坑的共同特点是:表面看是模型问题,实际上根子在数据侧。
- 把 RAG 当成万能问答,数据里本身就没有答案,检索再强也变不出来,先确认答案在不在
- 只调模型不调数据,大部分效果问题出在进料和切块,换模型往往治标不治本
- 忽略更新链路,文档改了库里没同步,回答就一直是旧的,而且旧答案看起来还挺合理
- 没有评测就上线,改一次感觉好了,其实只是这一批问题碰巧对了,下次可能又不行
- 元数据没设计好,后期想加时间过滤或权限隔离,整个库得重灌
RAG 在数据语境里的成败,八成在进料和切块,两成在检索和生成。
把这些坑当成上线前的检查项过一遍,比事后调模型划算得多。要留意的是,不同数据集的坑分布不一样,得对着自己的数据逐条验证,别照搬别人的检查清单。
下一步想对照实际接入方案和不同路径的成本区间,可以到站内的价格追踪页看当时的数字,再结合自己的数据规模做判断。→常见问题
RAG 里的 R 和 G 分别指什么,数据领域更该关注哪个?
R 是检索(Retrieval),G 是生成(Generation),中间的 A 是增强(Augmented)。数据领域的大部分工作集中在检索这一段:数据怎么整理、怎么切、怎么入库、怎么被召回来。生成段更偏模型和提示词的事。所以做数据的人看到 RAG,先想检索链路。
RAG 和直接把资料贴进对话有什么区别?
贴进上下文受长度限制,资料一多就塞不下,而且每次都要重新贴。RAG 是把资料预先处理好存起来,问的时候按需捞相关片段。资料量小、几乎不变,直接贴更省事;资料量大、经常更新、需要标出处,才轮到 RAG 发挥。
数据集不大,还有必要上 RAG 吗?
看你问的问题类型。如果答案分散在多份文档里、需要指出出处、文档还会更新,即使量不大也值得做。如果就几页固定内容,每次问法也差不多,直接做成提示词模板或塞进上下文更简单,维护成本低得多。
数据已经进了向量库,回答还是不准,先查哪一步?
先确认检索出来的片段里到底有没有正确答案。有,说明问题在生成或提示词;没有,说明问题在进料、切块或嵌入。这一步分不清,后面调什么都是碰运气。建议固定一小批问题和对应的标准片段,每次改完都跑一遍。
RAG 和微调在数据准备上有什么不同?
RAG 要的是可检索的片段和元数据,重点是覆盖面、切块合理、来源可追。微调要的是成对的输入输出样本,重点是标注质量和数量。两者的数据格式、清洗方式、迭代节奏都不一样,别指望同一份数据两边通用。