RAG:为AI配上外部记忆

一、RAG的本质:为AI配上"外部记忆"

想象一下,如果你面临两种考试方式:

  • 闭卷考试:只能依靠大脑中已有的知识
  • 开卷考试:可以查阅资料,再回答问题

传统的大型语言模型(LLMs)就像是在进行闭卷考试—它们只能使用训练时学到的知识。这也是为什么它们经常会"幻觉"(生成看似合理但实际上不正确的信息)。

RAG(检索增强生成)给予了AI"开卷考试"的能力。

RAG 的本质:AI的"开卷考试"能力 传统 LLM 闭卷考试 输入层 隐藏层 输出层 只能依靠训练时的固定参数和知识 RAG 模型 开卷考试 LLM核心 外部知识库 检索 实时检索外部知识,生成更精确的回答 VS RAG = 检索增强生成 = AI的"开卷考试"能力

RAG的核心思想非常简单——将信息检索与文本生成相结合。这种看似简单的结合,却彻底改变了AI系统回答问题的方式。

二、RAG的工作原理:三步流程

RAG的工作流程可以分为三个关键步骤:

1. 用户提问

用户向系统提出问题,比如"2023年全球碳排放量是多少?"

2. 检索阶段(Retrieval)

系统从外部知识库中检索与问题相关的信息。这是RAG的核心区别所在。

RAG 检索阶段详解 ? 用户问题: "2023年全球碳排放量是多少?" 步骤1: 嵌入问题 将问题转换为向量表示 步骤2: 向量检索 寻找语义相似的文档 步骤3: 重排序 精确筛选最相关文档 [0.2, 0.5, -0.3, ...] 问题向量表示 向量数据库 交叉编码器 精确相关性评分 检索结果 "根据国际能源署(IEA)的 数据,2023年全球碳排放量 约为36.8吉吨,比2022年 增长了1.1%..." 相关性: 85%

检索阶段包含几个技术要点:

a) 嵌入(Embedding)

问题被转换为向量表示(通常是几百到几千维的浮点数数组)。这种向量能够捕捉问题的语义特征。

b) 向量检索

系统使用相似度搜索(如余弦相似度)在向量数据库中寻找与问题向量最相似的文档向量。

c) 重排序(可选)

对初步检索结果进行更精细的排序,使用更复杂的模型(如交叉编码器)计算问题与文档的相关性。

3. 生成阶段(Generation)

大语言模型(如GPT、Claude等)结合检索到的信息原始问题生成最终答案。

RAG 生成阶段详解 用户原始问题 检索到的相关文档 提示工程 系统: 根据提供的信息回答 上下文: [文档内容...] 用户问题: [用户输入...] 结合问题和检索文档构建结构化提示 大语言模型 (GPT, Claude, LLaMA等) "根据国际能源署(IEA)的数据,2023年全球碳排放量约为36.8吉吨, 比2022年增长了1.1%。" 来源: IEA报告 RAG生成阶段将检索到的相关文档与原始问题结合,生成基于事实的精确回答

生成阶段的关键是提示工程(Prompt Engineering)

1
2
3
4
5
6
7
8
9
10
系统: 你是一个知识助手,请根据提供的参考信息回答用户问题。
只使用参考信息中的内容。如果参考信息中没有相关内容,
请回答"我没有足够信息回答这个问题"

参考信息:
[1] 根据国际能源署(IEA)的数据,2023年全球碳排放量约为36.8吉吨,
2022年增长了1.1%。主要排放来源为电力和热力生产(41%),
工业(20%),交通(21%)。

用户问题: 2023年全球碳排放量是多少?

这种结构化提示确保了模型在生成回答时会优先使用检索到的信息,而不是依赖其预训练知识。

三、RAG的技术实现细节

1. 文档处理与索引构建

RAG的基础是高质量的知识库,这需要几个关键步骤:

a) 文档收集与准备

  • 确定知识来源(网页、PDF、数据库等)
  • 数据清洗与预处理

b) 文档分块(Chunking)

  • 将长文档拆分为适当大小的片段
  • 常见策略:固定大小、语义分割、重叠分块
