实施 RAG 构建多 PDF 聊天应用程序
难度等级:中级
本文将要涵盖的主要内容
- 为什么 RAG 重要?
- RAG 实际是如何工作的
- 应用 RAG 构建一个'与多个 PDF 聊天'的应用
1. 为什么 RAG 重要?
在使用像 GPT、Claude、BERT 等 LLM 模型时,您可能遇到以下问题:
- 模型虚构信息并生成不真实的答案(幻觉效应)
- 您希望模型在您自己的数据源上运行,从文本数据(pdf、doc 等)到各种类型的媒体数据(视频、音频、照片等)
- 有时,您处理非常长的内容,导致昂贵的处理成本或您的账户简单地被封锁 1-2 小时(影响您的生产力)
如果您对上述问题感同身受,是时候了解 RAG 了。
什么是 RAG?
RAG (检索增强生成) 是一种通过从外部资源获取事实来提高生成 AI 模型准确性和可靠性的技术。RAG 是一种重要的技术,因为:
- 几乎每个 LLM 都可以使用 RAG 连接几乎任何外部资源。
- RAG 使您的应用程序对我们的用户更可靠('信任')。 因为 RAG 为模型提供了可以引用的来源,就像研究论文中的脚注一样,因此用户可以检查任何声明。这建立了信任。
- 减少模型错误猜测的可能性,这种现象有时称为幻觉。
- 最后,RAG 使得这种方法比使用额外数据集重新训练模型更快且成本更低。并且它允许用户动态更换新的来源。
2. RAG 实际工作原理
从高层次来看,整个 RAG 过程分为两个阶段:
- 阶段 1(预处理): 将外部源加载到我们的系统中
- 阶段 2(推理): 在 LLM 的支持下为用户的查询生成答案
![图片:RAG 整体流程图]
让我们深入了解这两个阶段。
阶段 1:预处理阶段
![图片:数据加载与向量化流程]
1. 从外部源加载数据到文本
这个过程在 langchain 框架的支持下很容易完成。
- 在上面的例子中,我使用 PyPDFLoader 从 PDF 文件加载数据
- 在实践中,我还使用其他文档加载器从 YouTube、CSV、Confluence 等加载数据
- 你可以访问 LangChain 官方网站获取所有文档加载器的列表
2. 将文本转换为块
将文本拆分为小块,以优化信息的处理、存储和检索,同时提高 AI 系统的质量和准确性。
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 设置分块参数
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
length_function=len,
)
3. 将块嵌入向量数据库
向量数据库被认为是 RAG 实现堆栈中最常见的方式(在本文中,我也选择了一个可以轻松在本地磁盘上运行的向量数据库,即 Chroma)。选择最佳向量数据库的内容在本文中未涉及。
from langchain.vectorstores Chroma
langchain.embeddings OpenAIEmbeddings
vector_store = Chroma.from_documents(documents=documents, embedding=OpenAIEmbeddings())


