LangChain 专题5 工具调用
工具调用概述
许多人工智能应用直接与人类交互。在这些情况下,模型需要用自然语言回应。 但是,当我们希望模型也能直接与系统(如数据库或 API)交互时,又该如何呢? 这些系统通常有一个特定的输入模式;例如,API 经常有一个必需的负载结构。 这种需求促使了工具调用(Tool calling)的概念。可以使用工具调用来请求符合特定模式的模型响应。
关键概念
(1) 工具创建:使用 @tool 装饰器创建工具。工具是函数与其模式之间的关联。
(2) 工具绑定:工具需要连接到一个支持工具调用的模型。这让模型意识到工具,并且知道工具所关联的输入模式。
(3) 工具调用:当适当的时候,模型可以决定调用一个工具,并确保其响应符合工具的输入模式。
(4) 工具执行:模型提供的参数可用于执行工具。
推荐用法
以下伪代码说明了使用工具调用的推荐工作流程。创建的工具作为一个列表传递给 .bind_tools()
方法。
这种模型可以像往常一样调用。如果进行工具调用,模型响应将包含工具调用参数。工具调用参数可以直接传递给工具。
|
|
工具创建
推荐创建工具的方式是使用 @tool 注解。
|
|
工具绑定
许多模型提供商支持工具调用。 查看支持工具调用的模型,参考:聊天模型。
理解的核心概念是 LangChain 提供了一个标准化接口,用于连接工具和模型。.bind_tools()
方法可以用于指定模型可以调用的工具。
|
|
以下是一个具体的例子,假设有一个名为 multiply 的函数,并将其绑定为一个支持工具调用模型中的工具。
|
|
工具调用
工具调用的一项关键原则是:模型会根据输入的相关性来决定何时使用工具。模型不一定总是需要调用工具。例如,对于一个无关的输入,模型不会调用工具。
|
|
结果将是一个包含模型自然语言回复的AIMessage(如“Hello!”)。不过,如果我们传入与工具相关的输入,模型应该选择调用它:
|
|
与之前一样,输出结果将是一个 AIMessage。 但是,如果调用的是工具,结果将有一个 tool_calls 属性。这个属性包括执行工具所需的一切内容,包括工具名称和输入参数:
|
|
工具实现 Runnable 接口,这意味着它们可以被直接调用(例如,tool.invoke(args)
)。
LangGraph 提供预构建的组件(例如 ToolNode),这些组件通常会代表用户调用该工具。
最佳实践
当设计用于模型的工具时,重要的是要记住以下几点:
- 具有明确工具调用 API 的模型在工具调用方面会比未微调的模型表现得更好。
- 如果工具选择了合适的名称和描述,模型的表现会更好。
- 简单、窄域的工具比复杂的工具更容易被模型使用。
- 要求模型从大量工具中进行选择,对模型提出了挑战。