RAG 检索增强生成
RAG(Retrieval-Augmented Generation)是目前 AI 应用最常用的架构之一。它的核心思路很简单:先检索相关文档,再基于这些文档生成答案。这样既能利用大模型的理解能力,又能保证答案有据可查。
为什么需要 RAG?
大模型虽然强大,但有两个明显的限制:
时效性问题:模型训练需要时间,训练数据都是历史数据。比如 GPT-4 的训练数据截止到 2023 年,它不知道 2024 年发生的事情。
专业领域知识缺失:模型训练用的是通用数据,对特定领域的专业知识了解有限。比如公司内部的产品手册、技术文档,模型根本没见过。
直接把文档拼接到提示词里发给模型?行不通。因为:
- 上下文窗口限制:即使是最新的模型,上下文窗口也有限(通常不超过 200K token)。几百页的文档根本放不下。
- 成本高:输入越多,token 消耗越大,成本越高。
- 效率低:每次都要把整份文档发过去,响应慢。
RAG 解决了这些问题:只检索相关的文档片段,把它们和问题一起发给模型。这样既能保证答案准确,又能控制成本。
RAG 的工作流程
RAG 分为两个阶段:离线准备和实时查询。
离线准备阶段
这个阶段主要是把文档处理成向量,存到向量数据库里。
原始文档(产品手册.pdf)
↓ 文档分块
[第1段] Spring AI 是什么... (500字)
[第2段] 如何配置 OpenAI... (400字)
[第3段] RAG 实现原理... (600字)
↓ 向量化(Embedding)
[0.2, -0.5, 0.3, ...] → 存入向量数据库
[0.3, 0.1, -0.2, ...] → 存入向量数据库
关键点:
- 文档分块:要 把文档切成小块,通常 300-800 字比较合适。太小上下文不全,太大放不进 Prompt。
- 保持语义完整:切块时要注意,不要把同一个知识点拆散。比如一个完整的代码示例应该放在一起。
- 特殊内容处理:表格、代码块要特殊处理,保持原有结构。
实时查询阶段
用户提问时,系统会:
用户:Spring AI 怎么配置 OpenAI?
↓ 将问题向量化
↓ 在向量数据库中检索
找到最相关的 3 段文档
↓ 组装 Prompt
Prompt = """
参考资料:
[第2段内容:如何配置 OpenAI...]
[第5段内容:配置文件示例...]
用户问题:Spring AI 怎么配置 OpenAI?
请基于参考资料回答,如果资料中没有答案,说不知道。
"""
↓ 发给 AI 模型
AI 返回答案
为什么用向量数据库?
普通数据库只能做精确匹配,比如搜索"MySQL",只能找到包含"MySQL"这个词的文档。但用户可能问"怎么连数据库",虽然没提到 MySQL,但意思是一样的。
向量数据库能理解语义相似性:
- 用户问"怎么连 MySQL",能找到"数据源配置"相关文档
- 用户问"接口报 500",能找到"异常处理"相关文档
- 用户问"性能慢",能找到"优化建议"相关文档
这就是向量检索的优势:基于语义相似度,而不是关键词匹配。