1
2
3
4
5
6
7
8
9
10
# 文档分块示例代码
from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
length_function=len,
)

chunks = text_splitter.split_text(long_document)

c) 向量化与索引

  • 使用嵌入模型将文本块转换为向量表示
  • 构建向量索引以支持高效检索
1
2
3
4
5
6
7
8
9
# 向量化与索引示例代码
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS

embeddings = OpenAIEmbeddings()
vector_store = FAISS.from_texts(chunks, embeddings)

# 保存索引
vector_store.save_local("my_faiss_index")

2. 检索策略进阶

高效检索不仅仅是简单的向量匹配,还包括:

a) 混合检索

结合多种检索策略:

  • 语义检索(向量相似度)
  • 关键词检索(BM25等)
  • 元数据过滤(时间、来源等)

b) 多步检索

  • 先检索大量候选文档
  • 通过重排序模型进一步精确相关性
  • 可能包括多轮检索精炼
RAG 高级检索策略 ? 用户问题: "如何有效降低企业碳排放?" 问题分析 (提取关键词、意图识别、查询扩展) 企业 碳排放 降低 有效 混合检索策略 [v] 向量相似度检索 BM25 关键词检索 元数据过滤 高级检索技术 多步检索与重排序 查询分解与合并 语义缓存 知识增强 知识图谱集成 实体链接 上下文学习 检索结果集成与排序

c) 检索质量评估

  • 相关性评分
  • 多样性度量
  • 重复内容检测

3. 增强生成质量

高质量生成需要多个技术手段:

a) 提示模板优化

  • 明确指令和格式要求
  • 包含系统角色和行为约束
  • 结构化提示有助于LLM更好理解和执行任务

b) 上下文管理

  • 压缩检索文本以适应上下文窗口
  • 选择性包含最相关信息
  • 多级上下文组织(先概览,后细节)
1
2
3
4
5
6
7
8
9
10
11
12
# 上下文压缩示例
def compress_context(retrieved_docs, max_tokens=3000):
compressed_docs = []
current_tokens = 0

for doc in sorted(retrieved_docs, key=lambda d: d.relevance_score, reverse=True):
doc_tokens = len(tokenizer.encode(doc.content))
if current_tokens + doc_tokens <= max_tokens:
compressed_docs.append(doc.content)
current_tokens += doc_tokens

return compressed_docs

c) 幻觉检测与减少

  • 生成后验证机制
  • 引用追踪
  • 确保回答内容有证据支持

四、RAG性能对比与优势

与传统LLM相比,RAG在多个维度上都有显著优势:

特性 传统LLM RAG系统
知识时效性 仅限训练数据截止日 可实时更新
知识深度 通用知识,专业领域有限 可集成专业知识库
信息准确性 容易产生幻觉 基于检索信息,更准确
可追溯性 难以提供信息来源 可提供明确引用
个性化 有限 可集成个人/组织知识
隐私保护 训练数据潜在泄露 可控制知识来源
RAG与传统LLM准确性对比 基于研究数据的不同场景下预测准确率 通用知识 专业领域 最新信息 组织专有知识 0% 25% 50% 75% 100% 87% 65% 25% 10% 93% 88% 85% 89% 传统LLM RAG系统 数据来源: 综合多项公开研究与实验报告 (Gao et al., 2023; Lewis et al., 2022; Wang et al., 2023) 例: 历史、地理、基础科学 例: 医学、法律、金融 例: 2023年之后发生事件 例: 企业内部文档、流程 最显著的准确性差异区域

五、RAG的实际应用场景

RAG已在多个领域展现了强大价值:

1. 企业知识管理

  • 内部文档问答:员工可以直接询问公司政策、产品规格等信息
  • 客户支持:基于产品手册和支持文档回答客户问题
  • 知识库自动化:更高效地整合和检索企业知识

2. 专业领域应用

  • 医疗:基于医学文献和临床指南提供信息支持
  • 法律:检索相关法规和判例
  • 研究:科研文献检索与分析

3. 个性化信息服务

  • 个人助手:基于个人笔记、邮件和文档的智能助手
  • 学习工具:基于教材和学习资料的个性化学习辅助

