跳到主要内容
📖 本章预览

本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。

第9章 RAG 入门:让 AI 不再胡说八道

RAG核心架构

9.1 RAG 原理

9.1.1 为什么 LLM 需要外部知识

LLM 的知识有三个致命缺陷:

  • 时效性:训练数据有截止日期,不知道最新信息
  • 私有性:不知道你公司的内部文档、数据库内容
  • 幻觉:对不确定的问题会"一本正经地胡说八道"

RAG(Retrieval-Augmented Generation)的解决思路:先从外部知识库中检索相关内容,再把检索结果作为上下文喂给 LLM,让它基于真实资料回答。

传统 LLM:  用户问题 → LLM → 回答(可能有幻觉)
RAG 模式: 用户问题 → 检索知识库 → 相关文档 + 用户问题 → LLM → 回答(基于事实)

9.1.2 深入理解:RAG 为什么能解决幻觉

很多人以为 RAG 就是"给 LLM 喂资料",但背后的原理比这深一层。

幻觉的根本原因:LLM 是概率模型,它生成的每个 Token 都是"最可能的下一个词"。
当它不确定答案时,它不会说"我不知道",而是会生成一个"看起来合理但实际错误"的回答。
这就像一个学生考试时不会的题也要编一个答案——它宁可编也不留空。

RAG 解决幻觉的机制:
1. 缩小生成空间:把相关文档塞进 Prompt 后,LLM 的注意力被"锚定"在这些文档上,
生成的内容大概率来自文档而不是"编造"
2. 提供事实依据:LLM 从"凭记忆回答"变成"开卷考试",准确率自然提升
3. 可追溯:每个回答都能追溯到具体的文档片段,出了问题能查

但 RAG 不是银弹:
- 检索不到相关文档 → LLM 还是会编(所以检索质量是关键)
- 检索到了但文档本身有错 → 垃圾进垃圾出
- 文档太多塞不进 Prompt → 需要重排序和截断(第10章详解)
RAG 的本质是一个信息检索问题,不是生成问题。
检索质量决定了 RAG 的上限,LLM 只是把检索到的信息"翻译"成自然语言。
所以优化 RAG 的重点在检索侧(切分策略、Embedding 质量、重排序),而不是换更大的模型。

9.1.3 RAG 全链路

离线阶段(索引构建):
原始文档 → DocumentReader(加载) → DocumentTransformer(清洗)
→ TextSplitter(切分) → EmbeddingModel(向量化) → VectorStore(存储)

在线阶段(检索生成):
用户问题 → EmbeddingModel(向量化) → VectorStore(相似度搜索)
→ 相关文档片段 → 注入 Prompt → ChatModel → 回答

9.2 DocumentReader 体系

@Service
public class DocumentLoadService {

/** PDF 文档加载 */
public List<Document> loadPdf(Resource resource) {
PagePdfDocumentReader reader = new PagePdfDocumentReader(resource,
PdfDocumentReaderConfig.builder()
.withPagesPerDocument(1)
.build()
);
return reader.get();
}

/** Tika 通用加载(Word、HTML、PPT 等) */
public List<Document> loadWithTika(Resource resource) {
return new TikaDocumentReader(resource).get();
}

/** JSON 文档加载 */
public List<Document> loadJson(Resource resource) {
JsonReader reader = new JsonReader(resource, "content", "metadata");
return reader.get();
}
}

9.3 VectorStore 配置与 Document 写入检索实战

9.3.0 VectorStore Bean 定义

Spring AI 的 VectorStore 是接口,需要选择具体实现并注册为 Bean。以下是常见的几种方式:

/**
* VectorStore 配置类
*/
@Configuration
public class VectorStoreConfig {

/**


🔒 完整内容

以上为本章部分预览,完整内容包含更多源码解析、实战代码和面试要点。

加入知识星球你将获得:

  • ✅ 全部 26 章完整内容 + 持续更新
  • ✅ 配套源码 + 实战项目
  • ✅ 技术答疑交流

📚 本章完整目录

以下为本章完整目录结构,加入知识星球即可解锁全部内容。

9.3.1 构建索引:Document 写入向量库

9.3.2 检索:从向量库读取相关文档

9.3.3 完整 Controller:索引 + 检索 + 问答

9.3.4 application.yml 配置示例

9.4 最简 RAG 实现(使用 Advisor)

9.5 手动实现 RAG(理解原理)

9.6 DocumentTransformer:文档清洗