RAG 到底是怎么工作的?一文彻底搞懂 RAG 原理与完整流程
RAG 到底是怎么工作的?一文彻底搞懂 RAG 原理与完整流程
在学习 LangChain4j、Spring AI、Milvus、Embedding 等 AI 技术时,RAG 是一个绕不开的核心概念。
很多人第一次接触 RAG,会看到大量陌生的概念:
Document
Chunk
Embedding
Vector
Vector Database
Retriever
Prompt
LLM
RAG
然后很容易产生一个疑问:
RAG 到底是什么?
其实 RAG 的核心思想并不复杂。
一句话理解:
RAG = 先从自己的知识库中找到与用户问题相关的资料,再把这些资料交给大模型,让大模型结合这些资料生成答案。
也就是说:
用户问题
↓
搜索知识库
↓
找到相关资料
↓
把资料放进 Prompt
↓
交给大模型
↓
生成答案
这就是 RAG 最核心的工作原理。
一、为什么需要 RAG?
在理解 RAG 之前,我们首先要理解:
为什么不能直接问大模型?
例如我们开发了一家公司内部的 AI 知识库助手。
公司内部有大量资料:
公司员工手册.pdf
技术架构文档.pdf
Java开发规范.pdf
项目部署文档.pdf
产品需求文档.pdf
数据库设计文档.pdf
接口文档.pdf
现在用户问:
公司的年假制度是什么?
如果直接调用大模型:
用户
↓
LLM
↓
答案
大模型并不知道公司内部的年假制度。
因为这些资料并没有存在模型训练数据中。
于是模型可能:
不知道
甚至:
根据自己的知识猜一个答案
这就是大模型非常重要的一个问题:
大模型并不天然知道你的私有数据。
二、RAG 解决的是什么问题?
RAG 的目的就是:
让大模型在回答问题之前,先去查询外部知识。
例如:
用户:
公司的年假制度是什么?
RAG 系统不会马上问大模型。
而是:
用户问题
↓
检索知识库
↓
找到《员工手册》中关于年假的内容
↓
把相关内容交给大模型
↓
大模型根据资料回答
最终变成:
用户问题
↓
Retriever
↓
知识库搜索
↓
相关知识片段
↓
Prompt
↓
LLM
↓
最终答案
所以:
RAG 本质上是一种“检索 + 生成”的架构。
RAG 的全称是:
Retrieval-Augmented Generation
拆开来看:
Retrieval
检索
Augmented
增强
Generation
生成
也就是:
检索增强生成。
三、先记住 RAG 的一张总图
如果只记住一张图,我建议记住下面这张。
┌─────────────────┐
│ 用户问题 │
└────────┬────────┘
↓
┌─────────────────┐
│ Query 处理 │
│ 问题理解/改写 │
└────────┬────────┘
↓
┌─────────────────┐
│ Embedding │
│ 问题向量化 │
└────────┬────────┘
↓
┌─────────────────┐
│ Vector Search │
│ 向量检索 │
└────────┬────────┘
↓
┌─────────────────┐
│ Top-K 相关内容 │
└────────┬────────┘
↓
┌─────────────────┐
│ Prompt │
│ 问题 + 检索内容 │
└────────┬────────┘
↓
┌─────────────────┐
│ LLM │
│ 大语言模型 │
└────────┬────────┘
↓
┌─────────────────┐
│ 答案 │
└─────────────────┘
但是,这张图只描述了:
用户提问之后发生什么。
真正完整的 RAG 还包括:
知识库是怎么建立起来的。
所以完整 RAG 应该拆成两条链路:
RAG 系统
│
┌────────┴────────┐
↓ ↓
数据入库链路 用户查询链路
│ │
↓ ↓
文档加载 用户问题
↓ ↓
文本解析 Query处理
↓ ↓
文本切分 Embedding
↓ ↓
Embedding 向量检索
↓ ↓
向量数据库 Top-K
↓
Prompt组装
↓
LLM
↓
答案
这就是完整 RAG。
四、RAG 第一条链路:知识库构建
首先来看:
数据到底是怎么进入 RAG 系统的?
假设我们有一个 PDF:
Java开发规范.pdf
里面有:
第一章 Java编码规范
1. 类名必须使用 UpperCamelCase
2. 方法名必须使用 lowerCamelCase
3. 常量名称必须全部大写
4. 禁止使用魔法数字
...
RAG 首先要把这些内容处理成机器可以检索的数据。
完整流程:
PDF
↓
Document Loader
↓
Document
↓
Text Splitter
↓
Chunk
↓
Embedding
↓
Vector
↓
Vector Database
下面一步一步理解。
五、第一步:加载文档
首先需要把各种文件读取出来。
例如:
PDF
Word
TXT
Markdown
HTML
数据库
网页
通过对应的 Loader 读取。
例如:
PDF
↓
PDF Loader
↓
Document
最终得到类似:
Document {
content: "Java编码规范......",
metadata: {
source: "Java开发规范.pdf",
page: 10
}
}
这里最重要的是:
Document 不只是文本,还可以包含 Metadata。
例如:
content:
Java编码规范......
metadata:
source = Java开发规范.pdf
page = 10
category = Java
Metadata 在后面的检索、过滤、引用来源时非常重要。
六、第二步:文本切分 Chunk
这是 RAG 中非常重要的一步。
假设一本 PDF 有:
500 页
不能直接把整个 PDF 一次性丢给 Embedding 模型。
通常需要先进行:
Chunking:文本切分。
例如:
原始文档
Java开发规范
------------------
第一章
Java命名规范
......
第二章
异常处理规范
......
第三章
数据库规范
......
第四章
日志规范
......
切分之后:
Chunk 1
Java命名规范......
Chunk 2
异常处理规范......
Chunk 3
数据库规范......
Chunk 4
日志规范......
每个 Chunk 都是一个可以独立检索的知识单元。
七、为什么一定要 Chunk?
因为如果 Chunk 太大:
Chunk = 10000 字
可能包含大量无关信息。
用户问:
Java异常应该怎么处理?
但是整个 Chunk 里面可能包含:
Java命名规范
异常处理
数据库
日志
Git
部署
测试
......
检索出来以后:
相关信息太少,无关信息太多。
反过来,如果 Chunk 太小:
Chunk = 20 字
又可能导致:
上下文不完整
例如:
Chunk 1:
异常必须......
Chunk 2:
统一处理......
Chunk 3:
并记录日志......
单独检索某个 Chunk 时,语义可能已经不完整。
所以:
Chunk 的大小会直接影响 RAG 的检索效果。
八、Chunk 并不是简单地“每 N 个字符切一刀”
初学者非常容易误解:
Chunk = 每1000个字符切一次
实际上优秀的 RAG 系统通常会考虑:
段落
标题
章节
语义
代码结构
Markdown结构
HTML结构
例如:
# Java异常处理
## 1. 异常分类
...
## 2. 异常处理原则
...
## 3. 日志规范
...
比较合理的切分方式是:
Chunk 1
Java异常处理
异常分类......
Chunk 2
异常处理原则......
Chunk 3
日志规范......
而不是机械地:
每1000字符切一次
九、Chunk Overlap 是什么?
实际 RAG 中经常还会出现:
Chunk Size
Chunk Overlap
例如:
Chunk Size = 500
Overlap = 100
原文:
AAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDD
切分可能变成:
Chunk 1
AAAAAAAA
BBBBBBBB
Chunk 2
BBBBBBBB
CCCCCCCC
Chunk 3
CCCCCCCC
DDDDDDDD
这里:
BBBBBBBB
就是重叠部分。
为什么需要 Overlap?
因为避免重要信息刚好被切断。
例如一句话:
Spring AI 可以通过 VectorStore
实现向量数据的存储和检索。
如果刚好切成:
Chunk 1:
Spring AI 可以通过 VectorStore
Chunk 2:
实现向量数据的存储和检索。
上下文就被拆开了。
使用 Overlap 可以降低这种问题。
十、第三步:Embedding——把文字变成向量
Chunk 切完以后,下一个核心步骤:
Embedding。
这是 RAG 最重要的基础技术之一。
假设:
Chunk:
Java中HashMap的底层结构是什么?
Embedding 模型会把它转换成一组数字:
[0.0123,
-0.2841,
0.8912,
0.3321,
...]
这组数字就是:
向量 Vector。
例如:
文本
↓
Embedding Model
↓
Vector
十一、为什么要把文字转换成向量?
因为计算机很难直接理解:
Java异常处理规范
和:
系统应该如何处理Java异常?
是不是表达了相似的意思。
但是通过 Embedding,可以把文本映射到一个高维向量空间。
例如:
Java异常处理
↓
[0.12, 0.87, -0.31, ...]
Java异常规范
↓
[0.14, 0.83, -0.29, ...]
两个向量比较接近。
而:
深圳天气
可能变成:
[-0.82, 0.12, 0.74, ...]
距离就比较远。
于是我们可以通过:
向量相似度
找到语义相似的文本。
十二、Embedding 的核心思想
可以简单理解成:
语义相近
↓
向量空间中距离较近
语义不相关
↓
向量空间中距离较远
例如:
"Java异常处理"
"Java异常机制"
"Java Exception处理"
它们虽然文字不同,但是语义相近。
Embedding 的目标就是让:
Vector(Java异常处理)
≈
Vector(Java异常机制)
≈
Vector(Java Exception处理)
十三、第四步:把向量存进向量数据库
得到向量之后,还需要存起来。
这时候就出现了:
Vector Database:向量数据库。
常见的向量数据库包括:
Milvus
Qdrant
Weaviate
Pinecone
pgvector
Elasticsearch
OpenSearch
在 Java 项目中,也经常会通过 Spring AI 或 LangChain4j 对 VectorStore 进行统一封装。
十四、向量数据库里面到底存什么?
不是只存:
Vector
通常还会保存:
Vector
+
原始文本
+
Metadata
例如:
ID:
10001
Vector:
[0.123, -0.345, 0.891...]
Text:
Java异常应该统一进行处理......
Metadata:
source = java-guide.pdf
page = 32
category = java
可以理解成:
┌─────────────────────────────┐
│ Vector Database │
├─────────────────────────────┤
│ ID │
│ Vector │
│ Text │
│ Metadata │
└─────────────────────────────┘
十五、到这里,知识库就建立好了
整个知识入库流程:
PDF / Word / Markdown / Web
↓
文档解析
↓
Document
↓
Text Split
↓
Chunk
↓
Embedding
↓
Vector
↓
Vector Database
到这里:
RAG 的知识库已经准备好了。
接下来就是最关键的:
用户到底是怎么问问题的?
十六、RAG 第二条链路:用户查询
假设用户输入:
Java中的HashMap为什么线程不安全?
RAG 系统接收到问题之后,并不是:
问题
↓
LLM
而是:
问题
↓
Query处理
↓
Embedding
↓
Vector Search
↓
找到相关Chunk
↓
Prompt
↓
LLM
↓
答案
下面逐步分析。
十七、第一步:接收用户问题
用户输入:
Java中的HashMap为什么线程不安全?
系统把它称为:
Query
也就是:
查询问题。
十八、第二步:Query Embedding
用户问题也需要进行 Embedding。
例如:
Java中的HashMap为什么线程不安全?
转换成:
[0.123,
-0.823,
0.341,
0.921,
...]
注意:
这里使用的 Embedding 模型通常需要与知识库构建阶段保持兼容。
因为:
文档向量
和:
Query向量
最终需要在同一个向量空间中进行相似度比较。
十九、第三步:向量检索
现在系统有:
Query Vector
然后去向量数据库查询:
哪些 Chunk 和这个问题最相似?
例如知识库中有:
Chunk 1
Java HashMap底层结构......
Chunk 2
ConcurrentHashMap线程安全......
Chunk 3
Java ArrayList实现......
Chunk 4
Java线程池......
Chunk 5
Redis缓存......
用户问题:
HashMap为什么线程不安全?
经过向量相似度计算:
Chunk 1 → 0.91
Chunk 2 → 0.84
Chunk 3 → 0.32
Chunk 4 → 0.28
Chunk 5 → 0.11
系统就会优先选择:
Chunk 1
Chunk 2
这就是:
Retrieval:检索。
二十、什么是 Top-K?
实际系统不会把所有知识都返回。
例如:
100万条 Chunk
不可能全部交给大模型。
通常会选择:
Top-K
例如:
Top-K = 5
也就是:
找出最相关的 5 个知识片段。
例如:
用户问题
↓
Vector Search
↓
Top 5
↓
Chunk 12
Chunk 893
Chunk 1024
Chunk 2048
Chunk 9999
二十一、但是 Top-K 并不意味着一定正确
这是理解 RAG 非常重要的一点:
向量检索不是“答案检索”,而是“相似内容检索”。
例如:
用户:
HashMap为什么线程不安全?
检索出来:
HashMap底层结构
只能说明:
这个内容和问题比较相关。
不能说明:
这个内容一定包含完整答案。
所以成熟 RAG 往往还会继续做:
召回
↓
重排序
↓
过滤
↓
Prompt
二十二、Rerank:为什么需要重排序?
假设第一次向量检索得到:
Chunk A → 0.91
Chunk B → 0.89
Chunk C → 0.87
Chunk D → 0.86
Chunk E → 0.85
但是向量相似度只是第一阶段筛选。
可以再使用 Reranker:
Query
+
Chunk A
↓
Reranker
↓
相关性评分
重新排序:
Chunk C → 0.98
Chunk A → 0.95
Chunk D → 0.91
Chunk B → 0.75
Chunk E → 0.43
最终只把:
Chunk C
Chunk A
Chunk D
交给大模型。
所以企业级 RAG 常见流程:
Vector Search
↓
初步召回
↓
Rerank
↓
精准筛选
↓
LLM
二十三、第四步:把检索结果放进 Prompt
这是 RAG 最关键的一步。
假设我们找到:
Chunk 1:
HashMap在并发环境下可能出现数据覆盖、数据结构异常等问题,
因此HashMap本身不是线程安全的数据结构。
用户的问题是:
HashMap为什么线程不安全?
系统会构建一个 Prompt:
你是一个Java技术专家。
请根据下面的知识库内容回答用户问题。
【知识库内容】
HashMap在并发环境下可能出现数据覆盖、数据结构异常等问题,
因此HashMap本身不是线程安全的数据结构。
【用户问题】
HashMap为什么线程不安全?
然后:
Prompt
↓
LLM
二十四、这就是 RAG 最核心的秘密
很多人以为:
RAG 是让大模型“学会”了公司的知识。
其实不是。
RAG 并没有重新训练大模型。
而是:
用户问题
↓
搜索外部知识
↓
找到相关知识
↓
塞进 Prompt
↓
让大模型参考这些知识回答
所以:
RAG 的知识并没有真正进入模型参数,而是在推理时作为上下文提供给模型。
这是 RAG 和 Fine-tuning 非常重要的区别。
二十五、第五步:LLM 生成答案
现在大模型看到的是:
System Prompt
+
知识库内容
+
用户问题
例如:
System:
你是Java专家。
请严格根据知识库内容回答。
如果知识库中没有答案,请明确说明。
Context:
HashMap本身不是线程安全的数据结构。
并发环境下可能出现数据覆盖等问题。
Question:
HashMap为什么线程不安全?
大模型最终生成:
HashMap不是线程安全的,主要原因是其内部数据结构和操作没有提供并发控制。
在多个线程同时执行put、resize等操作时,
可能出现数据覆盖、结构异常等问题。
如果需要在并发环境中使用Map,
通常应该考虑ConcurrentHashMap。
最终:
LLM
↓
Answer
二十六、到这里,完整 RAG 流程就跑完了
把整个流程连起来:
【知识库构建阶段】
PDF / Word / Markdown / DB
↓
文档解析
↓
Document
↓
文本切分
↓
Chunk
↓
Embedding
↓
Vector
↓
Vector Database
│
│
│
↓
【用户查询阶段】
用户问题
↓
Query处理/改写
↓
Embedding
↓
Vector Search
↓
Top-K召回
↓
Rerank重排序
↓
Context上下文
↓
Prompt Template
↓
LLM
↓
最终答案
这就是一个完整的 RAG Pipeline。
二十七、用一个真实项目理解 RAG
假设我们正在开发:
AI 企业知识库助手
技术栈:
Spring Boot
Spring AI
MySQL
Milvus
Embedding Model
LLM
公司有:
1000份PDF
500份Word
2000份Markdown
1. 文档上传
管理员上传:
Java开发规范.pdf
系统:
PDF
↓
解析
↓
Text
2. 文本切分
例如:
100页PDF
切成:
500个Chunk
3. Embedding
每个 Chunk:
Chunk
↓
Embedding Model
↓
1024维向量
4. 写入 Milvus
保存:
id
vector
content
metadata
例如:
id = 10001
content =
"HashMap在并发环境下不是线程安全的..."
metadata =
{
fileName: "Java开发规范.pdf",
page: 32,
category: "Java"
}
二十八、用户开始提问
用户:
HashMap为什么线程不安全?
系统:
Query
↓
Embedding
↓
Vector Search
↓
Milvus
Milvus 找到:
Chunk 10001
Chunk 10008
Chunk 10013
二十九、构建上下文
系统把这些 Chunk 拼成:
Context:
Chunk 10001:
HashMap在并发环境下不是线程安全的......
Chunk 10008:
多个线程同时执行put操作时......
Chunk 10013:
ConcurrentHashMap提供了并发安全能力......
然后:
Context
+
Question
进入 Prompt。
三十、调用大模型
最终请求:
LLM(
question,
context
)
大模型根据:
用户问题
+
检索到的知识
生成答案。
三十一、最终返回
用户看到:
HashMap本身不是线程安全的。
在多线程环境下,如果多个线程同时修改HashMap,
可能出现数据覆盖、结构异常等问题。
如果需要在并发环境中使用Map,
可以考虑ConcurrentHashMap。
如果系统还保存了 Metadata:
source = Java开发规范.pdf
page = 32
还可以返回:
参考来源:
Java开发规范.pdf
第32页
这就是企业知识库最常见的 RAG 场景。
三十二、RAG 本质上可以抽象成两个阶段
如果要用一句非常清晰的话总结:
RAG
=
知识准备
+
问题回答
知识准备:
文档
↓
切分
↓
Embedding
↓
向量数据库
问题回答:
问题
↓
Embedding
↓
检索
↓
相关知识
↓
Prompt
↓
LLM
↓
答案
三十三、RAG 中几个核心组件到底是什么?
到这里,可以把所有概念对应起来。
| 概念 | 作用 |
|---|---|
| Document | 原始文档 |
| Chunk | 文档切分后的知识片段 |
| Embedding | 把文本转换成向量 |
| Vector | 文本的向量表示 |
| Vector Database | 保存和检索向量 |
| Retriever | 从知识库检索相关内容 |
| Top-K | 取最相关的K个结果 |
| Reranker | 对召回结果再次排序 |
| Context | 提供给LLM的知识上下文 |
| Prompt | 告诉LLM应该如何回答 |
| LLM | 根据问题和上下文生成答案 |
把这些东西串起来:
Document
↓
Chunk
↓
Embedding
↓
Vector
↓
Vector DB
↓
Retriever
↓
Top-K
↓
Reranker
↓
Context
↓
Prompt
↓
LLM
三十四、RAG 最容易理解错的地方
误区一:RAG 等于训练大模型
错误。
RAG:
不修改模型参数
而是:
推理时提供外部知识
误区二:向量数据库里面存的是答案
不准确。
向量数据库主要保存:
向量
+
文本
+
Metadata
它负责:
找到相关知识。
最终答案还是:
LLM
生成的。
误区三:Embedding 就是大模型
不是。
Embedding Model:
文本
↓
向量
LLM:
问题 + 上下文
↓
答案
两者职责完全不同。
三十五、RAG 和传统搜索有什么区别?
传统搜索:
关键词
↓
倒排索引
↓
关键词匹配
例如搜索:
HashMap 线程安全
主要依赖:
HashMap
线程安全
这些关键词。
而 RAG 的向量搜索更加关注:
语义相似度。
例如:
为什么HashMap不能在多线程环境下直接使用?
即使知识库里面写的是:
HashMap本身不具备并发安全能力。
关键词可能不完全一致。
但是 Embedding 可以识别:
语义相关
所以:
传统搜索
关键词匹配
RAG
语义检索
当然,现代企业级 RAG 往往会把:
关键词搜索
+
向量搜索
+
Rerank
结合起来,也就是常见的:
Hybrid Search(混合检索)。
三十六、RAG 为什么有时候效果不好?
理解这个问题非常重要。
因为:
RAG 并不是“接上向量数据库就一定准确”。
RAG 的效果取决于整个链路。
可以抽象成:
RAG效果
=
文档质量
×
切分质量
×
Embedding质量
×
检索质量
×
Rerank质量
×
Prompt质量
×
LLM能力
任何一个环节出现问题,都可能导致最终答案不好。
三十七、例如 Chunk 切错了
原文:
Spring AI支持Tool Calling。
Tool可以让大模型调用外部系统。
例如:
查询数据库
调用天气API
查询订单
如果错误切分:
Chunk 1:
Spring AI支持Tool Calling。
Chunk 2:
Tool可以让大模型调用外部系统。
可能导致:
Tool到底是什么?
只能找到部分上下文。
三十八、例如检索错了
用户问:
如何查询订单?
结果召回:
订单创建流程
订单取消流程
订单支付流程
但是没有召回:
订单查询接口
这时候:
不是 LLM 不聪明,而是 RAG 根本没有把正确资料找出来。
所以 RAG 中一个非常重要的原则:
Garbage In, Garbage Out。
检索错了:
Retrieval错
后面的 LLM 再强,也很难得到正确答案。
三十九、因此企业级 RAG 通常不是简单的:
Question
↓
Embedding
↓
Vector Search
↓
LLM
而是:
用户问题
↓
Query Rewrite
↓
Query Embedding
↓
┌───────────┴───────────┐
↓ ↓
Vector Search Keyword Search
↓ ↓
└───────────┬───────────┘
↓
Hybrid Search
↓
Top-K
↓
Rerank
↓
Context
↓
Prompt Template
↓
LLM
↓
Answer
这才是更加接近企业实际项目的 RAG 架构。
四十、进一步理解:RAG 其实就是给 LLM 加了一双“搜索眼睛”
可以用一个非常形象的比喻理解。
普通 LLM:
┌─────────────┐
用户问题 ───→│ LLM │
└─────────────┘
↓
答案
它只能依赖:
模型参数
+
当前上下文
而 RAG:
┌──────────────┐
│ 知识库 │
└──────┬───────┘
↑
│
用户问题 ──→ 检索系统 ─────────┘
│
↓
找资料
│
↓
LLM
│
↓
答案
所以可以把 RAG 理解成:
给大模型增加了一个外部知识库。
四十一、RAG 最核心的一句话
如果面试官问:
你能不能简单讲一下 RAG?
可以这样回答:
RAG,也就是 Retrieval-Augmented Generation,核心思想是在大模型生成答案之前,先从外部知识库中检索与用户问题相关的知识片段,然后将这些知识作为上下文注入 Prompt,再交给大模型生成最终答案。
整个过程可以分为知识库构建和在线问答两个阶段。知识库构建阶段主要包括文档解析、文本切分、Embedding 向量化以及向量数据库存储;在线问答阶段主要包括 Query 处理、向量检索、Top-K 召回、Rerank、上下文组装、Prompt 构建以及 LLM 生成答案。
RAG 最大的价值是不需要重新训练大模型,就可以让大模型基于企业自己的私有知识回答问题,同时还可以通过 Metadata 返回答案来源。
这就是一个非常标准的企业级 RAG 面试回答。
四十二、最后用一张图彻底记住 RAG
RAG
│
┌────────────┴────────────┐
│ │
↓ ↓
【知识库构建】 【用户问答】
│ │
↓ ↓
PDF/Word 用户问题
↓ ↓
文档解析 Query处理
↓ ↓
Document Embedding
↓ ↓
Chunking Vector Search
↓ ↓
Embedding Top-K
↓ ↓
Vector Reranker
↓ ↓
Vector Database Context
│ │
│ ↓
│ Prompt Template
│ │
└─────────────────────────┤
↓
LLM
↓
Answer
↓
引用/来源
把它压缩成一句话就是:
文档
↓
切分
↓
Embedding
↓
向量数据库
↓
用户提问
↓
Query Embedding
↓
检索
↓
Rerank
↓
Context
↓
Prompt
↓
LLM
↓
答案
这就是:
RAG 的完整生命周期。
四十三、下一步应该继续学习什么?
如果按照企业级 Java + AI 工程师的路线学习 RAG,建议按照下面顺序继续深入:
第1阶段:RAG基础
│
├── 1. RAG原理
├── 2. Embedding
├── 3. Chunk
├── 4. Vector Database
└── 5. Retriever
第2阶段:RAG核心技术
│
├── 6. 相似度搜索
├── 7. Top-K
├── 8. Metadata Filter
├── 9. Rerank
├── 10. Hybrid Search
└── 11. Query Rewrite
第3阶段:高级RAG
│
├── 12. Parent-Child Retrieval
├── 13. Multi-Query Retrieval
├── 14. Contextual Retrieval
├── 15. Self Query
├── 16. HyDE
├── 17. Graph RAG
└── 18. Agentic RAG
第4阶段:企业级RAG
│
├── 19. 权限控制
├── 20. 多租户
├── 21. 文档更新
├── 22. 增量Embedding
├── 23. 删除与重建索引
├── 24. RAG评估
├── 25. Recall / Precision
├── 26. RAGAS
└── 27. 生产环境性能优化
第5阶段:Java企业级实现
│
├── Spring Boot
├── Spring AI
├── LangChain4j
├── Milvus
├── Elasticsearch
├── MySQL
└── Redis
如果你接下来准备做 Spring AI + Java 的企业级 RAG 项目,最值得继续深入的是:
文档上传
↓
PDF解析
↓
智能Chunk
↓
Embedding
↓
Milvus
↓
Hybrid Search
↓
Rerank
↓
Prompt
↓
DeepSeek / Qwen / GPT
↓
流式回答
↓
引用来源
↓
权限控制
↓
RAG评估
这条链路真正走通之后,你基本就不只是“知道 RAG 是什么”,而是已经具备了企业级 RAG 开发的完整技术认知。
更多推荐

所有评论(0)