RAG技术 (检索增强生成)
引言:当大模型遇上知识库
想象一下,你正在参加一场开卷考试。你的面前有两样东西:一个记忆力超群但知识停留在去年的天才同学(这就是大语言模型),以及一个可以随时查阅的最新版百科全书(这就是外部知识库)。你让这位同学回答问题,他既可以凭借自己的记忆作答,也可以随时翻阅百科全书获取最新、最准确的信息。
这个场景,就是 RAG(检索增强生成)最形象的比喻。
它不是要取代大模型,而是为大模型装上了一个可以实时更新的"知识图书馆"。
一、什么是 RAG?
1.1 官方定义
RAG 全称是 Retrieval-Augmented Generation,中文译为"检索增强生成"。它是一种将信息检索系统与大语言模型的生成能力相结合的技术架构。
核心思想很简单:在让大模型回答问题之前,先从一个知识库中检索出与问题最相关的信息,然后将这些信息作为"参考资料"连同原始问题一起交给模型,让它基于这些资料生成最终答案。
1.2 为什么要用 RAG?
传统的大语言模型存在三个先天性缺陷:
| 缺陷 | 表现 | 后果 |
|---|---|---|
| 知识截止日期 | 模型训练完成后,新发生的事件一概不知 | 问"今天的天气"、“最近的新闻”,模型只能道歉 |
| 幻觉问题 | 模型会"自信地胡说八道" | 在金融、医疗等严肃场景无法直接使用 |
| 缺乏专业深度 | 对企业内部知识、专业领域知识不了解 | 无法回答基于私域数据的专业问题 |
RAG 的出现,一次性解决了这三个问题:
知识实时更新:只要更新知识库,模型就能"知道"
答案可追溯:每个回答都能找到对应的参考资料
低成本私有化:无需训练模型,只需构建知识库
1.3 RAG 的三步工作流程
一个标准的 RAG 流程包含三个核心步骤:
用户提问:"去年的销售额是多少?"
↓
[第一步:检索]
↓
在向量数据库中搜索 → 找到"2023年财报.pdf"中的相关段落
↓
[第二步:增强]
↓
构建新的提示词:
"基于以下资料回答问题:
【资料】2023年公司财报显示,全年销售额为1.2亿元...
问题:去年的销售额是多少?"
↓
[第三步:生成]
↓
大模型生成:"根据公司财报,2023年的销售额为1.2亿元。"
二、RAG 的核心技术组件
要深入理解 RAG,需要认识它的三个核心技术组件:
2.1 向量化与嵌入模型
是什么:将文本转化为计算机能够理解的数学向量(一组数字)。
为什么需要:计算机无法像人类一样理解文字的"含义",但它擅长计算数字之间的"距离"。通过将文字转化为向量,我们可以用数学方式衡量两段文字的相似度。
像 OpenAI 的 text-embedding-3-small 模型,或者本地的 bge-large-zh 模型,都是常用的嵌入模型。
2.2 向量数据库
是什么:专门存储和检索向量的数据库。
为什么需要:当你有十万、百万份文档时,要找到与用户问题最相关的几段内容,向量数据库能提供高效的相似性搜索。
PHP生态集成:
Pgvector:PostgreSQL 的向量扩展,PHP 可以用熟悉的 PDO 操作
Redis Stack:支持向量搜索,PHP 有成熟的 Redis 扩展
Qdrant:专用向量数据库,提供 RESTful API,PHP 可以用 Guzzle 调用
Milvus:企业级向量数据库
2.3 大语言模型
是什么:负责最终"说话"的部分,根据检索到的资料生成自然流畅的回答。
PHP集成方式:
云端API:OpenAI、Azure OpenAI、文心一言、通义千问
本地模型:通过 Ollama、LM Studio 运行开源模型,PHP 调用其 API
三、RAG 的进阶形态
随着技术发展,RAG 也在不断进化,产生了多种进阶形态:
3.1 高级 RAG
在基础 RAG 之上,增加了更多优化环节:
预检索优化:问题改写、HyDE(假设性文档嵌入)
检索优化:混合检索(向量+关键词)、重排序
后检索优化:上下文压缩、信息融合
3.2 模块化 RAG
将 RAG 流程拆分为可插拔的模块,可以根据需要灵活组合:
用户输入 → 查询重写 → 多路检索 → 检索 → 重排序 → 生成
↓ ↓
意图识别 数据库查询
3.3 Agentic RAG
这是 RAG 与 Agent 的深度融合。Agent 不再是被动地"检索一次",而是可以主动决定何时检索、检索什么、以及如何利用检索结果。
典型场景:当用户问"对比苹果和谷歌的最新财报",Agent 会:
先检索"苹果2024年财报"
再检索"谷歌2024年财报"
然后思考:“还需要行业的平均数据来做对比”
主动检索"科技行业平均利润率"