基于 LangChain 搭建简单 RAG 系统
基于 LangChain 搭建简单 RAG 系统
参考其官方文档:https://python.langchain.com/v0.2/docs/tutorials/rag/
演示如何快速搭建一套简单的 RAG 系统。
(1)安装与配置:
首先,安装 LangChain 框架及其依赖项。
# 安装LangChain框架及其依赖项
!pip install langchain langchain_community langchain_chroma
(2)数据准备与索引构建:
接下来,准备数据并构建索引。
LangChain 的 DocumentLoaders 中提供了种类丰富的文档加载器,例如,我们可以使用 WebBaseLoader 从网页中加载内容并将其解析为文本。
from langchain_community.document_loaders import WebBaseLoader
# 使用WebBaseLoader加载网页内容:
loader = WebBaseLoader("https://example.com/page")
docs = loader.load()
加载完成后,由于加载的文档可能过长,不适合模型的上下文窗口,需要将文档分割成合适的大小。
LangChain 提供了 TextSplitter 组件来实现文档分割。
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 使用TextSplitter将长文档分割成更小的块,其中chunk_size表示分割文档的长度,chunk_overlap表示分割文档间的重叠长度
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
接下来需对分割后的文本块进行索引化,以便后续进行检索。
可以调用 Chroma 向量存储模块和 OpenAIEmbeddings 模型来存储和编码文档。
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
# 使用向量存储(如Chroma)和嵌入模型来编码和存储分割后的文档
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())
(3)RAG 系统构建:
构建好知识源后,接下来开始构建基础 RAG 系统。该系统包括检索器与生成器,具体工作流程如下:
-
对于用户输入的问题,检索器首先搜索与该问题相关的文档,
-
接着将检索到的文档与初始问题一起传递给生成器,即大语言模型,
-
最后将模型生成的答案返回给用户。
首先进行检索器构建,这里可基于 VectorStoreRetriever 构建一个 Retriever 对象,利用向量相似性进行检索。
# 创建检索器
retriever = vectorstore.as_retriever()
接下来是生成器部分的构建,这里可使用 ChatOpenAI 系统模型作为生成器。
这一步,需设置 OpenAI 的 API 密钥,并指定要使用的具体模型型号。例如,我们可以选择使用 gpt-3.5-turbo-0125 模型。
import os
os.environ["OPENAI_API_KEY"] = 'xxx'
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo-0125")
随后是输入 Prompt 的设置,LangChain 的 Prompt Hub 中提供了多种预设的 Prompt 模板,适用于不同的任务和场景。这里我们选择一个适用于 RAG 任务的 Prompt。
from langchain import hub
# 设置提示模板
prompt = hub.pull("rlm/rag-prompt")
最后我们需要整合检索与生成,这里可以使用LangChain表达式语言(LangChain Execution Language,LCEL)来方便快捷地构建一个链,将检索到的文档、构建的输入 Prompt 以及模型的输出组合起来。
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
# 使用LCEL构建RAG链
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# 定义文档格式化函数
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
# 使用RAG链回答问题
response = rag_chain.invoke("What is Task Decomposition?")
print(response)
通过以上步骤,我们可以方便快捷地使用 LangChain 迅速搭建一个基础 RAG 系统。LangChain 提供了一系列强大的工具和组件,使得构建和整合检索与生成过程变得简单而高效。
声明:资源可能存在第三方来源,若有侵权请联系删除!