夜雨聆风学习资料网

ARTICLE · 1226341

一张Excel表,我们的RAG答错了7次

一张Excel表,我们的RAG答错了7次

「企业开办需要带什么材料?」

AI 答得又快又稳:身份证、营业执照,3 个工作日。

前两个是对的。第三个是隔壁行的办理时限,串到这儿来了。

这是我们第 7 次问同一个问题。中间我们换过提示词、调过 top-k、加过 rerank,答案变来变去,唯一没变的就是那个「3 个工作日」。它顽固得像刻进模型里似的。

最后我们打开原始文件,找到了源头。那是一张 Excel,四列,二十几行,长得跟我每年填的报销单差不多朴素。

一、表格转文本,丢的不是内容,是关系

那张表大概长这样(已脱敏,结构示意):

事项类型
申请材料
办理时限
窗口电话
企业开办
身份证、营业执照
3 个工作日
027-xxxx
食品经营许可
申请表、场地证明
5 个工作日
027-xxxx

我们第一版的处理特别「标准」:Excel 转成一串文本,按段落切 chunk。切完是这样一坨:

申请材料 办理时限 窗口电话 身份证 3 个工作日 027-xxxx 申请表 场地证明 5 个工作日 027-xxxx

你盯着这行字看一分钟,你也不知道「5 个工作日」是给谁的。模型更不知道。

这里有个反直觉的地方:表格被拍扁成文本以后,字一个都没少,行和列的对应关系却全没了。检索阶段它照样能被召回——毕竟「企业开办」「身份证」这些关键词都在里面。可一旦进了上下文,模型拿到的是一串没有结构的词,它只能猜。最要命的是它猜错了还不知道,语气还特别肯定。

RAG 最恶心的地方就在这儿:它很少说「我不知道」,它给你一个看起来很像答案的东西。

二、同一张表,我们切了三遍

我们后来做了个笨实验:同一份数据,只改切片方式,其余全部不动,用业务方出的 50 道题测(判分由窗口经办人做,不由工程师做)。

第一种:整表一个 chunk。
关系最完整,但表一大就超长,检索粒度也太粗——问一件具体的事,把 20 多行全塞进上下文,模型自己都得挑花眼。50 题对了 20 道。

第二种:一行一个 chunk,列名塞进 metadata。
这招看着最「结构化」,我们当时觉得稳了。结果只对了 22 道,还多出一类新毛病:表里有,模型偏说「未找到相关信息」。

原因很实在:一行就几十个字,embedding 拿到的上下文太薄,向量漂得厉害,检索阶段压根没召回来。生成阶段再聪明也没用,它根本没看见。

顺带纠正一个流传很广的误解:metadata 只对过滤有用,对召回没用。你可以用「事项类型=企业开办」去筛,但语义匹配看的是正文。把列名锁进 metadata,等于把最关键的语义信息放进了模型看不见的抽屉。

第三种:一个完整事项一块,表头复述进正文。
把列名和这一行拼起来,写成一句人话:

企业开办事项,申请材料为身份证、营业执照,办理时限 3 个工作日,咨询电话 027-xxxx。

单块控制在 200-300 字。50 题对了 41 道。

三轮下来:40% → 44% → 82%。

82% 不算漂亮。剩下的 18% 里,有相当一部分是文档本身就没写明白的——比如「这个证明到底要不要开」,连窗口自己人都说不清,AI 更说不清。这部分别硬凑,凑不出来。

三、四个只有踩过才信的细节

1. 表头必须写进正文,不能只写进 metadata。
上面已经说过一遍。值得再说一遍,因为这是最容易被「看起来很专业」的方案骗过去的地方。

2. 合并单元格和跨页表,先还原成「完整行」。
跨页表最阴。页与页之间一切断,第二页那几行就只剩值、没有列名,症状跟上面一模一样。我们的处理是按表头重新拼接,而不是按页切。合并单元格要展开,把「3 个工作日」这种值跟它的列名绑死,别让它裸奔。

3. 清洗只做减法,不要顺手润色。
数字、单位、否定词、「仅限」「除外」「自xx日起」,这些限定词一个字都不能为了读着顺而改掉。制度条款里每个限定词都有业务含义。

我听过一个同行的项目:有人嫌「申请材料:仅限本市户籍」读着别扭,改成「申请材料:本市户籍」,四个字,「仅限」没了。后来真有非本市户籍的市民拿着 AI 的回答跑到窗口,闹了一场不大不小的投诉。这个故事我每次给新人做培训都讲,因为它特别能说明问题——模型不会替你保守,它只会替你放大。

4. 每块都要挂元数据,而且要挂全。
文件名、版本号、生效/失效日期、密级、页码或行号、章节路径。少了这些,你没法在检索时做权限过滤,也没法在答案末尾给出「可点开核对」的引用来源。而「能不能核对」,是业务方愿不愿意用你这系统的分水岭。

四、一份可以直接抄的切片规则

· 小表(10 行以内):整表成一块,表头复述进正文
· 大表:按行拆,每行 = 表头 + 该行,控制在 200-300 字
· 合并单元格:展开成「列名=值」的完整对
· 跨页表:按表头重拼,绝不按页切
· 每块挂 metadata:文件名、版本、生效日期、密级、页码/行号
· 数字、单位、否定词、限定词:原样保留,一个字不改
· 验收:业务方出 50 道题,业务方判分,低于 70% 不许上线

最后那条最容易被砍。但我劝你守住——让工程师给自己的检索效果打分,等于让考生自己批卷子。

五、这笔账到底值不值

我们那个项目,847 份文档,洗了三周,21 天。其中表格结构化和返工就占掉 11 天。这 11 天里,模型一行代码没改,架构一个模块没动,三个人就对着表格死磕。

同期有个对照组:同样的数据,不洗直接入库,招人调了两周检索策略,准确率 40% → 51%。洗完数据,82%。

所以我的结论很粗暴:在脏数据上调参,是在给错误买单,而且这单越买越贵。

再说个更现实的账。那个项目合同额 156 万,数据清洗占掉大约三分之一的工期和人力。投标方案里「数据治理」四个字,评委看着觉得这家考虑周全。真干起来才知道,这四个字底下是几百份文档的人肉清洗,是 298 份 2019 年那台老扫描仪扫出来的 200DPI 歪脖子扫描件,是 156 份谁也说不清哪个是终稿的重复文档,是 8 份文件头坏了根本打不开的死文件。

六、别把「一键入库」当成免责声明

现在市面上不少平台宣传「拖进去就能用」。这话对干净的数字文档是成立的。真实的政企文档不是那样的。

我不反对买平台,我反对的是把平台的「一键入库」当成免责声明。出了事,平台会说你的数据有问题——它没错,确实有问题。可到了那时候,背锅的是你,不是平台。

数据治理不是上线前的准备工作。它本身就是交付物的一部分,是应该写进合同、排进工期、算进报价的那一部分。

模型负责把话说漂亮,
切片决定这话是不是真的。

数据说明

本文案例数据为脱敏后的项目口径与行业经验值整理,供方法参考,不构成对任何具体企业的描述;表格与切片示例均为结构示意,不对应任何真实文件。文中比率型指标受语料类型、测试集规模与判分口径影响,跨项目不可直接横向比较。

主要参考资料:《847份文档里298份是扫描件:打败RAG的从来不是模型,是人类杂乱无章的原始数据》(夜雨聆风);《企业知识库「垃圾进垃圾出」治理:RAG 数据质量 5 步法》(环曜);《RAG 知识库数据集构建:一份从文档到高质量语料的完整工程手册》。

相关学习资料