SAGE Tools: 模块化工具系统介绍¶
欢迎来到 SAGE Lib 的工具(Tools)模块。该模块提供了一个标准化的框架,用于创建、管理和调用各种原子化的功能单元(即“工具”)。这些工具是 SAGE Agent 实现复杂任务规划与执行能力的基础。
该系统的核心由两部分组成:BaseTool 基类和 ToolRegistry 注册表。
1. BaseTool: 工具的基石¶
BaseTool 是一个抽象基类,为所有具体的工具提供了一个统一的接口和结构。任何希望被 SAGE 系统识别和调用的自定义功能,都应该继承自 BaseTool。
核心设计¶
-
元数据驱动: 每个工具都通过元数据(Metadata)来声明其身份和能力。这包括:
-
tool_name: 工具的唯一标识符。 tool_description: 对工具功能的清晰描述,主要供大语言模型(LLM)理解和选择。input_types/output_type: 明确定义工具的输入输出格式。-
demo_commands: 提供示例用法,便于人类和机器理解。 -
标准化执行接口: 所有工具都必须实现一个
execute方法。这是工具执行其核心逻辑的入口点,确保了 Agent 可以用统一的方式调用任何工具。 -
LLM 资源声明: 通过
require_llm_engine属性,工具可以声明其执行是否需要 LLM 的参与。这使得系统可以更高效地分配资源。
如何创建一个工具?¶
- 继承
BaseTool: 创建一个新类,并使其继承自BaseTool。 - 定义元数据: 在
__init__方法中,调用super().__init__()并传入工具的名称、描述、输入输出类型等元数据。 - 实现
execute方法: 重写execute方法,在其中实现工具的具体功能逻辑。
2. ToolRegistry: 工具的管理器¶
ToolRegistry 扮演着工具“注册中心”和“管理器”的角色。它维护了一个所有已注册工具的列表,并提供了一套简单的方法来管理这些工具。
核心功能¶
-
注册与注销:
-
register(tool): 将一个BaseTool的实例添加到注册表中,使其可被系统发现和调用。 -
unregister(name): 从注册表中移除一个工具。 -
查找与列举:
-
get(name): 根据工具名称精确地获取一个工具实例。 -
list_tools(): 返回当前所有已注册工具的列表,这对于 Agent 在规划时“看到”所有可用技能至关重要。 -
全局访问:
ToolRegistry通常作为一个单例存在,确保在系统的任何地方都可以访问到同一份工具列表。
总结:工作流程¶
一个典型的工具使用流程如下:
- 开发: 开发者通过继承
BaseTool来创建一个或多个具有特定功能的工具。 - 注册: 在系统初始化阶段,创建这些工具的实例,并将它们一一注册到全局的
ToolRegistry中。 - 发现与调用: 当一个 SAGE Agent 需要执行任务时,它会向
ToolRegistry查询可用的工具列表。通过分析每个工具的元数据(特别是tool_description),Agent 会选择最适合当前子任务的工具。 - 执行: Agent 调用所选工具的
execute方法,并传入所需的参数,完成任务的一个步骤。
通过这种松耦合、标准化的设计,SAGE 的工具系统实现了极高的灵活性和可扩展性,让开发者可以专注于实现具体的功能,而无需关心底层的调用和管理细节。