跳到主要内容

自定义工具

NGraphX 在构建工具调用智能体时,需要为其提供一系列可使用的工具。

工具函数除了实际的函数功能实现之外,还包含以下几个部分:

属性类型描述
namestr在提供给 LLM 或智能体的工具集中必须唯一。
descriptionstr描述工具的功能。由 LLM 或智能体用作上下文(必要项)。
args_schemaPydantic BaseModel可选但推荐使用,可用于提供更多信息(例如,少量示例)或验证预期参数。
return_directboolean仅对智能体相关。当为 True 时,调用给定工具后,智能体将停止并直接将结果返回给用户。

使用普通函数创建工具

这是自定义工具的最简单方法。装饰器默认使用函数名作为工具名,但可以通过传递字符串作为第一个参数来覆盖。此外,装饰器将使用函数的 docstring 作为工具的描述,因此必须提供 docstring

from langchain_core.tools import tool

@tool
def multiply(a: int, b: int) -> int:
"""乘以两个数字。"""
return a * b

# 查看工具的一些属性。
print(multiply.name)
print(multiply.description)
print(multiply.args)

# 输出:
# multiply
# 乘以两个数字。
# {'a': {'title': 'A', 'type': 'integer'}, 'b': {'title': 'B', 'type': 'integer'}}

以下是 @tool 更为详细的使用说明:

@tool 装饰器

@tool 支持解析注解、嵌套模式和其他功能:

from langchain_core.tools import tool
from typing import Annotated, List

@tool
async def amultiply(a: int, b: int) -> int:
"""乘以两个数字。"""
return a * b

@tool
def multiply_by_max(
a: Annotated[str, "scale factor"],
b: Annotated[List[int], "list of ints over which to take maximum"],
) -> int:
"""将 a 乘以 b 的最大值。"""
return a * max(b)

@tool docstring 解析

@tool 可以可选地解析 Google 风格的 docstring 并将 docstring 的组件(例如参数描述)关联到工具模式的相关部分。

from langchain.pydantic_v1 import BaseModel, Field

# 构造更复杂的嵌套参数(JSON)并校验参数值传递的正确性
class CalculatorInput(BaseModel):
a: int = Field(description="第一个数字")
b: int = Field(description="第二个数字")

# 自定义工具名和 JSON 参数。
@tool("multiplication-tool", args_schema=CalculatorInput, return_direct=True)
def multiply(a: int, b: int) -> int:
"""乘以两个数字。"""
return a * b

# 查看工具的一些属性。
print(multiply.name)
print(multiply.description)
print(multiply.args)
print(multiply.return_direct)

# 输出:
# multiplication-tool
# 乘以两个数字。
# {'a': {'title': 'A', 'description': '第一个数字', 'type': 'integer'}, 'b': {'title': 'B', 'description': '第二个数字', 'type': 'integer'}}
# True

处理工具错误

主动错误处理,在函数内部只需简单抛出错误即可,NGraphX 将携带错误信息反馈给智能体进行自我纠错。

raise Exception("SomeError.")