4. 路由
当我们拥有多个数据源,例如图形数据库(GraphDB)、PDF文档(即向量存储)时,我们可能需要根据正确的数据源回答用户查询。例如,如果用户想了解医院的评论,用户查询应重定向到包含医院评论嵌入的向量存储。另一方面,如果用户想了解医生、病人、他们访问医院的信息,用户查询可能应该发送到包含医院信息的图形数据库。因此,为了提供这样的功能,我们现在将重点放在RAG中的“路由”功能与LangChain的结合使用上。
在本节中,我们将讨论两种主要的路由技术,即逻辑路由和语义路由。
首先,我们导入我们的库,并创建两个向量存储,我们将用户查询重定向到这些存储。
# 导入环境变量扩展
%load_ext dotenv
%dotenv secrets/secrets.env
# 导入所需的库
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_core.output_parsers import StrOutputParser
from langchain import hub
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
generate_vectorstores
函数用于创建向量存储,它接受一个文件路径和一个目录作为参数。这个函数首先使用 PyPDFLoader
加载PDF文件,然后使用 RecursiveCharacterTextSplitter
将文档分割成小块,最后使用 Chroma
创建向量存储,并使用 OpenAIEmbeddings
作为嵌入模型。
def generate_vectorstores(file, dir):
# 使用PyPDFLoader加载PDF文件
loader = PyPDFLoader(file)
documents = loader.load()
# 使用RecursiveCharacterTextSplitter分割文本
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=20