Bootstrap

使用 LangChain 掌握检索增强生成 (RAG) 的终极指南:4、逻辑路由与语义路由的实现

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
;