自定义工具
NGraphX 在构建工具调用智能体时,需要为其提供一系列可使用的工具。
工具函数除了实际的函数功能实现之外,还包含以下几个部分:
属性 | 类型 | 描述 |
---|---|---|
name | str | 在提供给 LLM 或智能体的工具集中必须唯一。 |
description | str | 描述工具的功能。由 LLM 或智能体用作上下文(必要项)。 |
args_schema | Pydantic BaseModel | 可选但推荐使用,可用于提供更多信息(例如,少量示例)或验证预期参数。 |
return_direct | boolean | 仅对智能体相关。当为 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.")