Skip to content
All notes

RAG

归纳 RAG 的文档处理、检索、生成和评估流程。

RAG

完整流程

离线:接入文档 → 解析清洗 → 分块 → 构建索引。

在线:理解查询 → 检索 → 按需重排 → 组装上下文 → 生成并引用来源。

检索可以使用关键词、向量或两者结合。混合检索合并不同召回结果;后续去重、筛选并控制上下文长度。评估要能定位是数据、检索还是生成出了问题。

文档解析与分块

保留标题层级、段落、表格和代码结构,去掉页眉页脚、乱码等噪声。按文档边界切分,必要时再按长度递归拆分,避免切断完整语义。

块太小会丢上下文,块太大会混入无关内容;overlap 能缓解边界损失,但会增加索引和召回重复。粒度应根据文档类型、模型限制和实际检索效果调整。

每块保留文档 ID、标题、章节、页码、顺序、来源、时间和权限等必要元数据。原文、分块结果和索引应能对应,方便溯源及重建。

Embedding 与模型选择

Embedding 把文本映射成向量,用余弦相似度、点积等方式查找语义相近内容。相似度取决于模型的表示能力,不等于答案正确性。

选择模型时,用实际样本验证语言与领域效果,再看输入长度、向量维度、检索延迟和成本。维度更高不必然更好;查询和文档需要使用匹配的编码方式。

Milvus:Collection、分区与过滤

文档结构、索引配置相同,只是分类不同,可以先在同一个 Collection 内使用分类字段过滤。需要缩小检索范围时,再考虑分区或分区键。

  • 分类有限且稳定:可以显式指定分区。
  • 分类数量多、变化频繁:避免每类手动建一个分区;结合标量过滤或分区键评估。
  • Schema、索引、生命周期或隔离要求明显不同:考虑拆 Collection。

哪种更快取决于数据分布、过滤选择性和负载,不能仅凭“分区比 Collection 快”下结论。

查询重写

LLM 适合处理多轮指代、口语表达和省略信息,例如根据前文把“这个接口为什么慢”补成明确的接口查询。规则、词典、实体识别和轻量模型也能处理固定模式,成本更低。

只在复杂表达或召回不足时触发重写,可以减少延迟。改写不得编造接口名、时间等条件;保留原问题用于比对,必要时分别检索原问题与改写问题,再评估是否提高召回质量。

Rerank

召回先找到候选,再用更细的模型或规则排序。Cross-encoder 把查询和候选文本一起输入,能直接建模二者关系,但计算更贵,通常只处理候选集合。

重排可以结合相关性、时间和来源质量;权限是必须满足的过滤条件,不能只作为加减分项。排序后合并相邻或重复片段,控制上下文冗余。候选中没有正确材料时,重排无法补回漏召回。

怎么评估

  • 检索:关键材料是否被召回,排序和上下文是否包含噪声。
  • 回答:是否正确、回答了问题、忠实于来源,引用是否支持结论。
  • 系统:延迟、成本、用户反馈和失败类型。

固定测试集应覆盖多跳、汇总、时效性和知识缺失。检索准确但答案差时,继续检查上下文组织、提示词和生成环节。