上周我干了件得意事:把公司几十份内部文档全喂进了知识库,搭了个"随问随答"的机器人,还煞有介事地在群里宣布:以后有啥制度不会查的,直接问它。
结果第二天就被打脸。同事问"出差报销流程是什么",机器人答得那叫一个流畅——分几步、找谁签字、几个工作日到账,说得有鼻子有眼。问题是,我们公司压根没有这套流程,报销还在靠钉钉吼。
这就是 RAG 最经典的翻车现场:模型不是不会答,是没东西可抄的时候,它就自己编。而编得越流畅,你越看不出来。
先把锅分清楚:不是模型的错
RAG 的原理一句话就能讲完:你提问,系统先去知识库里检索出几段最相关的原文,再把这些原文塞给大模型,让它"看着材料说话"。
所以答案全靠编的时候,锅多半不在模型——模型只是忠实地表演了"我没收到材料"这件事。检索这一环拉胯了,后面的大模型再贵也是在裸奔。
而检索这一环,真正影响成败的其实就三个旋钮:切分、召回、兜底。我一个一个说。
旋钮一:切分(Chunk)——文档不是切碎了就完事
我最初的想当然:把文档按固定长度切呗,一刀 1000 字,齐活。
实际跑起来发现两个极端都不行:
- 切太碎:一条制度被切成四五段,检索命中的往往是孤立的一小块,模型拿着半截话答题,细节全丢。你问"报销需要哪些材料",它只检索到"材料清单"那半页,前面的适用范围、后面的审批时限全没了。
- 切太大:一块塞进几千字,真正相关的两三句话被一堆无关内容淹没,模型读了半天抓不住重点,答案开始学舌原文甚至跑偏。
我最后落地的经验值:一块 500~800 字,相邻块之间保留 10%~15% 的重叠。重叠是为了让跨块的句子在两块里都完整出现,不至于被刀切走含义。
另外两个容易忽略的点:
- 表格别跟正文混切。表格被从中间切开基本就废了,一个单元格掉进两个块里,两边都读不懂。能转成文字描述的先转,不能转的整表单独成块。
- 标题和层级要跟着块走。切出来的块最好自带上下文,比如块开头带上"第五章 差旅管理办法 > 第三节 报销",不然检索时一段孤零零的"每人每天 300 元",模型根本不知道说的是住宿还是餐补。
旋钮二:召回——阈值不是拍脑袋定的
第二个坑在相似度阈值上。
平台一般会让你设一个召回阈值,低于这个分数的片段不进上下文。我心想那必须设高点,只要最相关的——结果设完发现机器人开始答非所问。
排查了半天才发现:阈值设太高,经常一个片段都召不回来。上下文是空的,模型一看,行吧,那我自由发挥——又回到张嘴就编。
正确姿势是反过来:先别急着定阈值,去召回测试里扔十几个真实业务问题,看实际命中的分数分布。你会发现相关片段的分数是个区间,不是一条线。阈值卡在"明确相关的下限"附近,而不是你想当然的"越高越好"。
还有一个提升立竿见影的开关:重排序(Rerank)。向量检索召回的是"大致相关"的一批片段,开重排序后会用一个更精细的模型把这批片段重新排一遍,把真正命中的顶到最前面。我开了之后,机器人引用错段落的次数肉眼可见地降了。
旋钮三:兜底——让它承认"不知道"
前两个旋钮拧完,准确率已经上来了,但还差最后一道保险:强制引用 + 无答案兜底。
具体就两条:
- 答案必须带出处。每条回答后面标注引自哪份文档哪个段落,同事一眼就能核对。自从加了引用,"机器人说错了"的抱怨基本消失——因为错了能立刻定位到是文档旧了还是检索歪了。
- 召不回就明说没有。在提示词里明确要求:材料里没有的内容,直接回答"文档中未提及",禁止推测。一个老老实实说"我不知道"的机器人,比一个滔滔不绝的机器人值钱十倍。
三个顺带要提的坑
坑一:文档更新了,索引不会自己更新。 我们改了版报销制度,我天真地以为知识库会自动同步——并没有。替换文档后要重新走解析和索引构建,不然机器人还在背旧版。而且新旧文档如果都在库里,它会两边都检索,答案打架。旧版本要及时下架。
坑二:别把整个网盘一股脑灌进去。 我一开始把几百份文件全导了,里面的闲聊纪要、过期的通知、重复的版本全成了噪音源。后来按"现行有效"筛了一遍,库小了一半,准确率反而涨了。知识库不是越全越好,是越"干净"越好。
坑三:多模态内容别硬跳过。 现在的知识库已经能吃文档、表格、图片甚至音视频,统一做检索和问答。我们一堆"口述出来的操作视频",之前一直没进库,转成文字+关键帧塞进去之后,答疑范围一下子宽了不少。
成本这笔账
搭这套东西的成本比我想的低不少。平台开通就送新用户免费额度,日常调优阶段基本花不到钱;真正跑起来之后的开销主要是知识库索引和模型调用的 token 费,按量走,量和答案质量成正比——检索准了,喂给模型的无效上下文少了,token 反而省。具体价格各档位不一样,以阿里云百炼官方页面实时展示为准,别信我嘴里的数字。
写在最后
回头看这三天,其实就是把一句话掰碎了悟:RAG 的上限不是模型决定的,是检索质量决定的。
切分决定"库里存的是不是完整的意思",召回决定"模型拿到的对不对题",兜底决定"它不知道的时候会不会装"。三个旋钮顺序拧下来,同一个模型,答题质量完全不是一个东西。
如果你也打算把公司文档喂给大模型,别上来就调模型、换提示词,先去召回测试里看一眼命中的片段长什么样——十有八九,问题出在你还没看过的那一环。
(以上流程全部实操自踩坑,参数是经验值不是金标准,你的文档长什么样,还得你自己拧。)

