34-RAG基础架构
RAG 定义与动机
RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合了信息检索和文本生成的技术,它让大语言模型在回答问题或生成文本时,先从大量外部文档中检索出最相关的信息,然后基于这些检索到的信息生成回答,从而提高回答的准确性和可靠性。
为什么需要 RAG?
尽管大语言模型(LLMs)已经具备了强大的生成能力,但仍然存在以下不足:
-
幻觉问题:LLM 文本生成的底层原理是基于概率逐 token 生成,因此会不可避免地产生"一本正经的胡说八道"的情况,导致事实性错误。
-
时效性问题:大模型训练成本高、周期长,具有时效性的数据无法及时参与训练,因此无法直接回答时效性相关的问题,例如"帮我推荐几部近期热映的电影?"。
-
数据安全问题:企业想要在保证安全的前提下使用 LLM,最好的方式就是把数据全部放在本地,企业数据的业务计算全部在本地完成,而在线的大模型仅仅完成一个归纳生成的功能。
-
知识更新成本高:如果通过微调(SFT)来更新大模型知识,成本较高,而 RAG 只需要更新知识库即可。
基于以上原因,RAG 成为了当前大模型应用开发中最主流的架构之一。
基础 RAG 流程
典型的 RAG 实现主要包括三个核心步骤:数据索引、检索和生成。
1. 数据索引阶段(离线)
数据索引是一个离线过程,主要将私域数据向量化后构建索引并存入数据库:
- 数据提取:从不同格式的原始数据(PDF、Word、HTML、Markdown、数据库等)中提取文本内容,识别标题、段落、表格等元素。
- 文本分割(Chunking):将长文本分割成适当大小的块,考虑 embedding 模型的 token 限制和语义完整性。
- 向量化(Embedding):将每个文本块转换为向量表示。
- 创建索引:将向量写入向量数据库,构建索引。
2. 检索阶段(在线)
当用户提出查询时:
- 将用户查询进行向量化;
- 在向量库中检索与查询最相似的 Top-k 个文档块;
- 可选:对检索结果进行重排序(Rerank),进一步提高相关性;
- 可以结合元数据过滤、知识图谱检索等方法提高准确性。
3. 生成阶段
将用户原始查询和检索到的相关文本拼接成 Prompt,输入给大语言模型,由大模型生成最终回答。本质上这是一个 Prompt Engineering 过程,像 LangChain、LlamaIndex 等框架都提供了开箱即用的实现。
RAG vs SFT 对比
对于大语言模型引入外部知识,RAG 和 SFT(Supervised Fine-Tuning)是两种最常见的方法,它们对比如下:
| 维度 | RAG | SFT |
|---|
| 知识更新 | 容易,只需要更新知识库 | 困难,需要重新训练 |
| 训练成本 | 低,不需要训练大模型 | 高,需要微调大模型 |
| 可解释性 | 好,可以追溯信息来源 | 差,知识编码在参数中 |
| 可控性 | 高,可以方便增删知识 | 低,难以精确控制 |
| 处理大规模知识 | 友好,只需要索引增量 | 不友好,数据量越大训练成本越高 |
| 事实准确性 | 更高,基于检索到的事实 | 依赖训练数据质量,容易产生幻觉 |
| 上下文窗口 | 占用更多,需要容纳检索片段 | 不占用,知识在参数中 |
注意:这两种方法并非非此即彼,合理结合使用往往能获得更好的效果。RAG 提供准确的外部知识,SFT 让模型更好地利用这些知识。
使用 RAG 的好处
- 可扩展性:减少模型大小和训练成本,允许轻松扩展知识;
- 准确性:通过引用信息来源,用户可以核实答案的准确性,增强了人们对模型输出结果的信任;
- 可控性:允许更新或定制知识,满足企业数据安全和隐私需求;
- 可解释性:检索到的文档可以作为模型预测的参考来源;
- 多功能性:RAG 可以针对多种任务进行微调和定制,包括 QA、文本摘要、对话系统等;
- 及时性:使用检索技术能识别到最新的信息,使 RAG 在保持回答的及时性和准确性方面,相较于只依赖训练数据的传统语言模型有明显优势;
- 定制性:通过索引与特定领域相关的文本语料库,RAG 能够为不同领域提供专业的知识支持;
- 安全性:RAG 通过数据库中设置的角色和安全控制,实现了对数据使用的更好控制。相比之下,经过微调的模型在管理数据访问权限方面可能不够明确。
典型 RAG 案例
1. ChatPDF
ChatPDF 是最经典的 RAG 应用,允许用户上传 PDF 并与 PDF 内容对话:
- ChatPDF 首先读取 PDF 文件,将其转换为可处理的文本格式;
- 对提取出来的文本进行清理和标准化,分段分句;
- 使用 OpenAI Embeddings 将每个分段转换为向量,编码语义;
- 当用户提出问题时,同样将问题转换为向量,通过余弦相似度找到最相似的分段;
- 将找到的最相似分段与问题一起作为 prompt,调用大模型生成回答;
- 将生成的答案返回给用户。
2. 百川大模型搜索增强
百川大模型的搜索增强系统融合了多个模块:
- 指令意图理解:深入理解用户指令
- 智能搜索:精确驱动查询词的搜索
- 结果增强:结合大语言模型技术来优化模型结果生成的可靠性
通过这一系列协同作用,大模型实现了更精确、智能的回答,减少了模型幻觉。
3. 多模态 RAG
RA-CM3 是一个检索增强的多模态模型,使用预训练的 CLIP 模型实现检索器,然后使用 CM3 Transformer 架构构成生成器,检索器辅助模型从外部存储库中获取与当前提示文本相关的精确信息,然后将该信息连同文本送入生成器中进行图像合成,提高了生成的准确性。
RAG 存在什么问题
- 检索效果依赖 embedding 和检索算法,目前可能检索到无关信息,反而对输出有负面影响;
- 大模型如何利用检索到的信息仍是黑盒,可能存在生成的文本与检索信息相冲突的情况;
- 对所有任务都无差别检索 k 个文本片段,效率不高,同时会大大增加模型输入的长度;
- 无法强制模型引用来源,因此无法精准地查证事实,检索的真实性取决于数据源及检索算法。
面试常见问题
1. 什么是 RAG?为什么需要它?
回答要点:
- RAG 是检索增强生成,结合检索和生成;
- 解决大模型幻觉、时效性、数据安全等问题;
- 相比微调成本更低,更容易更新知识。
2. 简述 RAG 的基本流程。
回答要点:
- 离线阶段:文档处理 → 分块 → embedding → 存入向量库;
- 在线阶段:query embedding → 检索相关文档 → rerank → 拼接 prompt → 大模型生成回答。
3. RAG 和 SFT 的区别是什么?各自适用什么场景?
回答要点:
- RAG 适合知识需要频繁更新、对可解释性要求高的场景;
- SFT 适合让模型学习任务风格、格式、通用能力,知识相对稳定的场景;
- 两者可以结合使用。
4. 为什么 RAG 能够减少大模型幻觉?
回答要点:
- RAG 要求大模型基于检索到的外部文档生成回答,限制了大模型编造内容;
- 如果文档中没有相关信息,大模型可以承认无法回答,而不是凭空编造。