跳到主要内容

RAG

RAG(Retrieval-Augmented Generation)让模型在回答前先检索外部资料,例如文档、知识库或网页内容。当效果不对时,问题往往不是模型“太笨”,而是上下文没有被正确提取、索引或注入

本页整理最常见的 RAG 问题与处理方式。


按场景推荐的基础设置

RAG 的效果高度依赖模型能力与上下文预算。默认值偏保守,适合“到处都能跑”,但未必适合你的生产环境。

本地小上下文模型(≤ 8K)

适合 Ollama 等本地模型:

设置建议值原因
Text Splittertoken用 token 控制 chunk 更稳定
Markdown Header Splitting尽量保留结构
Chunk Size1000更适合小上下文窗口
Chunk Overlap100常规重叠
Top K3–5避免一次塞太多内容
Full Context Mode通常塞不下整篇

云模型 / 大上下文模型(32K+)

设置建议值原因
Text Splittertoken一致的 chunk 控制
Markdown Header Splitting保留结构
Chunk Size2000每次检索保留更多上下文
Chunk Overlap200降低截断句子风险
Top K15–25大上下文可以承受更多命中
Full Context Mode小文档可考虑对中小文档常常更直接有效

混合环境(本地 + 云)

如果你同时使用本地和云模型,建议先采用折中设置,再按模型覆盖:

设置建议值
Chunk Size1500
Chunk Overlap200
Top K10

Embedding 模型建议

场景建议原因
单用户 / 快速上手all-MiniLM-L6-v2默认可本地运行
多用户且有 Ollamanomic-embed-text可把 embedding 压力转给 Ollama
生产环境且有预算text-embedding-3-small性价比较高
自托管 / 无外网nomic-embed-textmxbai-embed-large不依赖外部 API

更换 embedding 模型后,记得重建已有文档索引


常见问题

0. 组织迁移后检索结果错乱或缺文档

如果启用了组织,检索问题有时其实是资源归属同步问题,而不是 embedding 质量问题。

处理方式:

  • 检查当前组织的文件和文档状态
  • 修复 pending 的 file / vector ownership repair
  • 如果用了 Qdrant 等外部向量库,先完成 tenant metadata 迁移
  • 遇到组织拆分、迁移或大规模 rollout 后,优先参照 组织维护

1. 模型“看不到”你的内容

最常见根因是内容提取阶段就出了问题

处理方式:

  • 打开 Admin Settings > Documents
  • 检查当前 content extraction engine
  • 尝试预览抽取后的文本,看是否为空或明显缺段
  • 必要时改用 Apache Tika、Docling 或更适合你文档类型的提取器

2. 只用到了文档的一小部分

默认配置会尽量兼容小上下文模型,因此会很积极地裁剪检索结果。

处理方式:

  • Admin Settings > Documents 中:
    • 启用 Bypass Embedding and Retrieval
    • 或启用 Full Context Mode
注意

如果模型本身上下文不够大,即使启用了 Full Context,也仍然可能被上游模型端截断。

3. Token 上限太小

很多本地模型默认只有 2048 token,上网页或长文档时很快就不够。

处理方式:

  • 对 Ollama / 本地模型,提高模型上下文长度
  • 对云模型,确认你用的是上下文更大的型号
  • 做 web search / 长文档时,尽量使用 8K 以上、最好 16K 以上的上下文窗口

4. Embedding 模型质量差或不匹配

embedding 质量差,RAG 就会在“检错内容”这一步直接失败。

处理方式:

  • 切换到质量更好的 embedding 模型
  • 然后重建索引

5. NoneType has no attribute encode

这通常表示 embedding 模型未正确配置或不可达。

处理方式:

  • Admin Settings > Documents > Embedding Model
  • 重新保存一次 embedding 配置
  • 如果是远程 embedding 服务,确认服务真的在线且 OPL 数据空间能访问到

5. 400: NoneType object has no attribute encode

这类报错通常就是上一节提到的 embedding 配置缺失或失效。排查时优先重新保存 embedding model,并确认远端服务可达。

6. 上传限制与限制差异

需要注意聊天上传、Folder 上传和 Knowledge Base 上传的限制并不完全一样:

  • 聊天上传受 RAG_FILE_MAX_SIZE / RAG_FILE_MAX_COUNT / RAG_ALLOWED_FILE_EXTENSIONS 控制
  • Folder 上传受 FOLDER_MAX_FILE_COUNT 控制
  • Knowledge Base 上传通常不受 RAG_FILE_MAX_COUNT 限制

7. Chunk 过碎

Markdown Header Splitter 有时会把文档切得过细,导致语义不足。

处理方式:

  • 增大 Chunk Min Size Target
  • 常见做法是设成 1000CHUNK_SIZE 的 50% 到 60%

8. 后续追问越来越慢

这通常是 KV cache 被频繁打失效了。

处理方式:

RAG_SYSTEM_CONTEXT=True

这样 RAG 上下文会进入 system message,而不是不断插到 user message 中,更利于模型或云服务做 prefix cache / prompt cache。

10. CUDA 内存不足

如果 embedding 或 reranking 过程中出现 CUDA OOM,优先考虑:

  • 改用更小的 embedding 模型
  • 把 embedding 挪到 CPU 或外部服务
  • 降低并发与批量处理规模

12. 文档上传时 worker 崩溃

如果上传文档时 worker 直接退出,通常要优先检查:

  • 是否在多 worker / 多副本下仍使用本地 SQLite-backed Chroma
  • 是否应切到外部向量库或 Chroma HTTP 模式

这类问题通常和 多副本排障 中的向量库限制一起出现。

13. 模型绑定的知识库不生效

如果你把知识库绑定到模型后仍然检索不到内容,优先检查:

  • 文档是否完成索引
  • 当前组织 / 当前用户是否对该知识库有可见权限
  • embedding 模型是否变更后却没有重建索引

问题处理方式
模型看不到内容检查抽取器和抽取结果
只用了部分内容开 Full Context 或 Bypass Embedding
上下文不够增大模型上下文或换大上下文模型
检索不准换更好的 embedding 并重建索引
文件太多太碎调整上传限制和 Chunk Min Size