5分钟了解agentscope Group tools原理
当一个agent绑定tool的时候,每个tool的func json schema会常驻agent的上下文中。
随着tool数的不断增加,上下文总token会变很长,会导致下列问题:
1、大量的json schema导致上下文很长,分散了LLM的注意力。
2、tool很多,agent可能选不对tool。
3、增加了LLM预处理token耗时(TTFT增大)。
在模型固化后,常见的优化办法:
1、路由tool分组,每组tool绑定到自己的agent上。
2、向量检索tool。
3、agent自己选择tool group(agentscope实现)。
4、响应预填充(manus提出的)。
5、kvCache缓存。
一、agentscope group tool使用
from agentscope.tool import Toolkit
# 初始化 Toolkit
toolkit = Toolkit()
# 创建工具组
toolkit.create_tool_group(
group_name="web_search",
description="用于网络搜索的工具集合",
active=False,
notes="使用这些工具时请先确认关键词的有效性"
)
toolkit.create_tool_group(
group_name="file_ops",
description="文件操作工具集合",
active=True, # 初始激活
notes="操作文件时请确保路径正确,注意权限问题"
)
上面代码创建了web_search、file_ops两个tool group,下面注册google_search tool,并通过group_name绑定到tool group上:
def google_search(query: str) -> str:
"""在 Google 上搜索"""
return f"Search result for: {query}"
toolkit.register_tool_function(
google_search,
group_name="web_search" # 属于 web_search 组
)
二、agentscope是如何自动选择tool group的

ReActAgent在开启自动tool group后,会默认注册reset_equipped_tools tool,它就是用来让agent自己决定激活哪个tool group,也就是agent在决定要使用工具前,先调用reset_equipped_tools,来激活最终要使用的tool group。
reset_equipped_tools默认绑定到group_name=basic的tool group,basic一定会被激活,它是agent的默认要激活的tool group。
reset_equipped_tools会接受类似 {“web_search”: True、“file_ops”: False} 的输入,这个输入代表web_search group被激活,reset_equipped_tools内部会把web_search group置为激活状态。
三、agent是怎么把激活的tool group添加到上下文的
每次任务调用agent的时候,ReActAgent调用堆栈:
self.reply(“agent入口”) --> self._reasoning(“推理”) --> self.toolkit.get_json_schemas(“获取tool组json schema”)

self.toolkit.get_json_schemas():
def get_json_schemas(
self,
) -> list[dict]:
if "reset_equipped_tools" in self.tools:
fields = {}
for group_name, group in self.groups.items():
# basic组里的工具一定会激活
if group_name == "basic":
continue
fields[group_name] = (
bool,
Field(
default=False,
description=group.description,
),
)
# extended_model存放的组元信息
extended_model = create_model("_DynamicModel", **fields)
self.set_extended_model(
"reset_equipped_tools",
extended_model,
)
# 这里只会选激活的tool组
return [
tool.extended_json_schema
for tool in self.tools.values()
if tool.group == "basic" or self.groups[tool.group].active
]
从get_json_schemas()源码可以看出,如果工具集中添加了reset_equipped_tools工具,return位置的代码就会把active==True的tool group返回。
疑问:那agent上下文中是怎么知道有哪些tool group的呢?
答:get_json_schemas()源码中可以看到self.set_extended_model(“reset_equipped_tools”, extended_model) 这行代码,extended_model就是所有tool group的元信息。调用reset_equipped_tools工具的时候,就会知所有tool group元信息。
四、总结
agent在决定要用工具之前,从注册的tool group中激活和当前上下文状态符合的tool group,把tool group的json schema放入到上下文中,为了实现agent自主灵活性,把激活tool group的这个过程也做成了tool(reset_equipped_tools)
更多推荐



所有评论(0)