Skip to content

RAG 的 流程/评测/优化

一般把RAG拆成 数据处理、检索召回、重排、生成、评测闭环 五层

第一层 数据处理

先做文档清洗、去重、结构化切分,然后给每个chunk打元数据,比如

  • 文档来源
  • 时间
  • 业务类型
  • 权限标签
  • 标题层级
  • chunk顺序

切分不会按照固定长度切,更倾向于语义块+长度上限结合,因为纯定长切片容易把一个完整的语义拆断,后面召回效果会差

语义块+长度上限结合, 可以怎么切

先利用语义切分, 利用文档天然结构,把内容拆分成语义完整单元,比如常见边界

  • 标题、段落、表格、代码块、html dom block

如果某个语义块太长,再在块内部按句子或者段落继续拆,保证每块的长度合适,相邻块之间保留少量overlap

第二层 检索召回

召回一般做混合检索

  • 向量召回语义相近内容
  • BM25召回关键词强匹配内容

第三层 重排

召回出来的候选通常比较粗,所以加rerank

原因是向量检索更适合“快速粗筛”,但它对细粒度相关性判断不够稳定。重排模型可以把 query 和候选文档一起看,判断谁更适合排在前面。

第四层 生成

把 top-k 的结果喂给模型时,不会无脑全塞,而是做:

  • 去重
  • 按来源可信度排序
  • 控制总 token
  • 冲突信息标记
  • 必要时加引用来源

这样能降低幻觉,也能减少无关上下文干扰。

第五层 评测闭环

检索层指标

  • Recall@k
  • Precision@k
  • MRR
  • nDCG

生成层指标

  • 是否答对
  • 是否引用到了正确证据
  • 是否有幻觉
  • 是否回答完整
  • 响应时延
  • 用户满意度

优化思路

优化 RAG,一般从 4 个方向看:

1)数据侧

  • 清洗脏数据、重复数据
  • 优化 chunk 粒度
  • 补标题、标签、时间等元信息
  • 给高质量文档更高优先级

2)召回侧

  • 混合检索替代单一路径
  • query 改写
  • 多路召回后融合
  • 按业务字段做过滤

3)重排侧

  • 调整 rerank top-k
  • 对不同业务场景用不同重排阈值
  • 对时间敏感问题,把时间信息纳入重排特征

4)生成侧

  • 限制只能基于检索结果回答
  • 没有证据时允许拒答
  • 输出附带引用
  • 对冲突内容提示不确定性

最后更新于: