检索增强生成(RAG)
先决条件
概览
检索增强生成(RAG)是一种强大的技术,通过将语言模型与外部知识库结合来提升其能力。 RAG解决了模型的一个关键局限:模型依赖于固定的训练数据集,这可能导致信息过时或不完整。 当收到查询时,RAG系统首先在知识库中搜索相关信息。 然后,系统将检索到的信息纳入模型的提示中。 模型利用提供的上下文来生成对查询的回答。 通过弥合庞大语言模型与动态、有针对性的信息检索之间的差距,RAG是一种构建更强大、更可靠人工智能系统的有力技术。
核心概念

(1) 检索系统: 从知识库中检索相关信息。
(2) 添加外部知识: 将检索到的信息传递给模型。
检索系统
模型内部的知识通常是固定的,或者至少不会频繁更新,因为训练成本很高。 这限制了它们回答当前事件问题或提供特定领域知识的能力。 为了解决这个问题,有各种知识注入技术,比如微调或持续预训练。 这两种方法都成本高昂,并且通常不适合事实检索。 使用检索系统具有以下优势:
- 最新信息: RAG可以访问和利用最新数据,确保回答保持时效性。
- 领域专业知识: 通过领域特定的知识库,RAG可以在特定领域提供答案。
- 减少幻觉: 将回答基于检索到的事实,有助于减少虚假或编造的信息。
- 成本效益的知识集成: RAG 提供了一种比昂贵的模型微调更高效的替代方案。
更多阅读
查看我们关于检索的概念指南。
添加外部知识
有了检索系统之后,我们需要将该系统中的知识传递给模型。 RAG 流水线通常按照以下步骤实现:
- 接收一个输入查询。
- 使用检索系统根据查询搜索相关信息。
- 将检索到的信息纳入发送给大语言模型(LLM)的提示中。
- 生成一个利用检索到的上下文进行回答的响应。
例如,以下是一个简单的RAG工作流程,它将信息从检索器传递到聊天模型:
from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage
# Define a system prompt that tells the model how to use the retrieved context
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}:"""
# Define a question
question = """What are the main components of an LLM-powered autonomous agent system?"""
# Retrieve relevant documents
docs = retriever.invoke(question)
# Combine the documents into a single string
docs_text = "".join(d.page_content for d in docs)
# Populate the system prompt with the retrieved context
system_prompt_fmt = system_prompt.format(context=docs_text)
# Create a model
model = ChatOpenAI(model="gpt-4o", temperature=0)
# Generate a response
questions = model.invoke([SystemMessage(content=system_prompt_fmt),
HumanMessage(content=question)])