很多人搭建RAG知识库后,会遇到一个很奇怪的问题:
文档已经成功上传,知识库也能正常检索,但用户提出问题后,系统返回的内容还是不准确。有时找不到答案,有时召回了不相关的段落,甚至文档里明明有正确内容,模型依然会答错。
出现这种情况,不一定是大模型能力不够。RAG系统的回答效果,通常取决于文档解析、切片、召回、重排和提示词等多个环节。任何一个配置不合理,都可能让知识库出现“答非所问”。
一、文档切片过长或过短
文档上传知识库后,通常不会整篇直接交给模型,而是先拆分成多个文本片段。
如果切片太长,一个片段中可能同时包含多个主题。向量化后,片段的语义不够集中,检索时容易匹配到看似相关、实际无关的内容。
如果切片太短,完整的一句话或操作步骤可能被拆开。系统虽然找到了关键词,却没有召回完整上下文,模型只能根据残缺信息回答。
例如,一份产品说明书中包含:
- 产品适用范围;
- 安装步骤;
- 参数配置;
- 常见报错;
- 售后说明。
如果这些内容被放进同一个大切片,用户询问“安装失败怎么办”时,系统可能召回整个章节,给模型带来大量无关信息。
火山引擎知识库文档也提到,切片长度需要根据文档的信息密度和上下文关联程度进行设置,不能所有文档都使用同一套切片规则。
排查时可以先查看召回的原始文本片:
如果内容过于零散,可以适当增加切片长度或拼接邻近片段;如果一个文本片包含多个主题,则应缩短切片长度,或者按照标题和段落进行切分。
二、召回文本数量设置不合理
召回数量并不是越多越好。
返回的文本片太少,可能漏掉真正包含答案的内容;返回数量太多,又会把大量相似或无关片段一起交给模型。
例如,用户只询问一个具体参数,系统却一次召回几十个片段。模型需要从大量内容中重新判断答案,不仅响应速度变慢,还可能被错误片段干扰。
比较稳妥的方法是使用一组真实问题进行测试,分别调整返回文本片数量,再观察正确内容能否稳定进入前几条结果。
火山引擎知识问答支持控制最终返回的文本片数量,也支持查看每个文本片的召回分数和重排分数。通过召回详情,可以判断问题发生在“没有找到正确内容”,还是“找到以后模型没有正确使用”。
不要只看最终回答,召回结果本身才是排查RAG问题的第一现场。
三、没有开启重排,相关片段排在后面
向量检索找到的是“语义相似”的内容,但语义相似并不一定代表能够准确回答问题。
例如,用户询问:
“账号连续输错密码后会锁定多久?”
知识库中可能同时存在以下内容:
- 密码修改方法;
- 密码安全要求;
- 登录失败处理;
- 账号锁定时间;
- 找回密码流程。
这些片段都与“密码”和“登录”相关,向量检索可能全部召回。如果真正包含锁定时间的片段排在后面,模型就可能优先参考前面的错误内容。
重排模型会重新计算用户问题与召回文本之间的相关性,再调整片段顺序。火山引擎官方文档说明,启用重排可以获得更准确的问题与文本片相似度评分,但也会增加一定检索时间,因此需要同时合理控制召回数量。
如果知识库文档数量较多,或者不同文档中存在大量相似内容,可以尝试开启重排,再对比开启前后的召回结果。
四、没有限制检索范围
企业知识库中经常同时保存多个部门、多个产品和多个版本的资料。
例如,同一个知识库中可能包含:
- 旧版操作手册;
- 新版操作手册;
- 内部测试文档;
- 客户使用说明;
- 不同产品的常见问题。
如果用户询问新版产品,但检索时没有限定文档、目录或标签,系统可能优先召回旧版本内容。
这也是很多知识库“回答看起来合理,但实际已经过期”的主要原因。
可以按照产品名称、部门、文档版本、适用地区和更新时间设置标签。用户提出问题后,先根据业务条件缩小检索范围,再进行向量检索。
火山引擎知识问答支持按文档、目录和标签筛选检索范围。相比把所有资料混在一起搜索,先进行范围过滤,通常更容易减少无关内容。
同时还要定期清理重复文档和过期版本,避免多个相似答案互相干扰。
五、提示词没有限制回答依据
即使系统已经召回正确内容,模型也不一定完全按照知识库回答。
如果提示词只写:
“请回答用户的问题。”
模型可能同时使用知识库内容和自身已有知识进行补充。一旦知识库信息不完整,模型就可能自行推测,最终生成一个听起来合理、实际没有依据的答案。
更稳妥的提示词应该明确要求:
- 只根据召回的知识库内容回答;
- 找不到答案时直接说明资料不足;
- 不允许自行编造参数、时间和数据;
- 回答时标明来源文档;
- 多个文档存在冲突时提示用户确认版本。
火山引擎知识问答支持自定义Prompt,规定模型如何使用检索到的文本,也可以设置在知识库内容无法回答时转人工处理。
提示词不能提高错误召回的质量,但可以减少模型在资料不足时继续猜测。
RAG知识库的正确排查顺序
知识库出现答非所问时,不建议一开始就更换大模型。
可以按照下面的顺序检查:
- 确认原始文档中是否真的存在答案;
- 查看文档解析后是否出现乱码或内容缺失;
- 检查正确内容是否被切分完整;
- 查看召回结果中有没有正确片段;
- 调整召回数量和重排配置;
- 使用标签限制文档范围;
- 检查提示词是否要求依据知识库回答。
如果召回结果中根本没有正确内容,问题通常出在文档、切片或者检索配置。
如果已经召回正确内容,但最终答案仍然错误,则应重点检查提示词、上下文拼接和模型回答规则。
结语
RAG知识库不是把文档上传后就能自动获得准确答案。
文档切片不合理、召回数量设置错误、没有开启重排、检索范围过大以及提示词缺少约束,都可能导致系统答非所问。
优化知识库时,不要只盯着最终回答。先查看每次检索到底召回了哪些文本片,再逐步调整配置,通常比直接更换模型更有效。
一个稳定的RAG系统,关键不是知识库里放了多少文档,而是每次提问时,能否把真正相关的内容准确交给模型。
