跳到主要内容

工具调用

先决条件

概述

许多人工智能应用程序直接与人类交互。在这些情况下,模型以自然语言响应是合适的。但是,如果我们希望模型也直接与系统(如数据库或API)交互呢?这些系统通常具有特定的输入模式;例如,API 通常需要特定的有效负载结构。这种需求促生了工具调用的概念。您可以使用工具调用来请求与特定模式匹配的模型响应。

信息

您有时会听到术语 function calling(函数调用)。我们交替使用此术语和 tool calling(工具调用)。

Conceptual overview of tool calling

关键概念

(1)工具创建: 使用 @tool 装饰器创建一个 工具。工具是函数及其模式之间的关联。 (2)工具绑定: 该工具需要连接到支持工具调用的模型。这使模型能够了解该工具以及该工具所需的关联输入模式。 (3)工具调用: 在适当的情况下,模型可以决定调用工具并确保其响应符合工具的输入模式。 (4)工具执行: 可以使用模型提供的参数执行该工具。

Conceptual parts of tool calling

此伪代码说明了使用工具调用的推荐工作流程。创建的工具作为列表传递给 .bind_tools() 方法。可以像往常一样调用此模型。如果进行了工具调用,则模型的响应将包含工具调用参数。工具调用参数可以直接传递给工具。

# Tool creation
tools = [my_tool]
# Tool binding
model_with_tools = model.bind_tools(tools)
# Tool calling
response = model_with_tools.invoke(user_input)

工具创建

创建工具的推荐方法是使用 @tool 装饰器。

from langchain_core.tools import tool

@tool
def multiply(a: int, b: int) -> int:
"""Multiply a and b."""
return a * b
API 参考:tool
进一步阅读
  • 有关更多详细信息,请参阅我们关于工具的概念指南。
  • 请参阅我们支持工具调用的模型集成
  • 请参阅我们关于工具调用的操作指南

工具绑定

许多模型提供商支持工具调用。

提示

请参阅我们的模型集成页面,以获取支持工具调用的提供商列表。

要理解的核心概念是,LangChain 为将工具连接到模型提供了一个标准化接口。 .bind_tools() 方法可用于指定模型可以调用的工具。

model_with_tools = model.bind_tools(tools_list)

作为一个具体的例子,让我们取一个函数 multiply 并将其作为工具绑定到支持工具调用的模型。

def multiply(a: int, b: int) -> int:
"""Multiply a and b.

Args:
a: first int
b: second int
"""
return a * b

llm_with_tools = tool_calling_model.bind_tools([multiply])

工具调用

Diagram of a tool call by a model

工具调用的一项关键原则是,模型会根据输入的关联性来决定何时使用工具。模型并不总是需要调用工具。例如,给定一个不相关的输入,模型将不会调用该工具

result = llm_with_tools.invoke("Hello world!")

结果将是一个包含模型自然语言响应的 AIMessage(例如,“你好!”)。但是,如果我们传递一个与工具相关的输入,模型应选择调用它

result = llm_with_tools.invoke("What is 2 multiplied by 3?")

与之前一样,输出 result 将是一个 AIMessage。但是,如果调用了工具,则 result 将具有 tool_calls 属性。此属性包括执行该工具所需的一切,包括工具名称和输入参数

result.tool_calls
{'name': 'multiply', 'args': {'a': 2, 'b': 3}, 'id': 'xxx', 'type': 'tool_call'}

有关更多使用详细信息,请参阅我们的操作指南

工具执行

工具实现了Runnable接口,这意味着可以直接调用它们(例如,tool.invoke(args))。

LangGraph 提供了预构建组件(例如,ToolNode),这些组件通常会代表用户调用工具。

进一步阅读

最佳实践

在设计要由模型使用的工具时,请务必记住以下几点:

  • 具有显式工具调用 API 的模型将比未经微调的模型更擅长工具调用。
  • 如果工具具有精心选择的名称和描述,模型将表现更好。
  • 简单的、范围狭窄的工具比复杂的工具更易于模型使用。
  • 要求模型从大量工具列表中进行选择对模型构成挑战。

此页面是否有帮助?