检索增强生成 (RAG)
先决条件
概述
检索增强生成 (RAG) 是一种强大的技术,通过将大型语言模型与外部知识库相结合来增强它们。 RAG 解决了模型的一个关键局限性:模型依赖于固定的训练数据集,这可能导致信息过时或不完整。 当给出查询时,RAG 系统首先从知识库中搜索相关信息。 然后,系统将此检索到的信息整合到模型的提示中。 模型利用提供的上下文来生成对查询的响应。 通过弥合大型语言模型与动态、定向信息检索之间的差距,RAG 成为构建更强大、更可靠的 AI 系统的有力技术。
关键概念

(1) 检索系统:从知识库中检索相关信息。
(2) 添加外部知识:将检索到的信息传递给模型。
检索系统
模型拥有内部知识,这些知识通常是固定的,或者由于训练成本高昂而更新不频繁。 这限制了它们回答有关时事问题的能力,或提供特定领域知识的能力。 为了解决这个问题,有各种知识注入技术,如微调或继续预训练。 两者都成本高昂,并且通常不适合事实检索。 使用检索系统有几个优点:
- 最新信息:RAG 可以访问和利用最新数据,使响应保持最新。
- 特定领域专业知识:通过特定领域的知识库,RAG 可以针对特定领域提供答案。
- 减少幻觉:将响应建立在检索到的事实基础上,有助于最小化虚假或捏造的信息。
- 经济高效的知识集成:RAG 提供了一种比昂贵的模型微调更有效率的替代方案。
延伸阅读
请参阅我们关于检索的概念指南。
添加外部知识
在检索系统就位后,我们需要将来自该系统的知识传递给模型。 RAG 管道通常通过以下步骤来实现这一点:
- 接收输入查询。
- 使用检索系统根据查询搜索相关信息。
- 将检索到的信息整合到发送给 LLM 的提示中。
- 生成利用检索到的上下文的响应。
例如,这是一个简单的 RAG 工作流程,它将信息从检索器传递到聊天模型:
from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage
# 定义一个系统提示,告诉模型如何使用检索到的上下文
system_prompt = """You are an assistant for question-answering tasks.
Use the following pieces of retrieved context to answer the question.
If you don't know the answer, just say that you don't know.
Use three sentences maximum and keep the answer concise.
Context: {context}:"""
# 定义一个问题
question = """What are the main components of an LLM-powered autonomous agent system?"""
# 检索相关文档
docs = retriever.invoke(question)
# 将文档合并为一个字符串
docs_text = "".join(d.page_content for d in docs)
# 使用检索到的上下文填充系统提示
system_prompt_fmt = system_prompt.format(context=docs_text)
# 创建一个模型
model = ChatOpenAI(model="gpt-4o", temperature=0)
# 生成响应
questions = model.invoke([SystemMessage(content=system_prompt_fmt),
HumanMessage(content=question)])