构建强大LangChain代理:使用AgentExecutor的完整指南

291 阅读3分钟

构建强大LangChain代理:使用AgentExecutor的完整指南

引言

语言模型(LLM)本身无法执行操作,但通过LangChain,我们可以创建代理(agents),它们利用LLM作为推理引擎来决定要采取的行动和相应的输入。本教程将引导您如何使用LangChain的AgentExecutor构建一个代理,该代理能够与本地数据库和搜索引擎进行交互。

主要内容

使用语言模型及其工具调用能力

LangChain使得通过语言模型进行工具调用变得简单。我们将介绍如何设置和调用不同的工具。

创建Retriever以暴露信息

通过构建一个Retriever,我们可以轻松地从本地索引中检索信息,并将其作为工具提供给我们的代理。

使用搜索工具进行在线查找

我们将使用Tavily搜索引擎的工具来实现在线信息查询。

会话历史

通过保存聊天历史,代理能够“记住”用户的先前交互,提升响应的连贯性。

使用LangSmith进行调试和追踪

随着应用复杂性的增加,对应用内部进行调试和追踪变得至关重要。LangSmith为此提供了便捷的解决方案。

代码示例

以下是一个完整的代码示例,展示如何构建一个能够调用工具的代理。

import os
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.tools.retriever import create_retriever_tool
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, AIMessage
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory

# 使用API代理服务提高访问稳定性
os.environ["TAVILY_API_KEY"] = "your_tavily_api_key"
search = TavilySearchResults(max_results=2)

loader = WebBaseLoader("https://docs.smith.langchain.com/overview")
docs = loader.load()
documents = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200).split_documents(docs)
vector = FAISS.from_documents(documents, OpenAIEmbeddings())
retriever = vector.as_retriever()
retriever_tool = create_retriever_tool(retriever, "langsmith_search", "Search for information about LangSmith.")

tools = [search, retriever_tool]

os.environ["OPENAI_API_KEY"] = "your_openai_api_key"
model = ChatOpenAI(model="gpt-4")

agent = create_tool_calling_agent(model, tools)
agent_executor = AgentExecutor(agent=agent, tools=tools)

# 运行代理
response = agent_executor.invoke({"input": "hi!"})
print(response['output'])

response = agent_executor.invoke({"input": "how can langsmith help with testing?"})
print(response['output'])

常见问题和解决方案

如何解决API访问限制?

由于某些地区的网络限制,API访问可能不稳定。为提高访问稳定性,建议使用API代理服务。

如何在本地测试代码?

建议使用Jupyter Notebook进行交互式测试,如果遇到问题(如输出异常或API不可用),可以更好地调试。

总结和进一步学习资源

本教程介绍了如何使用LangChain构建一个简单代理。代理是一个复杂的主题,涉及许多高级概念。如果您希望深入了解或构建更高级的代理,请参考以下资源:

参考资料

结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---