LangChain 专题4 工具介绍
工具概述
LangChain 中的工具(Tool)抽象将一个 Python 函数与定义该函数名称、描述和预期参数的规范关联起来。
工具可以传递给支持工具调用的聊天模型,从而允许模型请求使用特定输入执行特定功能。
关键概念
- 工具是一种封装函数及其模式的方法,可以将其传递给聊天模型。
- 使用
@tool
注解创建工具,可以简化工具创建的过程,支持以下功能:- 自动推断工具的名称、描述和预期参数,同时支持自定义。
- 定义返回制品的工具(例如图像、数据框等)。
- 使用注入的工具参数隐藏模式中的输入参数(从而隐藏模型中的输入参数)。
工具接口
工具接口定义在 BaseTool 类中,BaseTool 是 Runnable 接口的一个子类。
与该工具的架构相对应的关键属性有:
- name: 工具的名称。
- description: 描述工具的功能。
- args: 返回工具参数的JSON模式的属性。
执行相关工具的功能所采用的关键方法有:
- invoke: 使用给定参数调用工具。
- ainvoke: 使用给定参数异步调用工具。用于与 LangChain 配合使用进行异步编程。
工具的创建和直接使用
推荐使用 @tool 注解器创建工具。这个装饰器旨在简化工具创建的过程,在大多数情况下都应该使用。 定义了一个函数后,可以使用 @tool 注解来创建一个实现工具接口的工具,并直接使用定义的工具函数。例如:
|
|
如何配置工具模式和自定义工具,后续专题将继续介绍。
工具制品(Tool artifacts)
Tool 是可被模型调用的实用工具,其输出设计用于反馈给模型。 然而,有时候我们希望将工具执行过程中产生的制品暴露给链路或代理中的下游组件。 但我们不想将其暴露给模型本身。例如,如果工具返回自定义对象、数据框或图像。 我们可能希望在不将实际输出传给模型的的情况下,将一些元数据传递给模型。 同时,我们可能希望能够在其他地方访问这份完整的输出,例如在下游工具中。 此时,我们可以定义工具函数,使其同时返回暴露给模型的消息和暴露给下游组件的制品,示例如下:
|
|
后续专题将继续介绍工具制品的创建和使用场景。
特殊类型注解
有许多特殊类型注释可用于工具的函数签名中,以配置工具的运行时行为。
以下类型的注释最终会从工具的模式中移除该参数。这对于不应该暴露给模型的参数以及模型不应该能够控制的参数是有用的。
- InjectedToolArg:应在运行时手动使用 .invoke 或 .ainvoke 注入值。
- RunnableConfig:将 RunnableConfig 对象传入工具。
- InjectedState:将 LangGraph 图的整体状态传入工具。
- InjectedStore:将 LangGraph 存储对象传入工具。
可以使用带字符串常量的注解类型来为相应的参数提供一个描述,而这个描述将被包含在工具的模式中。
- Annotated[…, “string literal”]: 为工具的模式中暴露的参数添加描述。
下面介绍 InjectedToolArg 和 RunnableConfig 两种特殊类型注解,另外两种在介绍 LangGraph 时再详细介绍。
InjectedToolArg
存在一些情况,需要在运行时传递给某个工具某些参数,但这些参数不应该由模型本身生成。 为此,我们使用注入工具参数类型注解(InjectedToolArg),它允许将某些参数隐藏在工具的模式中。
例如,如果一个工具需要在运行时动态注入user_id
,则可以以下方式注入参数:
|
|
使用 InjectedToolArg 作为参数 user_id
的类型注解,可以告知 LangChain 此参数不应作为工具模式的组成部分暴露出来。
关于更多 InjectedToolArg 的细节,以及如何在运行时传递参数,将在后续专题中介绍。
RunnableConfig
可以使用 RunnableConfig 对象将自定义的运行时值传递给工具。 如果需要在工具中访问 RunnableConfig 对象。这可以通过在工具的函数签名中使用 RunnableConfig 注解来实现。
|
|
config
不纳入工具的模式中,而是在运行时注入适当的值。
最佳实践
在设计用于模型的工具时,请记住以下几点:
- 命名正确、文档齐全且类型提示正确的工具更容易被模型使用。
- 设计简单、作用范围狭窄的工具,因为模型更容易正确使用。
- 使用支持工具调用 API 的聊天模型,以利用工具。
工具包
LangChain 有一个工具包(Toolkits)的概念。这是一个非常薄的抽象,它将工具组合在一起,旨在一起用于特定任务。
所有工具包都暴露了一个名为 get_tools 的方法,该方法返回一个工具列表。因此,可以进行如下操作:
|
|