引言
针对大型语言模型(LLM)效果不佳的问题,早期研究主要关注大模型的再训练、微调以及 Prompt 工程。然而,对于专有数据或快速更新的数据,这些方法往往成本高昂且滞后。检索增强生成(Retrieval-Augmented Generation, RAG)技术的出现,有效弥合了 LLM 通用常识与特定领域专有数据之间的差距。
本文将深入介绍 RAG 的核心概念与理论,并演示如何利用 LangChain 框架,结合 OpenAI 语言模型和 Weaviate 矢量数据库,构建一个完整的 RAG 管道(Pipeline)。
什么是 RAG?
RAG 的全称是 Retrieval-Augmented Generation,中文译为检索增强生成。它是一个为大模型提供外部知识源的概念架构,使模型能够生成准确且符合上下文的答案,同时显著减少模型幻觉(Hallucination)。
知识更新问题
最先进的 LLM 在训练阶段接受了海量数据,将广泛的常识知识存储在神经网络的权重中。然而,当用户询问训练数据之外的知识(如最新新闻、企业内部文档等)时,LLM 的输出可能包含事实性错误,即所谓的'模型幻觉'。
因此,弥合大模型的通用常识与其他背景知识之间的差距至关重要,这有助于 LLM 生成更准确的结果。
传统解决方案的局限
传统的解决方法是通过微调(Fine-tuning)神经网络模型来适应特定领域的专有信息。尽管这种技术有效,但它属于计算密集型任务,需要专业技术知识,且难以灵活地适应不断变化的信息。一旦新数据产生,通常需要重新训练整个模型。
2020 年,Lewis 等人提出了一种更灵活的技术,称为检索增强生成(RAG)。研究人员将生成模型与检索器模块相结合,以提供来自外部知识源的附加信息,这些信息可以方便地进行更新维护,而无需重新训练模型。
简单来说,RAG 对于 LLM 来说就像学生的开卷考试。学生可以携带参考材料(如课本或笔记),用来查找相关信息回答问题。测试的重点在于推理能力,而非死记硬背。
同样,事实知识与 LLM 的推理能力分离,并存储在外部知识源中,可以轻松访问和更新:
- 参数知识:在训练期间学习到的知识,隐式存储在神经网络的权重中。
- 非参数知识:存储在外部知识源中,例如向量数据库。
一般的 RAG 工作流程如下:
- 检索 (Retrieve):根据用户请求从外部知识源检索相关上下文。使用嵌入模型将用户查询转换为向量,并在向量数据库中执行相似性搜索,返回最接近的前 k 个数据对象。
- 增强 (Augment):将用户查询和检索到的附加上下文填充到提示模板中。
- 生成 (Generate):将检索增强后的提示词馈送到 LLM 进行最终回答。
LangChain 实现 RAG
接下来展示如何使用 LangChain,结合 OpenAI LLM 和 Weaviate 矢量数据库在 Python 中实现 RAG Pipeline。
基础环境准备
- 安装依赖包 安装用于编排的 langchain、大模型接口 openai、矢量数据库客户端 weaviate-client 等相关 Python 包。
pip install langchain openai weaviate-client python-dotenv
-
配置 API 密钥 申请 OpenAI 账户并获取 API 密钥。在项目根目录创建
.env文件存放配置文件,避免硬编码敏感信息。 -
加载环境变量 在代码中使用
python-dotenv包加载配置文件信息。
from dotenv import load_dotenv
import os
load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")
向量数据库构建
矢量数据库作为保存所有附加信息的外部知识源,其构建过程包括数据加载、分块和存储。


