探索LangChain AgentExecutor:创建一个智能工具调用代理

139 阅读3分钟

探索LangChain AgentExecutor:创建一个智能工具调用代理

引言

语言模型(LLM)在生成文字方面表现出色,但却无法自主采取行动。LangChain通过创建"代理"来解决这个问题,代理使用LLM作为推理引擎,决定采取哪些行动及其输入是什么。本教程将指导您构建一个能够与多个工具交互的代理,包括本地数据库和搜索引擎。通过这个系统,您可以向代理提问,观察它调用工具,并与之进行对话。

主要内容

1. 使用语言模型调用工具

LangChain可以让语言模型调用工具。我们将使用Tavily搜索引擎作为工具之一,需要一个API密钥。接下来,我们将创建一个检索器来暴露特定信息给我们的代理。

2. 创建检索器

通过WebBaseLoader加载我们的数据,使用FAISS创建向量存储,并通过OpenAIEmbeddings生成嵌入。最后,将其转化为Agent可使用的工具形式。

from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter

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!",
)

3. 使用LLM进行工具调用

选择您最喜欢的语言模型,并绑定我们的工具集,由此,模型能够根据我们的问题调用合适的工具。

from langchain_openai import ChatOpenAI

model = ChatOpenAI(model="gpt-4") # 使用OpenAI模型
model_with_tools = model.bind_tools([search, retriever_tool]) # 绑定工具

4. 创建和运行代理

通过AgentExecutor将代理与工具结合起来处理输入,并根据需要执行工具。

from langchain.agents import AgentExecutor

agent = create_tool_calling_agent(model, [search, retriever_tool], prompt)
agent_executor = AgentExecutor(agent=agent, tools=[search, retriever_tool])

result = agent_executor.invoke({"input": "whats the weather in sf?"})
print(result)

代码示例

下方的代码展示了如何使用上述方法来构建一个智能代理,并调用不同的工具来回答问题。

from langchain_core.messages import HumanMessage

response = model_with_tools.invoke([HumanMessage(content="What's the weather in SF?")])

print(f"ToolCalls: {response.tool_calls}")
# 使用API代理服务提高访问稳定性

常见问题和解决方案

1. 网络限制问题

由于某些地区的网络限制,开发者可能需要考虑使用API代理服务以获得稳定的访问。

2. 工具配置问题

确保所有工具均已正确配置,包括API密钥的导出和环境变量的设置。

总结和进一步学习资源

LangChain的AgentExecutor为我们提供了强大的工具调用能力,尽管这只是一个起点。对于更高级的代理需求,建议探讨LangGraph Agents以及相关文档。

进一步学习的资源

参考资料

  • LangChain Documentation: Link
  • LangSmith Documentation: Link

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

---END---