跳到正文

RAG 流程:检索、融合、生成

检索增强生成各环节详解:检索、融合、生成

原题:请详细描述RAG(检索增强生成)的完整技术流程,包括各个关键环节的功能和实现方式

重排与优化 · AIlab真题

30 秒回答

  1. 离线知识库构建流程(文档解析、分块、向量化、索引存储)
  2. 在线检索流程(Query改写、向量检索、重排序)
  3. 生成阶段(上下文拼接、Prompt工程、答案生成)
  4. 各环节的关键技术选型与权衡(分块策略、Embedding模型、检索算法)

回答与解析

答案要点

  • 离线知识库构建流程(文档解析、分块、向量化、索引存储)
  • 在线检索流程(Query改写、向量检索、重排序)
  • 生成阶段(上下文拼接、Prompt工程、答案生成)
  • 各环节的关键技术选型与权衡(分块策略、Embedding模型、检索算法)

RAG完整流程分为离线构建在线推理两大阶段:

一、离线知识库构建

  • 文档解析:处理PDF/Word/网页等多格式,提取干净文本(注意表格、图片OCR)
  • 文本分块(Chunking):按固定长度、语义段落或递归方式切分;块大小通常256-512 token,需保留上下文重叠
  • 向量化(Embedding):用BGE、M3E等模型将文本转为稠密向量;关键:领域数据建议微调Embedding模型
  • 索引存储:写入Milvus/Faiss/Elasticsearch等向量数据库,可配合稀疏索引(BM25)做混合检索

二、在线检索流程

  • Query理解:query改写、扩展(HyDE生成伪文档)、意图识别
  • 向量检索:ANN近似最近邻搜索,召回Top-K(通常20-100个)
  • 重排序(Rerank):用Cross-Encoder(如BGE-Reranker)精排,选出最相关的3-5个送入LLM

三、生成阶段

  • 上下文拼接:将检索结果按相关性排序,拼接为上下文
  • Prompt工程:明确指令"基于以下参考信息回答,若信息不足请说明"
  • 答案生成:LLM生成最终回复,可加入引用溯源

关键优化点

环节 常见问题 解决思路
检索 召回不足/噪声多 混合检索、元数据过滤、查询扩展
生成 幻觉、不遵循上下文 引用约束生成、细粒度Prompt、COT提示
端到端 延迟高 检索缓存、流式生成、异步预检索

口语版讲法(约4分钟)

  • RAG本质是给LLM配外挂知识库
  • 离线建库:分块粒度与混合索引
  • 在线检索:从Query改写到底层召回策略
  • 生成阶段:Prompt约束与幻觉管控
  • 落地权衡:场景决定方案选择

这道题问的是RAG的完整流程,但我觉得面试官更想听的不是我背一遍流程,而是我有没有真正踩过坑,知道每个环节为什么这么设计。说白了,RAG的本质就是给大模型配一个外挂知识库,让它别再胡编乱造。那这个外挂怎么建、怎么查、怎么用,我分三个阶段来拆解。

先说离线建库。这一步的核心矛盾是:知识颗粒度太粗,模型找不准;太细,又丢了上下文。比如客服场景里的退货政策,一个段落可能有三四百字,里面包含适用条件、退款时限、特殊品类限制,如果按固定512 token切,很可能把条件跟结论切到两个块里,检索时只召回后半段,模型就漏读了前置条件。所以我的做法是优先按语义段落切,比如Markdown标题、空行,实在不行再用递归字符切,同时保留前后重叠。分完块之后做 Embedding,这个环节有个坑:通用Embedding模型在垂直领域效果很差。比如金融风控合同里“不可抗力”这个词,通用模型可能把它跟自然灾害关联,但业务上它更多指政策变更。所以我会建议用领域数据微调Embedding,或者退一步,加上 BM25 做 Hybrid Search。索引存储我倾向用 Faiss 加 HNSW 图索引,因为它的召回率和延迟平衡得好,但如果业务需要过滤元数据,比如只查某个品类的文档,那 Elasticsearch 更灵活。

再来看在线检索。用户问“我的订单怎么还没发货”,直接拿这个query去向量检索,很可能召回的是“发货流程说明”而不是“物流异常处理”。所以第一步是Query理解:我会把query改写成更精确的表达,比如“订单延迟发货的原因和解决方案”,或者用 HyDE 先生成一段伪文档再检索。检索阶段,我通常召回 Top 50,然后用 Cross-Encoder 做 重排,把最相关的 3 到 5 个片段挑出来。这里有个关键点:重排模型必须跟向量模型解耦,否则容易陷入局部相似性。比如向量模型认为“价格”和“金额”相似,但重排模型能识别出用户问的是“满减价格”而不是“原价”。

最后是生成阶段。检索结果拼成上下文后,Prompt 怎么写直接影响回答质量。我会明确告诉模型:“如果参考信息里没有,就说不知道,不要自己编。” 同时要求它引用来源片段编号,方便溯源。但光靠Prompt不够,比如用户问“退款多久到账”,参考信息里只说了“1-3个工作日”,模型却可能脑补出“节假日顺延”。所以我会在生成后加一层 Faithfulness 校验,用另一个小模型检查答案是否严格基于检索内容。

说到这,我想提一个我最近在关注的方向:当知识库频繁更新时,离线建库和在线检索之间的延迟怎么处理。比如电商大促期间,满减政策每小时变一次,如果重建整个索引成本太高,增量更新又可能影响召回一致性。这块我目前是先把新旧版本分层存储,查询时做版本合并,但实时性还是不够理想。

所以整体上,我会把RAG看成一套需要根据场景动态调整的管线。比如客服场景,召回率比延迟更重要,我会用重排加多路召回;但如果是实时问答机器人,延迟敏感,我会牺牲一点召回率,只用向量检索加轻量级过滤。没有银弹,只有取舍。

关键一句:知识库频繁更新时,离线建库和在线检索之间的延迟与一致性平衡问题

面试官还可能这样问

  1. 问法 1 · 场景切入

    假设你在做一个电商客服机器人,用户问“昨天买的手机什么时候到”,系统需要从知识库召回物流政策。你具体会怎么把文档切碎、存起来,再召回相关片段给大模型?

  2. 问法 2 · 层层追问

    RAG 的流程你大概了解吧?……那离线阶段文档怎么处理?……分块有什么讲究?……向量化用什么模型?……在线检索怎么召回?……召回的片段怎么给 LLM 用?

  3. 问法 3 · 直球架构

    请完整描述 RAG 的技术流程,从离线构建到在线推理,每个环节的功能、实现方式和关键权衡。

同模块相关题目