返回文章列表

理一下RAG流程,实现一个demo

2 min read

RAG 流程图#

RAG 拆成两个独立流程:

  1. 入库流程
  2. 查询流程

总览#

入库流程#

入库步骤说明#

  1. 判断文件类型,根据不同文件类型选择对应的 Loader。
  2. 加载文档时补充基础 metadata,至少包括源路径、文件名、文件类型。
  3. 初始化分割器时,不直接依赖固定 chunk_size + overlap 的硬切分。
  4. 先按标点符号拆分成更自然的初始片段。
  5. 再根据前后片段的语义相似度决定是否合并。
  6. 合并时要控制最大 chunk_size,避免 Chunk 过大。
  7. 得到最终 Chunks 后,初始化向量数据库配置,例如集合名称、持久化路径等。
  8. 入库前使用 filter_complex_metadata 清理复杂 metadata,避免 Chroma 存储失败。
  9. 将 Chunks 写入向量数据库,入库结束。

查询流程#

查询步骤说明#

  1. 先定义提示词模板,明确 LLM 的角色、允许做什么、不允许做什么。
  2. 必须明确要求 LLM 禁止编造文档中不存在的事实。
  3. 当问题与文档不相关,或者没有检索到相关信息时,直接回答“不知道”。
  4. 用户输入问题后,为了提高召回质量,可以保留原始问题,并额外生成多路查询改写。
  5. 还可以使用 HYDE,让 LLM 基于原始问题先生成一段假设性回答,再拿它参与检索。
  6. 检索阶段不要只依赖单一路径,建议采用混合检索:向量检索加 BM25 检索。
  7. 将多路召回结果合并后,再做 Rerank 重排序。
  8. Rerank 的目标是提升最终排序质量,减少仅靠向量相似度导致的误召回。
  9. 最后将重排序后的 Context 和原始问题一起交给 LLM 生成最终答案。

关键原则#

  • 原始问题必须保留,不能只使用改写问题或 HYDE 内容。
  • Chunk 切分优先保证语义完整,再控制长度。
  • 检索优先保证召回率,重排序负责提升精度。
  • 回答阶段必须以检索结果为依据,禁止脱离文档编造。