一、什么是 RAG?为什么需要它?
RAG(Retrieval-Augmented Generation) 的核心思想,是让大语言模型在回答问题时,先从一个外部知识库中检索出相关的信息片段,然后将这些检索到的信息作为上下文,连同原始问题一起输入给模型,最终生成一个更准确、更可靠、且基于最新知识的答案。
这项技术的兴起,直接解决了当前大模型面临的两个核心痛点。第一是知识滞后:模型的训练数据有截止日期,无法回答关于最新事件、私有文档或特定领域知识的问题。第二是“幻觉”问题:当模型对某个问题缺乏确切知识时,可能会一本正经地编造看似合理但错误的事实。RAG 通过引入外部权威知识源,就像给模型提供了一本“实时更新的参考书”,有效地缓解了这两个问题。
二、RAG 的核心工作流程
一个典型的 RAG 流程可以拆解为三个主要阶段,就像一个高效的图书馆问答员:
- 索引(Indexing):将知识库(如 PDF、网页、数据库文档)进行预处理,分割成小的文本块(chunks),然后通过嵌入模型(如
text-embedding-ada-002)将这些文本块转换为向量表示,最后存入一个向量数据库(如 FAISS、Pinecone)中。这相当于为图书馆的所有书籍建立了一份详细的索引目录。 - 检索(Retrieval):当用户提出一个问题时,首先用同一个嵌入模型将问题也转换为向量,然后在向量数据库中进行相似性搜索,找出与问题向量最接近的K个文本块。这相当于根据读者的提问,快速在索引目录中找出最相关的几本书的章节。
- 生成(Generation):将检索到的相关文本块(上下文)和用户原始问题,一起作为提示(Prompt)输入给大语言模型。模型会基于这些给定的上下文信息来组织答案。这相当于把找到的相关章节放在问答员面前,让他基于这些具体内容来回答问题。
三、关键技术细节:嵌入与向量检索
RAG 的“魔法”很大程度上依赖于向量相似性检索。其核心是让机器理解文本的“语义”,而不仅仅是关键词匹配。嵌入模型将文本映射到一个高维向量空间,语义相似的文本,在这个空间中的向量距离也更近。
常用的相似度计算方法是余弦相似度。下面是一个使用 sentence-transformers 和 faiss 库的简单示例,展示如何为一小段文本建立索引并进行检索:
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
# 1. 加载嵌入模型
model = SentenceTransformer('all-MiniLM-L6-v2')
# 2. 准备知识库文档
documents = [
"RAG通过检索外部知识来增强生成模型的输出。",
"向量数据库是存储和查询高维向量的专用系统。",
"人工智能正在深刻改变我们的生活方式。",
"多模态大模型可以同时理解文本和图像。"
]
# 3. 将文档转换为向量并建立索引
doc_vectors = model.encode(documents)
dimension = doc_vectors.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(np.array(doc_vectors))
# 4. 用户提问并进行检索
query = "什么是向量数据库?"
query_vector = model.encode([query])
k = 2 # 检索最相关的2个文档
distances, indices = index.search(np.array(query_vector), k)
print(f"问题: {query}")
print("检索到的相关文档:")
for i in indices[0]:
print(f"- {documents[i]}")
提示:在生产环境中,你需要将整个知识库文档进行切分、嵌入并存入向量数据库。当新数据到来时,只需增量更新数据库即可,无需重新训练模型。
四、实践中的优化方向
在实际应用 RAG 时,简单实现往往效果有限,需要在多个环节进行优化以提升最终答案质量。
- 文档分块策略:直接按固定长度(如 512 个 token)切分可能破坏句子或段落语义。更优的做法是按自然段落、句子或使用递归字符分割等语义感知的切分方法,并设置适当的块重叠(overlap)。
- 检索优化:可以尝试混合检索,结合传统的关键词检索(如 BM25)和向量检索,召回率更高。引入重排序(Reranker) 模型对初次检索结果进行精排,能显著提升相关性。
- 提示工程:为生成步骤设计清晰的提示模板至关重要。指令应明确要求模型“仅根据提供的上下文回答”,并引导它以结构化的方式呈现答案,避免模型忽略上下文或随意发挥。
五、我的理解与总结
在我看来,RAG 不是一个独立的模型,而是一个精巧的系统工程范式。它巧妙地将大模型强大的语言理解与生成能力,与外部知识库的精准、可控、可更新特性结合在了一起。它让大模型从一个“知识容器”转变为一个“知识检索与推理引擎”。
相比于微调(Fine-tuning),RAG 的优势在于成本更低、更灵活。微调需要重新训练模型参数,成本高昂且知识固化;而 RAG 通过更新外部知识库即可注入新知识。当然,两者并不互斥,对于需要深度理解特定格式或专业术语的场景,微调后的模型结合 RAG 可能是更好的选择。
总而言之,掌握 RAG 是让大模型落地真实业务场景(如企业知识库问答、客服、研究助手)的关键技能。它的核心价值在于将开放域的生成能力,约束在了特定、可靠的知识范围内,使得 AI 的应用更加安全、可信。