在构建你自己的智能体(Agent)时,你会需要提供一系列供它使用的工具(Tools)。除了被调用的函数,Tool还由以下部分组成

  • 名称(name: str),必填且需要唯一
  • 描述(description: str)可选但是建议填写,可以供agent参考是否需要调用Tool
  • 参数schema(args_schema : Pydantic BaseModel) 可选但是建议填写,可以用于提供额外信息,如少样本学习的例子或者对期望参数的校验。

接下来,我会以一个谷歌搜索工具来演示如何自定义Tool

一、@tool 装饰器

search_wrapper = GoogleSearchClient()

@tool("my_search_tool")
def search(query: str) -> list[str]:
    """通过搜索引擎查询"""
    result = search_wrapper.search(query)
    return [res["snippet"] for res in result]

print(search.name)
print(search.description)
print(search.args)
my_search_tool
my_search_tool(query: str) -> list[str] - 通过搜索引擎查询
{'query': {'title': 'Query', 'type': 'string'}}

用装饰器来定义Tool是最简单的方式,会默认函数名作为Tool的名称。你也可以多传一个string类型的参数来覆盖名称。此外,装饰器会使用函数的注释作为tool的描述,所以函数必须有注释。

二、继承 BaseTool类

你可以自定义一个集成了BaseTool类的工具,这样你可以完全控制tool的定义,不过得多写点代码

class SearchQuery(BaseModel):
    query: str = Field(..., description="要查询的query")

class CustomSearchTool(BaseTool):
    name = "my_search_tool_class"
    description = "通过搜索引擎来查询信息"
    args_schema: Type[BaseModel] = SearchQuery

    def _run(self, query: str) -> list[str]:
        """调用工具"""
        result = search_wrapper.search(query)
        return [res["snippet"] for res in result]


search = CustomSearchTool()
print(search.name)
print(search.description)
print(search.args)
my_search_tool_class
通过搜索引擎来查询信息
{'query': {'title': 'Query', 'description': '要查询的query', 'type': 'string'}}

三、用StructuredTool类提供的函数

你也可以用dataclass:StructuredTool。这种方法有点类似于上面两种方法的混合,比继承类方便,比用decorator的功能多

def search(query: str) -> list[str]:
    """通过搜索引擎查询"""
    result = search_wrapper.search(query)
    return [res["snippet"] for res in result]


search_tool = StructuredTool.from_function(
    func=search,
    name="我的搜索方法",
    description="通过搜索引擎查询,方便又强大",
    # coroutine= ... <- 如果需要,可以指定一个异步方法
)

print(search_tool.name)
print(search_tool.description)
print(search_tool.args)
我的搜索方法
我的搜索方法(query: str) -> list[str] - 通过搜索引擎查询,方便又强大
{'query': {'title': 'Query', 'type': 'string'}}
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