六、RAG的技术挑战与未来发展

1. 当前挑战

  • 长文本处理:如何有效索引和检索长文档
  • 多模态内容:图像、音频等非文本内容的检索
  • 实时性能:降低检索延迟,提高用户体验
  • 上下文窗口限制:如何在有限窗口中包含更多相关信息

2. 未来发展方向

a) 自适应RAG

  • 系统根据问题复杂度动态调整检索策略
  • 学习用户偏好和查询模式
1
2
3
4
5
6
7
8
9
10
def adaptive_retrieval(query, user_profile):
query_complexity = analyze_complexity(query)
user_expertise = user_profile.get('expertise_level', 'general')

if query_complexity == 'high' and user_expertise == 'expert':
return deep_technical_retrieval(query)
elif 'historical' in analyze_query_intent(query):
return temporal_aware_retrieval(query)
else:
return standard_retrieval(query)

b) 多代理RAG协作

  • 专门的检索代理提供知识支持
  • 多代理协作解决复杂问题
    RAG 技术发展趋势 2020-2022 2023-2024 2025+ 当前 RAG (2020-2022) 1.0 单一检索-生成流程 基本向量检索 简单提示工程 增强 RAG (2023-2024) 2.0 多策略检索 推理增强 自我评估 当前技术位置 未来 RAG (2025+) 3.0 多代理协作 持续学习能力 多模态RAG 知识蒸馏 自适应架构 细粒度知识融合 基础阶段: 知识获取 发展阶段: 知识理解 未来阶段: 知识推理 基础检索方法 检索-生成分离架构 自评估与重排序 混合检索策略 多代理系统 核心发展方向: 从简单检索到知识理解与推理 更高效、更准确、更智能的知识获取与应用

c) 多模态RAG

  • 支持图像、音频、视频等多模态内容检索
  • 跨模态理解与知识整合

d) 细粒度知识集成

  • 知识图谱与RAG的深度融合
  • 实体关系推理能力

七、构建自己的RAG系统

1. 开源工具生态

现在构建RAG系统已经有了丰富的开源工具支持:

  • LangChain/LlamaIndex:提供RAG框架和组件
  • 嵌入模型:BERT、Sentence-Transformers、OpenAI Embeddings等
  • 向量数据库:Chroma、FAISS、Pinecone、Weaviate等
  • LLM选择:开源模型(LLaMA、Mistral)或API服务(OpenAI、Claude)

2. 实现简易RAG系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma
from langchain.llms import OpenAI
from langchain.chains import RetrievalQA

# 1. 加载文档
loader = DirectoryLoader('./documents/', glob="**/*.pdf")
documents = loader.load()

# 2. 文档分块
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
chunks = text_splitter.split_documents(documents)

# 3. 创建嵌入和向量存储
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
vectorstore = Chroma.from_documents(chunks, embeddings)

# 4. 创建检索器
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})

# 5. 设置LLM和检索链
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever
)

# 6. 查询
query = "碳排放量计算方法有哪些?"
response = qa_chain.run(query)
print(response)

3. 评估与优化

构建RAG系统后,重要的是对其进行评估和优化:

  • 检索评估:计算召回率、精度等指标
  • 回答质量评估:由人类或自动化方式评估准确性、相关性
  • 用户反馈循环:根据实际使用情况持续优化系统

结语

RAG技术代表了AI系统从"闭卷考试"到"开卷考试"的关键转变,它解决了LLM在知识时效性、专业性和可靠性方面的核心限制。

随着检索技术、大语言模型的持续进步,以及多代理协作、多模态理解等方向的发展,RAG将进一步改变我们与AI系统交互的方式,使AI能够提供更加精确、可靠且透明的回答。

无论是企业知识管理、专业领域应用,还是个人助手,RAG都展现出巨大的应用潜力。通过深入理解RAG的本质、技术细节和实现方法,我们能够构建更加实用、强大的AI应用,让人工智能真正成为人类知识获取和处理的得力助手。


RAG:为AI配上外部记忆
http://xcq.ink/2023/09/11/RAG-为AI配上外部记忆/
作者
Xander Xu
发布于
2023年9月11日
许可协议