RAG
归纳 RAG 的文档处理、检索、生成和评估流程。
RAG
完整流程
离线:接入文档 → 解析清洗 → 分块 → 构建索引。
在线:理解查询 → 检索 → 按需重排 → 组装上下文 → 生成并引用来源。
检索可以使用关键词、向量或两者结合。混合检索合并不同召回结果;后续去重、筛选并控制上下文长度。评估要能定位是数据、检索还是生成出了问题。
文档解析与分块
保留标题层级、段落、表格和代码结构,去掉页眉页脚、乱码等噪声。按文档边界切分,必要时再按长度递归拆分,避免切断完整语义。
块太小会丢上下文,块太大会混入无关内容;overlap 能缓解边界损失,但会增加索引和召回重复。粒度应根据文档类型、模型限制和实际检索效果调整。
每块保留文档 ID、标题、章节、页码、顺序、来源、时间和权限等必要元数据。原文、分块结果和索引应能对应,方便溯源及重建。
Embedding 与模型选择
Embedding 把文本映射成向量,用余弦相似度、点积等方式查找语义相近内容。相似度取决于模型的表示能力,不等于答案正确性。
选择模型时,用实际样本验证语言与领域效果,再看输入长度、向量维度、检索延迟和成本。维度更高不必然更好;查询和文档需要使用匹配的编码方式。
Milvus:Collection、分区与过滤
文档结构、索引配置相同,只是分类不同,可以先在同一个 Collection 内使用分类字段过滤。需要缩小检索范围时,再考虑分区或分区键。
- 分类有限且稳定:可以显式指定分区。
- 分类数量多、变化频繁:避免每类手动建一个分区;结合标量过滤或分区键评估。
- Schema、索引、生命周期或隔离要求明显不同:考虑拆 Collection。
哪种更快取决于数据分布、过滤选择性和负载,不能仅凭“分区比 Collection 快”下结论。
查询重写
LLM 适合处理多轮指代、口语表达和省略信息,例如根据前文把“这个接口为什么慢”补成明确的接口查询。规则、词典、实体识别和轻量模型也能处理固定模式,成本更低。
只在复杂表达或召回不足时触发重写,可以减少延迟。改写不得编造接口名、时间等条件;保留原问题用于比对,必要时分别检索原问题与改写问题,再评估是否提高召回质量。
Rerank
召回先找到候选,再用更细的模型或规则排序。Cross-encoder 把查询和候选文本一起输入,能直接建模二者关系,但计算更贵,通常只处理候选集合。
重排可以结合相关性、时间和来源质量;权限是必须满足的过滤条件,不能只作为加减分项。排序后合并相邻或重复片段,控制上下文冗余。候选中没有正确材料时,重排无法补回漏召回。
怎么评估
- 检索:关键材料是否被召回,排序和上下文是否包含噪声。
- 回答:是否正确、回答了问题、忠实于来源,引用是否支持结论。
- 系统:延迟、成本、用户反馈和失败类型。
固定测试集应覆盖多跳、汇总、时效性和知识缺失。检索准确但答案差时,继续检查上下文组织、提示词和生成环节。