Skip to main content
在 GitHub 上打开

工具调用

先决条件

概述

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

信息

您有时会听到这个词function calling.我们将这个术语与tool calling.

工具调用的概念概述

关键概念

(1) 工具创建:使用 @tool 装饰器创建工具。工具是函数与其架构之间的关联。(2) 工具绑定:工具需要连接到支持工具调用的模型。这使模型能够识别工具以及工具所需的关联输入方案。(3) 工具调用:在适当的时候,模型可以决定调用工具并确保其响应符合工具的输入模式。(4) 工具执行:可以使用模型提供的参数执行工具。

工具调用的概念部分

此伪代码说明了使用工具调用的推荐工作流程。 创建的工具将传递给.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 参考:工具
延伸阅读
  • 有关更多详细信息,请参阅我们的工具概念指南。
  • 请参阅支持工具调用的模型集成
  • 请参阅我们的工具调用操作指南

工具装订

许多模型提供程序都支持工具调用。

提示

有关支持工具调用的提供程序列表,请参阅我们的模型集成页面

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

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])

工具调用

模型调用工具的图表

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

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

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

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 的模型将比非微调模型更擅长工具调用。
  • 如果工具具有精心选择的名称和描述,则模型的性能会更好。
  • 简单、范围狭窄的工具比复杂的工具更容易被模型使用。
  • 要求模型从大量工具中进行选择会给模型带来挑战。