核心模块(Modules)
代理(Agents)
代理类型(AgentTypes)
工具调用(ToolCalling)

工具调用代理

工具调用 允许模型检测何时应调用一个或多个工具,并响应应传递给这些工具的输入。在 API 调用中,您可以描述工具,并让模型智能选择输出一个结构化对象,比如 JSON,其中包含调用这些工具所需的参数。工具 API 的目标是比使用通用文本完成或聊天 API 更可靠地返回有效和有用的工具调用。

我们可以利用这种结构化输出,结合您可以将多个工具绑定到工具调用聊天模型,并允许模型选择调用哪一个,从而创建一个代理,反复调用工具并接收结果,直到查询解决为止。

这是OpenAI 工具代理的更通用版本,它专为 OpenAI 的特定风格的工具调用设计。它使用 LangChain 的 ToolCall 接口来支持更广泛的提供者实现,例如AnthropicGoogle GeminiMistral,还有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)
:::