当一个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)

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