工具调用代理
工具调用 允许模型检测何时应调用一个或多个工具,并响应应传递给这些工具的输入。在 API 调用中,您可以描述工具,并让模型智能选择输出一个结构化对象,比如 JSON,其中包含调用这些工具所需的参数。工具 API 的目标是比使用通用文本完成或聊天 API 更可靠地返回有效和有用的工具调用。
我们可以利用这种结构化输出,结合您可以将多个工具绑定到工具调用聊天模型,并允许模型选择调用哪一个,从而创建一个代理,反复调用工具并接收结果,直到查询解决为止。
这是OpenAI 工具代理的更通用版本,它专为 OpenAI 的特定风格的工具调用设计。它使用 LangChain 的 ToolCall 接口来支持更广泛的提供者实现,例如Anthropic、Google Gemini 和 Mistral,还有OpenAI。
设置
任何支持工具调用的模型都可以在这个代理中使用。您可以在这里查看哪些模型支持工具调用。
这个演示使用 Tavily (opens in a new tab),但您也可以替换成任何其他内置工具,或添加自定义工具。您需要注册一个 API 密钥,并将其设置为 process.env.TAVILY_API_KEY
。
import ChatModelTabs from "@theme/ChatModelTabs";
<ChatModelTabs customVarName="llm" />
# | output: false
# | echo: false
from langchain_anthropic import ChatAnthropic
llm = ChatAnthropic(model="claude-3-sonnet-20240229", temperature=0)
初始化工具
我们首先会创建一个可以搜索网络的工具:
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.prompts import ChatPromptTemplate
tools = [TavilySearchResults(max_results=1)]
创建代理
接下来,让我们初始化我们的工具调用代理:
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"You are a helpful assistant. Make sure to use the tavily_search_results_json tool for information.",
),
("placeholder", "{chat_history}"),
("human", "{input}"),
("placeholder", "{agent_scratchpad}"),
]
)
# 构建工具代理
agent = create_tool_calling_agent(llm, tools, prompt)
执行代理
现在,让我们初始化执行我们的代理的执行器!
# 通过传入代理和工具来创建一个代理执行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
agent_executor.invoke({"input": "what is LangChain?"})
:::tip
[LangSmith trace](https://smith.langchain.com/public/2f956a2e-0820-47c4-a798-c83f024e5ca1/r)
:::
使用聊天记录
这种类型的代理可以选择接收表示以前对话轮的聊天消息。它可以使用以前的历史记录来进行对话回复。有关更多详细信息,请参阅代理快速入门中的此部分。
from langchain_core.messages import AIMessage, HumanMessage
agent_executor.invoke(
{
"input": "what's my name? Don't use tools to look this up unless you NEED to",
"chat_history": [
HumanMessage(content="hi! my name is bob"),
AIMessage(content="Hello Bob! How can I assist you today?"),
],
}
)
:::tip
[LangSmith trace](https://smith.langchain.com/public/e21ececb-2e60-49e5-9f06-a91b0fb11fb8/r)
:::