把文件放进知识库,不等于模型每次都能找到正确答案。回答跑偏时,先别急着换大模型:可能是文件没解析好、片段切断了关键条件、检索没捞到证据,也可能是证据已经送到模型,但模型没有用它。
这篇用一份虚构咖啡店资料,在本机 Open WebUI 和 Ollama 上走查这些环节。我们先看“检索到什么”,再看“模型回答什么”,两件事分开判断。
先下载 RAG 知识库排错练习包,里面有可直接导入的虚构资料、测试问题、模型结果和复做说明。
一条回答经过哪些环节
RAG(检索增强生成)通常先从文件提取文字,再把文字切成片段并生成向量;提问时,系统检索相似片段,把它们放进模型上下文,最后由模型组织答复。Open WebUI 的文档也把检索内容、RAG 模板和用户问题描述为共同进入模型提示的过程。Open WebUI:RAG 工作方式
可以把故障分成四层:
| 层 | 要查的问题 | 常见现象 |
|---|---|---|
| 解析 | 文件里的关键文字有没有提取出来? | 文档预览就缺段、表格变乱、扫描件无文字 |
| 切分与索引 | 一段里是否保留了完整事实和条件?嵌入是否可用? | 片段只剩标题或半句话;改过嵌入模型却未重建索引 |
| 检索与注入 | 对当前问题,系统到底拿了哪些片段?这些片段是否进入了这次对话? | 搜不到、只找到邻近主题、知识库附件没有真正传入 |
| 生成 | 模型是否忠实使用证据,并在没有证据时承认不知道? | 有正确片段却答错、漏条件、把推测说成资料结论 |
要找“知识库答非所问”的原因,最好保留两份证据:检索结果里的原文片段,以及最后发给用户的回答。只看最终回答,分不清是检索错了还是生成错了。
用一个可复现的小样例
练习包里有虚构门店资料和测试问题,不包含真实商家信息。资料写明:
- 工作日 8:30–18:00 营业,周末休息;
- 写字楼配送半径 2 公里,仅工作日营业时段配送;
- 订单满 60 元免配送费,未满每单 5 元;
- 拿铁 26 元、美式 22 元、燕麦拿铁 30 元;
- 春节期间如何配送没有说明。
测试问题是:“周日中午能送到 1 公里外的办公室吗?订单满多少元免配送费?”以及“资料里有没有写春节期间的配送安排?”
本次实测环境
| 项目 | 实测值 |
|---|---|
| Open WebUI | 0.11.4,临时隔离数据目录 |
| Ollama | 0.35.1,本机 qwen3.8-27b:latest 负责生成 |
| 嵌入模型 | 本机缓存的 sentence-transformers/all-MiniLM-L6-v2 |
| 设备 | M1 Max、64GB、macOS 27.0.1 |
| 数据 | 仅上述虚构门店资料 |
选择本机模型,是为了在离线环境里把检索到回答的整条链跑通。本机当时没有安装专门的中文嵌入模型;这次用到的 MiniLM 只是可用缓存,不是中文生产知识库的推荐结论。Ollama 官方目前列有 embeddinggemma、qwen3-embedding 和 all-minilm 等嵌入模型;应在目标语言的真实问答集上比较召回效果,再选用。Ollama:Embeddings
两组设置的端到端结果
在 Open WebUI 中,文档切分器设为 character。第一组使用片段长度 80、重叠 0、Top-K 1;第二组改为长度 360、重叠 60、Top-K 3。Top-K 表示送入后续回答的候选数量。第二组同时改变了多个参数,所以它只能说明这组组合在当前样例里表现更好,不能证明是某一个参数单独造成提升。
| 询问 | 设置与检索 | 模型回答 | 判断 |
|---|---|---|---|
| 周日配送与免配送门槛 | 长度 80、重叠 0、Top-K 1。检索到配送片段,但文本结尾停在“超过”,且只有这一段 | 模型说资料未提及周日能否配送,也未提及免配送门槛 | 答案漏掉了资料中已有的“周末休息”和“满 60 元免配送费” |
| 同一问题 | 长度 360、重叠 60、Top-K 3。取回完整配送段、营业时间段和一段菜单信息 | 正确回答周末不配送、满 60 元免配送费 | 关键事实进入上下文,回答符合测试资料;菜单片段与此题无关 |
| 春节期间是否配送 | 同一组较大片段和 Top-K 3。检索到配送说明,也混入活动、自取等无关片段 | 明确回答资料没有说明春节安排,并指出资料只写工作日营业时段配送 | 缺失信息时没有编造具体春节规则,但检索仍有噪声 |
小片段测试回答耗时 52.88 秒,报告 509 输入、194 输出 tokens;调整后回答耗时 65.17 秒,报告 699 输入、214 输出 tokens;资料外问题耗时 72.64 秒,报告 696 输入、278 输出 tokens。这里的时间包括本机 Open WebUI 的检索和生成请求,受模型热启动状态、系统负载等影响,不能当成不同机器的速度承诺。完整的检索片段与输出保存在练习包的实测 JSON 中。
这组结果不能简单归因于“检索错了”。短片段组确实在配送段尾部截断,但已取回的文本里包含免配送门槛;模型仍说资料没写,说明它也没有用好已检索到的证据。调整多项参数后,配送和营业时间段都进入上下文,回答变正确了。由于分块、重叠和 Top-K 同时变化,这次对照无法判断是哪一项单独起作用。
另一个现象是候选片段会带来噪声。Top-K 增大后,关键内容被召回,也把菜单片段带进来。Top-K 不是越大越好;应逐步增加,确认答案所需事实都在,再留意额外片段是否开始干扰模型。
按顺序排查
1. 先确认文件解析结果
在知识库里打开文件,核对关键事实、数字、表格和标题是否都能看到。扫描 PDF、图片表格、复杂 Word 的解析结果要单独检查;如果提取阶段就丢了文字,后续调向量检索补不回来。
也检查文件处理状态。通过 API 上传文件后,Open WebUI 会在后台处理;官方故障排查说明,处理完成前就把文件加进知识库可能遇到“内容为空”的竞态。先等文件状态变成 completed,再加入知识库。Open WebUI:文件处理状态排查
2. 检查切分有没有把事实拆散
不要把“片段长度”理解成越小越精准。若一句规则被截成“周末休息”与“没有配送服务”两个不相邻的片段,单独命中其中之一时,模型可能看不到完整条件。
可以先保留 Markdown 标题和自然段,再检查片段边界。Open WebUI 支持按 Markdown 标题切分,也有最小片段合并设置;固定长度切分则可以适当增加片段长度与重叠。每次修改后都用同一组问题查看实际片段,不要只凭参数名字判断效果。Open WebUI:分块设置
3. 把检索和回答拆开测
先用一条资料中明确存在的问题,再用一条资料没有提到的问题:
- 已知答案题:资料明确写了规则,检查检索片段有没有包含完整规则;
- 条件组合题:把时间、范围、价格等条件放在同一个问题里,检查需要的片段是否都被召回;
- 资料外问题:检查模型能否说“资料没有说明”,而不是用常识补全。
如果片段里没有答案,先看文档切分、嵌入模型、检索数量和关键词检索;如果正确片段已经出现而回答仍错误,再检查上下文是否注入、模型是否遵守提示,以及模型上下文长度。
4. 根据资料类型再调召回
语义相近的问题适合向量检索;订单号、产品型号、法规条款、专有名词等精确词,单靠语义相似度可能漏掉。Open WebUI 的增强 RAG 可结合 BM25 关键词搜索,并提供基于 CrossEncoder 的重排。适合先保留当前向量检索基线,再开启混合检索,比较同一批问题的召回片段与最终回答;没有做过对照前,不要把“开了重排”当作质量保证。Open WebUI:增强 RAG BM25 权重配置
5. 确认知识库确实进入了对话
在聊天框输入井号并选择已处理完成的文件或知识库,确认附件图标出现。Open WebUI 当前的模型设置还区分 File Context 与 Builtin Tools:聊天附件可以由系统预先检索并注入;绑定到模型的知识库在 Native Function Calling 模式下可能要求模型主动调用知识工具。模型若没有工具调用能力、工具类别被关掉,或系统提示没有要求先查知识库,就可能“看起来绑定了,实际没查”。小文档可切到完整文档模式做对照,但要确保内容能放进模型上下文。Open WebUI:File Context 与知识库工具 Open WebUI:模型未使用知识库的排查步骤
更换嵌入模型后别忘了重建索引
嵌入模型把文本映射到向量空间。换模型后,旧向量与新查询向量可能不兼容;Open WebUI 官方要求更换嵌入模型后重新索引知识库。只调整片段长度时,新上传文件会用新设置,旧文件可能保留原切分;为了让同一知识库保持一致,也应重新索引。重新索引会重新切分并计算向量,较大的资料库需要预留时间和算力。Open WebUI:更改 RAG 设置后的重建要求
一页排错清单
- 文件正文有没有完整提取?
- 文件处理是否完成,附件是否选进当前对话?
- 检索结果里有没有回答问题所需的完整事实?
- 片段是不是太短,标题、数字或条件被拆开?
- Top-K 增加后是否找回关键信息,也带来无关内容?
- 精确词是否需要 BM25 混合检索;候选太多时是否值得评估重排?
- 正确片段已出现但回答仍错:模型是否真的收到上下文、是否能调用知识库工具?
- 换过嵌入模型或切分参数后,是否重建了索引?
先看证据片段,再调整检索;确认检索没问题,最后才换生成模型。 本次实测只覆盖一份短小的虚构门店资料,没有比较不同嵌入模型,也没有启用 BM25 或重排。生产知识库还需要用真实业务问题集逐项回归。
更多 Agent 基础可接着看《工具调用(Function Calling)原理和常见失败》。
封面及练习数据为 AI 辅助制作的虚构示例。