LangGraph 检索代理
! pip install langchain_community tiktoken langchain-openai langchainhub chromadb langchain langgraph
检索器
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
# 需要加载的网页URL列表
urls = [
"https://lilianweng.github.io/posts/2023-06-23-agent/",
"https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/",
"https://lilianweng.github.io/posts/2023-10-25-adv-attack-llm/",
]
# 从URL加载文档
docs = [WebBaseLoader(url).load() for url in urls]
# 将文档展平成单个列表
docs_list = [item for sublist in docs for item in sublist]
# 使用递归字符文本拆分器进行文本拆分
text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
chunk_size=100, # 每个文本块的大小
chunk_overlap=50 # 文本块之间的重叠部分大小
)
doc_splits = text_splitter.split_documents(docs_list)
# 添加到向量数据库
vectorstore = Chroma.from_documents(
documents=doc_splits,
collection_name="rag-chroma", # 向量数据库集合名称
embedding=OpenAIEmbeddings(), # 使用OpenAI的嵌入模型
)
# 将向量数据库作为检索器
retriever = vectorstore.as_retriever()
from langchain.tools.retriever import create_retriever_tool
# 创建检索工具
tool = create_retriever_tool(
retriever,
"retrieve_blog_posts", # 工具名称
"Search and return information about Lilian Weng blog posts.", # 工具描述
)
tools = [tool]
from langgraph.prebuilt import ToolExecutor
# 创建工具执行器
tool_executor = ToolExecutor(tools)
代理状态
我们将定义一个图。
一个state
对象会被传递给每个节点。
我们的状态将是一个messages
列表。
图中的每个节点都会向它附加信息。
import operator
from typing import Annotated, Sequence, TypedDict
from langchain_core.messages import BaseMessage
# 定义代理状态类,包含消息列表