RAG 完整详细流程(检索增强生成):原理、架构与实战

魏远标 Lv7

提问

RAG(Retrieval‑Augmented Generation,检索增强生成)的完整详细流程是什么?每个环节具体怎么做?常见变种有什么区别?

参考答案

RAG 核心思想:大模型本身知识是静态训练数据,通过外部知识库检索拿到实时私有资料,拼入 Prompt,交给 LLM 生成答案——解决幻觉、私有数据问答、知识更新三大难题。

整体分两大阶段:

  1. 索引构建阶段(离线,一次性 / 定时执行):文档入库处理
  2. 推理查询阶段(线上,用户每提问一次跑一遍):Query → 检索 → 组装 Prompt → LLM 生成

第一阶段:离线索引构建(文档处理流水线)

1
原始文档 → 文档加载 → 解析清洗 → 文本分块 → Embedding → 存入向量库

1. Document Load 文档加载

读取各种来源文件,输出原始文本。

  • 文件:PDF、docx、md、txt、excel
  • 网页:爬虫抓取
  • 数据库:MySQL、业务表字段
  • 接口:业务 API 返回文本

⚠️ 坑:PDF 扫描件是图片,需要 OCR 识别,否则拿不到文本。

2. 文档解析 & 文本清洗

  • 去除页眉页脚、页码、广告、多余换行、特殊符号、乱码
  • 表格:尽量转成文本描述(Markdown 表 / CSV / 文本行)
  • 图片:需要 OCR / 多模态 LLM 描述图片内容

输出:干净的长文本。

3. Chunking 文本分块(RAG 最关键环节之一)

把长文档切为小块(chunk),不能直接把整本书丢给向量库。

为什么必须分块:

  1. Embedding 模型有输入长度限制(512-8192 token)
  2. 检索以 chunk 为最小单元;chunk 太大语义混杂,chunk 太小丢失上下文

常见分块策略

策略 原理 适用
固定字符分割 按字符数切,保留 overlap 通用场景
递归字符分割 优先按换行/段落/句子/字符逐层切(LangChain 默认) 文档结构清晰
语义分块 嵌入向量相似度突变处切分 高质量需求
标题感知 按 markdown 标题层级切分 结构化文档

⚠️ overlap 重叠至关重要:防止一个完整语义被一刀两断。一般 10-20% 重叠率。

输出:Document(chunk_text, metadata),metadata 含来源文件、页码、章节、时间等。

4. Embedding 文本向量化

把每个 chunk 送入 Embedding 模型,输出稠密向量(float 数组)。

  • 开源:bge-v3、m3e、all-MiniLM、bge-m3(多语言)
  • 闭源:OpenAI text-embedding-3、阿里 text-embedding-v3

⚠️ 关键:查询阶段必须用同一个 Embedding 模型,模型换了向量空间不一致,检索直接失效。

5. 写入向量数据库

向量库存储三部分:向量 + 原始 chunk 文本 + metadata。

主流向量库:Milvus、Chroma、FAISS、PGVector(Postgres 扩展)、Qdrant、Doris

⚠️ 向量库只负责向量相似度搜索,不理解语义,只算向量距离。


第二阶段:线上查询推理(用户提问完整流程)

1
用户 Query → Query 改写 → Embedding → 向量检索 → Rerank → 过滤截断 → 组装 Prompt → LLM 生成

步骤 1:Query 改写 / 查询增强(可选,提升召回质量)

用户提问经常简短、口语化、有歧义。常见优化:

  1. 改写:把短问题扩写成更完整检索 query
  2. 多查询生成:让 LLM 生成多个角度的查询,多路检索再合并
  3. 历史上下文增强:多轮 RAG,把会话历史融入查询(解决”那违约呢”这类指代)

例:上一轮问”合同有效期”,本轮问”那违约呢”,需要合并历史生成完整 query。

步骤 2:Query 向量化

把处理后的用户查询文本,用同一个 Embedding 模型生成 query 向量。

步骤 3:向量检索(初步召回)

向量库计算 query 向量和库内所有 chunk 向量的相似度,返回 top-k(k=3-8)。

可叠加元数据过滤:例如只检索某文档、某个时间范围的。

⚠️ 向量检索是近似匹配,只看语义相似度,不代表内容真能回答问题,会有噪声。

步骤 4:Rerank 重排序(强烈建议生产开启)

向量召回的 top-k 候选送入 Reranker 重排模型:

  • 输入:用户 query + 候选 chunk

  • 输出:相关性分数,重新排序

  • 结果:把无关的 chunk 丢弃

  • 开源:bge-reranker、cross-encoder

⭐ RAG 效果提升最大的环节之一。向量是粗筛,Rerank 是精细筛选。

步骤 5:后处理:过滤、截断、窗口控制

Rerank 之后拿到真正相关文档片段:

  1. 过滤分数低于阈值的 chunk
  2. 拼接剩下的 chunk;总 token 不能超过 LLM 上下文窗口的 RAG 片段配额
  3. 超长时做截断,避免 prompt 撑爆

这里和你前面的 Agent 上下文工程打通:RAG 检索出来的片段,本质就是外部记忆召回片段。

步骤 6:组装 RAG Prompt

三部分:

