Langchain自定义Tool的三种方式
在构建你自己的智能体(Agent)时,你会需要提供一系列供它使用的工具(Tools)。除了被调用的函数,Tool还由以下部分组成接下来,我会以一个谷歌搜索工具来演示如何自定义Tool。
·
在构建你自己的智能体(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'}}
更多推荐
已为社区贡献3条内容
所有评论(0)