跳到正文

RAG 流程优化:检索与重排陷阱

检索增强生成各环节优化策略,含检索、生成与重排

原题:请描述RAG(检索增强生成)系统的完整流程,并针对每个环节提出具体的优化策略和方法。

重排与优化 · 虾皮真题

30 秒回答

  1. 完整描述RAG的5个核心环节(文档处理、向量化、检索、重排序、生成)
  2. 每个环节至少给出2个具体优化方法
  3. 体现对实际工程问题的理解(如召回率vs精确率权衡)
  4. 提及评估和迭代闭环

回答与解析

答案要点

  • 完整描述RAG的5个核心环节(文档处理、向量化、检索、重排序、生成)
  • 每个环节至少给出2个具体优化方法
  • 体现对实际工程问题的理解(如召回率vs精确率权衡)
  • 提及评估和迭代闭环

RAG系统可分为5个核心环节,每个环节的优化策略如下:

1. 文档预处理与分块

核心问题:分块粒度决定语义完整性和检索精度

  • 优化策略
    • 语义分块:用BERT等模型识别主题边界,而非固定长度
    • 层次结构:保留文档层级(标题-段落-句子),支持多粒度检索
    • 元数据增强:添加时间、来源、类别等标签用于过滤

2. Embedding与向量化

核心问题:领域适配和表征质量

  • 优化策略
    • 领域微调:用对比学习在业务数据上微调Embedding模型
    • 多向量表征:一个文档生成多个向量(摘要、关键词、详细内容)
    • 稀疏-稠密混合:结合BM25和向量检索的优势

3. 向量检索

核心问题:召回率和延迟的权衡

  • 优化策略
    • 索引优化:HNSW参数调优(ef_construction/ef_search),IVF-PQ量化降维
    • 多路召回:向量检索 + 关键词检索 + 知识图谱并行召回
    • 查询扩展:用LLM生成同义查询,提升覆盖度

4. 重排序(Rerank)

核心问题:粗排结果精化

  • 优化策略
    • 交叉编码器:用ColBERT等模型计算查询-文档细粒度交互
    • 多任务学习:联合优化相关性、时效性、权威性
    • 反馈学习:根据用户点击行为在线优化排序模型

5. 生成与后处理

核心问题:幻觉控制和答案质量

  • 优化策略
    • 上下文压缩:用LLM提取检索文档的关键片段,减少噪声
    • 引用溯源:要求模型标注答案来源,便于事实核查
    • 拒绝回答:当检索置信度低时,触发"信息不足"回复

系统级优化

  • 评估闭环:建立端到端评测(答案相关性、忠实度、上下文召回率)
  • 缓存策略:热门查询结果缓存,Embedding结果预计算

口语版讲法(约4分钟)

  • 一句话定位:RAG本质是让大模型学会查资料
  • 文档预处理:语义分块和元数据增强
  • 检索环节:混合检索和查询扩展
  • 生成环节:上下文压缩和引用溯源
  • 系统级取舍:评估闭环和缓存策略

这道题问RAG的流程和优化,我觉得本质上是问:怎么让大模型在不知道答案的时候,学会自己查资料,而且查得准、用得对。很多人一上来就讲检索、生成,但真正落地你会发现,每个环节都有坑,而且没有银弹。

先说文档预处理。很多人觉得分块很简单,固定切几百个token就行了,但实际场景里,比如企业做客服知识库,退款政策和满减活动经常混在一个文档里,固定切分会把语义切碎,检索时召回一堆不相关的内容。所以我更倾向用 语义分块,就是用模型识别主题边界,比如一个政策讲完退款,下一个讲满减,那就自然分成两块。另外,我会加元数据,比如来源、更新时间、类别,这样检索时可以先过滤,比如“只查2024年后的退款政策”,效率和准确率都能提升。

然后是向量化。Embedding模型直接拿来用,在通用领域还行,但到垂直领域,比如金融合同、医疗病历,效果会明显下降。所以前提是要有领域数据,做 对比学习 微调,不然向量距离不准,检索就是空中楼阁。这里有个常见失败场景:很多人花大量时间调检索参数,但其实问题出在Embedding没对齐业务语义。

检索环节,我通常会做 混合检索,就是 BM25 关键词匹配加向量检索并行。为什么?因为向量检索擅长语义相似,但精确匹配比如订单号、错误码,它反而不如关键词。举个例子,用户问“订单12345退款到哪了”,向量检索可能找到一堆退款政策,但关键词直接命中那个订单的详情。两个结果合并后,再用 Rerank 模型精排,把最相关的那条顶上去。另外,查询扩展也很有用,比如用户说“退货”,LLM可以帮你扩展成“退货流程、退款周期、运费承担”,提高召回率。

生成阶段最大的问题是 Hallucination。我的做法是 上下文压缩,就是让LLM从检索到的文档里提取关键片段,而不是一股脑全塞进去,减少噪声干扰。同时强制要求 引用溯源,每个生成点必须标注来源段落,这样用户可以核查,也方便后续做 Faithfulness 评估。如果检索结果置信度很低,比如分数低于阈值,我会让模型直接说“信息不足”,而不是硬编答案。

整条链路跑通后,我会特别关注 评估闭环。上线前用 RAGAS 这类工具测答案相关性和忠实度,上线后埋点记录用户反馈,比如点不点赞、有没有追问,这些数据回流用来调排序权重和分块策略。另外,缓存也很关键,热门查询的结果直接缓存,能省掉70%的检索延迟。

其实还有一个延伸方向:当知识库更新频繁时,文档和向量之间的一致性怎么保证?比如政策改了,旧的文档要替换,但向量库里还有旧向量,检索时可能同时召回新旧版本,导致答案矛盾。这个场景下,我会考虑用 Parent Document 结构,保留父子关系,更新时原子级替换整个子树,再配合版本号做在线校验。

所以总的来说,RAG不是搭个流水线就行,每个环节都有前提条件和trade-off。我更倾向把RAG看成 一个持续优化的系统,而不是一次性工程,重点在数据质量和评估闭环上花功夫。

关键一句:当知识库频繁更新时,文档和向量之间的一致性保证是个棘手问题,我会用Parent Document结构和版本号做原子级替换与在线校验。

面试官还可能这样问

  1. 问法 1 · 场景切入

    我看你做过知识库问答系统,假设用户问“去年Q3的退货率是多少”,你从一堆运营文档里找答案,你会怎么设计整个流程?从文档准备到最终给出回答,具体每一步怎么做?

  2. 问法 2 · 层层追问

    RAG系统你了解吧?先说说整体流程有哪些环节……文档处理阶段你怎么切分才能保证语义不丢失?……那检索出来的结果可能很粗糙,你后续会怎么优化排序?……生成时怎么避免模型瞎编?

  3. 问法 3 · 直球架构

    请详细描述RAG系统的完整流程,包括文档预处理、向量化、检索、重排序和生成这五个环节,并且针对每个环节至少给出两个具体的优化策略。

同模块相关题目