RAG 流程图#
RAG 拆成两个独立流程:
- 入库流程
- 查询流程
总览#
入库流程#
入库步骤说明#
- 判断文件类型,根据不同文件类型选择对应的 Loader。
- 加载文档时补充基础 metadata,至少包括源路径、文件名、文件类型。
- 初始化分割器时,不直接依赖固定
chunk_size + overlap的硬切分。 - 先按标点符号拆分成更自然的初始片段。
- 再根据前后片段的语义相似度决定是否合并。
- 合并时要控制最大
chunk_size,避免 Chunk 过大。 - 得到最终 Chunks 后,初始化向量数据库配置,例如集合名称、持久化路径等。
- 入库前使用
filter_complex_metadata清理复杂 metadata,避免 Chroma 存储失败。 - 将 Chunks 写入向量数据库,入库结束。
查询流程#
查询步骤说明#
- 先定义提示词模板,明确 LLM 的角色、允许做什么、不允许做什么。
- 必须明确要求 LLM 禁止编造文档中不存在的事实。
- 当问题与文档不相关,或者没有检索到相关信息时,直接回答“不知道”。
- 用户输入问题后,为了提高召回质量,可以保留原始问题,并额外生成多路查询改写。
- 还可以使用 HYDE,让 LLM 基于原始问题先生成一段假设性回答,再拿它参与检索。
- 检索阶段不要只依赖单一路径,建议采用混合检索:向量检索加 BM25 检索。
- 将多路召回结果合并后,再做 Rerank 重排序。
- Rerank 的目标是提升最终排序质量,减少仅靠向量相似度导致的误召回。
- 最后将重排序后的 Context 和原始问题一起交给 LLM 生成最终答案。
关键原则#
- 原始问题必须保留,不能只使用改写问题或 HYDE 内容。
- Chunk 切分优先保证语义完整,再控制长度。
- 检索优先保证召回率,重排序负责提升精度。
- 回答阶段必须以检索结果为依据,禁止脱离文档编造。