RAG 的完整流程是怎么样的?
RAG 的完整流程是怎么样的?
这道题考的是 RAG 整个系统的全链路理解,从离线建库到在线查询生成的完整闭环。面试官想看你能不能把"文档怎么变成知识库、用户提问怎么得到准确回答"这件事讲清楚。
我从四个方面来讲:先说 RAG 分为哪两个大阶段,然后拆解离线建库的四步流程,接着讲在线查询生成的六步流程,最后说下 RAG 的演进路线和面试加分点。
RAG 两大阶段:离线建库和在线生成
RAG 整个系统分成两个完全不同的阶段。
离线阶段,就是提前把知识库建好。你有一堆文档,要让计算机能理解、能检索,这个过程是一次性的、预先完成的。就像图书馆先把书籍编目整理好,上架排好,用户来之前一切就绪了。
在线阶段,是用户真的来提问了。系统要实时理解问题、去知识库里找相关答案、大模型生成回答。这部分每次查询都要做,对延迟敏感。
[RAG 两阶段架构图]
- 左侧离线阶段:文档 → 切分 → 向量化 → 入库
- 右侧在线阶段:问题 → 检索 → 生成 → 回答
记住这个划分很重要。面试的时候先把这个框架摆出来,面试官就知道你对 RAG 有全局认知了。
离线阶段:知识库构建四步流程
离线阶段干的事情,总结起来就是四步:文档解析 → 文本切分 → 向量化 → 存入向量数据库。
第一步:文档解析
这一步是把各种格式的文档(PDF、Word、HTML)转成纯文本。PDF 解析是个坑,有些是扫描件还需要 OCR。结构化文档(表格、标题层级)解析更难,有时候需要特殊处理保留原文结构信息。
实际工作中,这一步用 pdfminer、pymupdf 这些工具,或者直接调用商业 API。
第二步:文本切分
这是离线阶段最核心的环节。你的文档很长,但喂给向量化模型的输入有长度限制(通常 512 或 1024 个 token)。所以要把文本切成一块一块的,每块叫一个 Chunk。
[RAG 两阶段架构图]
切分策略有四种:
固定长度切分。直接按字数或 token 数硬切,简单粗暴。问题很明显,一句话可能被拦腰砍断,语义不完整。
句子级别切分。按句号、换行符切,语义完整性好一些。但有时候段落里的两句相关性很强,分开反而不好。
段落级别切分。按段落切,语义完整性最好。但段落长短不一,长的可能超过模型限制。
递归切分。先按大段落切,超长了就递归细分,结合了段落完整性和长度控制。
还有一个重要概念:父子分块策略。大块叫 Parent Chunk,小块叫 Child Chunk。检索时用小块(精确),但找到小块后关联回大块(完整上下文)。
打个比方:切分就像切蛋糕。蛋糕太大塞不进盘子,切太小又吃不出味道,还丢了奶油和夹心。好的切分策略是在保证能"吃"的前提下,保留最多的"风味"。
第三步:向量化编码
切好的每个 Chunk,用 Embedding 模型转成向量。这个向量就是这 chunk 的"语义身份证",意思是意思相近的内容,向量也相近。
常用模型有 BERT 系列、Text2Vec、Sentence-BERT 等等。向量维度通常是 768 或 1024 维。
第四步:存入向量数据库
向量 + 原始文本(metadata)一起存进向量数据库。常见选择是 Milvus、Pinecone、Chroma、FAISS 等等。
这一步的关键是建立索引,决定了后面检索的速度。向量数据库会建 HNSW、IVF 之类的索引,加速最近邻搜索。
在线阶段:查询与生成六步流程
用户来提问了,系统要实时响应。这个过程分六步:
Query预处理 → 向量检索 → 混合检索 → Rerank重排 → Prompt组装 → LLM生成
第一步:Query 预处理
用户输入的问题往往比较口语化、碎片化。预处理要做几件事:
- 同义词替换,把"电脑"和"计算机"统一
- 拼写纠错
- 查询扩展,加上相关概念
- 如果是多轮对话,还要把历史上下文拼进来
第二步:向量检索
把预处理后的问题向量化,用余弦相似度或内积,在向量数据库里找最相似的 Top-K 个 Chunk。
这里 K 的选择有讲究。太小可能漏掉相关内容,太大又引入噪声。常见取 5-20 个。
第三步:混合检索
向量检索有局限——它擅长语义相似,但搜"具体人名"、"精确数字"就不行了。
混合检索就是同时跑向量检索和关键词检索(BM25),再把结果合并。关键词检索用倒排索引,精确匹配能力强。两路结果取并集或加权合并,兼顾语义和精确。
这一步是 Advanced RAG 的标配优化。
第四步:Rerank 重排
[RAG 两阶段架构图]
这是最容易被忽视但很关键的一步。
向量检索是"粗排",在海量向量里快速筛选候选集。它用的是 ANN(近似最近邻),追求速度,牺牲了一点精度。
Rerank 是"精排",把粗排出来的 Top-K 结果,再用 Cross-Encoder 重新打分排序。Cross-Encoder 把 query 和 document 一起喂进模型,输出相关性分数,比向量检索的两阶段编码准得多。
类比一下:粗排像在图书馆书架上快速扫一遍,找到可能相关的 20 本书。精排像把这 20 本书一本本翻开,看目录、读前言,确认是不是真的相关。
Rerank 模型常用 Cross-Encoder 架构,比如 Cross-Encoder/ms-marco 系列。代价是延迟高,所以只对粗排出来的少量结果做精排。
第五步:Prompt 组装
[RAG 两阶段架构图]
拿到了最相关的几个 Chunk,把它们和问题拼成 Prompt。
典型的 RAG Prompt 模板:
基于以下参考内容回答问题。如果内容不相关,就说不知道。
参考内容:
{chunk1}
{chunk2}
{chunk3}
问题:{query}
这一步还要注意:Chunk 太多可能超过上下文窗口限制,所以要做截断或筛选。
第六步:LLM 生成
[RAG 两阶段架构图]
把组装好的 Prompt 发给 LLM(大语言模型),生成最终回答。
模型选择看场景:闭源 API(GPT-4、Claude)效果好但花钱,自部署(Llama、Qwen)省钱但效果打折。
RAG 演进路线和面试加分点
[RAG 两阶段架构图]
RAG 技术经历了三代进化:
Naive RAG。最基础的形态:切分 → 向量化 → 存库 → 检索 → 组装 → 生成。有什么用什么,没有优化,容易出现检索质量差、幻觉多的问题。
Advanced RAG。在 Naive 基础上加优化:Query 改写、混合检索、Rerank、结果缓存、迭代检索。看病先做检查,精准定位再开药。
Agentic RAG。更进一步的智能化:让 Agent 决定要不要 RAG、查哪个知识库、查几次、结果够不够用。相当于给 RAG 装上了大脑,可以自主决策。
面试加分点说几个:
Hybrid Search。向量检索 + BM25 双路并行的思路,体现你对检索优化的理解。
Rerank 模型选型。Cross-Encoder 的原理和使用场景,面试官经常追问。
评估指标。RAGAS、Recall@K、MRR、幻觉率这些指标,反映你对系统效果衡量的认知。
面试怎么答
基础版(可以直接背):
RAG 分离线建库和在线查询两个阶段。离线阶段有四步:文档解析、文本切分、向量化、存入向量库。其中文本切分最关键,常见策略有固定长度、句子级、段落级、递归切分,还有父子分块保证上下文完整性。在线阶段有六步:Query 预处理、向量检索、混合检索、Rerank 重排、Prompt 组装、LLM 生成。Rerank 用 Cross-Encoder 对粗排结果精排,是提升检索质量的关键环节。
加分版(拉开差距):
基础流程之外,我了解几个优化点。混合检索结合向量检索和 BM25,兼顾语义和精确匹配。Rerank 用 Cross-Encoder 精排,比向量检索的两阶段编码更准。RAG 从 Naive RAG 演进到 Advanced RAG 再到 Agentic RAG,核心区别是检索策略的智能程度。我之前做过一个 RAG 系统,用的是递归切分加父子分块,配合混合检索加 Rerank,召回率从 60% 提到了 82%。
一句话总结
RAG 就是把文档离线切成 chunk 并向量化存储,查询时实时检索相关 chunk 并让大模型基于 context 生成回答。