1
2
3
1. System 提示:规则(只使用参考资料回答,资料没有就说不知道,禁止编造,输出引用来源)
2. 【参考资料】:过滤后的检索 chunk + metadata 来源
3. 用户原始问题

示例模板:

1
2
3
4
5
6
7
8
你是文档问答助手,请严格依据下面参考资料回答用户问题。
如果参考资料没有答案,请直接回答不知道,禁止编造信息。

====参考资料开始====
{retrieved_context}
====参考资料结束====

用户问题:{user_query}

步骤 7:LLM 生成答案

LLM 接收完整 prompt,基于参考资料输出回答。

步骤 8:输出 + 溯源引用

带上 metadata 来源(文档名 + 页码),方便用户核验。


RAG 架构图

RAG 完整架构图

图:RAG 两大阶段 + 8 步在线流程(可放大看)


RAG 常见变种(4 种)

1. Naive-RAG(朴素 RAG)

结构:简单分块 + 向量检索,没有 rerank、没有 query 改写

  • ✅ Demo 可用,5 行代码搭起来
  • ❌ 生产效果差,幻觉率高

2. Advanced-RAG(高级 RAG)

结构:query 改写 + 多级分块 + rerank + 元数据过滤 + 后处理

  • ✅ 效果提升 30-50%
  • ✅ 当前主流生产方案

3. Graph-RAG(图谱 RAG)

结构:文档抽取实体关系 → 构建知识图谱 → 结合向量检索

  • ✅ 适合复杂多实体关联问题(”张三是李四的什么人”)
  • ❌ 构建成本高(需要 LLM 抽取实体)

4. Agent-RAG(Agent 增强 RAG)

结构:RAG 嵌入 Agent 中,Agent 自主判断:

  • 是否需要检索?
  • 生成什么检索 query?
  • 检索多少次?
  • 如何融合多个检索结果?

代表:AgentScope、Spring AI Alibaba、OpenAI Agents SDK

Agent 先思考:我是否要调用检索工具?→ 生成 query → 调用 RAG → 拿到片段 → 再继续推理。


RAG 和 Agent 记忆的关系

维度 RAG 知识库 Agent 长时记忆
数据源 静态私有文档 动态对话事实
写入时机 离线预构建 对话中实时写入
存储 向量数据库 向量数据库 + KV
典型内容 文档、手册 用户偏好、历史问题

两者技术底层都是向量检索,但数据源不同。

在线推理时,两类检索片段可以拼入同一个 LLM 上下文:

1
LLM Prompt = System + (RAG 检索结果) + (Agent 长期记忆) + (短期对话历史) + 用户问题

实战常见坑(8 个)

坑 怎么避
上下文太长导致 API 报错 滑动窗口 + 摘要 + token_limit 强制
成本暴涨 用便宜模型做摘要(gpt-4o-mini 比 gpt-4o 便宜 30x)
指代消解失败 Query Rewriting + 历史 3 轮一起喂
跨会话记忆泄露 session_id 严格隔离 + 用户 ID 过滤
摘要本身太长 递归摘要(摘要的摘要再摘要)
重要信息被截掉 关键事实额外提取存向量库,不依赖压缩
LLM 压缩丢关键信息 用 Hook 强制压缩,不让 LLM 决定
长期记忆查询慢 用 Redis 缓存 top-K 结果

实战选型清单

场景 推荐方案
个人 demo LangChain + Chroma + GPT-4o-mini
中小企业生产 Advanced-RAG + bge-m3 + Milvus + bge-reranker
复杂实体关系 Graph-RAG + Neo4j + GPT-4o
企业级多 Agent 系统 Agent-RAG(AgentScope)+ Spring AI + Qdrant
超大规模(亿级) Milvus 集群 + GPU rerank + 多级缓存

面试怎么答

面试官问 RAG 时,这样答:

「RAG = Retrieval-Augmented Generation,用外部知识库检索补充 LLM 的静态知识。

两大阶段:

  • 离线索引:文档 → 清洗 → 分块 → Embedding → 向量库
  • 在线查询:Query 改写 → Embedding → 检索 → Rerank → 组装 Prompt → LLM 生成

核心优化点(按效果排序):

  1. Rerank(效果提升最大)
  2. Query 改写(处理指代)
  3. 混合检索(向量 + 关键词)
  4. 混合分块(语义 + 标题)

常见变种:Naive-RAG(demo 用)、Advanced-RAG(生产主流)、Graph-RAG(实体关系)、Agent-RAG(智能体)」


代码示例(Spring AI + 国产模型)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Bean
public CommandLineRunner ragDemo(VectorStore vectorStore, ChatClient.Builder builder) {
return args -> {
// 1. 加载文档
List<Document> docs = new PagePdfDocumentReader("docs/manual.pdf").read();
// 2. 切块
List<Document> chunks = new TokenTextSplitter(512, 50).split(docs);
// 3. 写向量库
vectorStore.add(chunks);

// 4. 问答
ChatClient client = builder
.defaultAdvisors(new QuestionAnswerAdvisor(vectorStore))
.build();

String answer = client.prompt()
.user("RAG 的核心思想是什么?")
.call()
.content();
System.out.println(answer);
};
}

10 行 Java + Spring AI 跑通一个 RAG demo。


相关阅读


最后更新:2026-09-05