一个能够包办所有任务的大而全的通用智能体并不讨好,不如将任务委派给专业化的子智能体。这能让上下文窗口保持聚焦,避免因信息杂乱而降低执行效果。
Task 工具(任务工具)是 spring-ai-agent-utils 工具集的一部分,是一个可移植、与模型无关的 Spring AI 实现,其设计灵感来自 Claude Code 的子智能体(subagents)。它支持构建分层式智能体架构,由专业化的子智能体在独立的上下文窗口中处理聚焦型任务,并仅将核心结果返回给父智能体。
除了支持 Claude 基于 Markdown 的格式外,该架构还具备可扩展能力 —— 支持 A2A 及其他智能体协议,用于实现异构智能体的编排。
工作原理
主智能体通过 Task 工具将任务委派给专业化的子智能体,每个子智能体都在独立隔离的上下文窗口中运行。
整个子智能体架构包含三个核心组件:
1. 主智能体(调度器) 与用户直接交互的顶层智能体。其大语言模型可调用 Task 工具,并通过智能体注册中心感知所有可用的子智能体 —— 注册中心会在启动时加载所有子智能体的名称与描述。主智能体会根据每个子智能体的**描述(description)**字段,自动判断何时进行任务委派。
2. 智能体配置文件 子智能体以 Markdown 文件形式定义(如 agent-x.md、agent-y.md),存放于 agents/ 目录下。每个文件指定子智能体的名称、描述、允许调用的工具、偏好模型与系统提示词。这些配置会在启动时加载到智能体注册中心与 Task 工具中。
3. 子智能体 独立运行的智能体实例,在隔离的上下文窗口中执行任务。每个子智能体可以使用不同的大语言模型(LLM‑X、LLM‑Y、LLM‑Z),拥有独立的系统提示词、工具与技能 —— 支持根据任务复杂度实现多模型路由。

执行流程如下:
- 加载: 启动时,Task 工具加载配置好的子智能体引用,解析名称与描述,并填充到智能体注册中心。
- 用户向主智能体发送复杂问题。
- 主智能体的大语言模型评估请求,并查询注册中心中可用的子智能体。
- 大语言模型决策: 调用
Task工具,传入子智能体名称与任务描述,执行委派。 - Task 工具 根据智能体配置,创建并启动对应的子智能体。
- 子智能体 在独立的上下文窗口中自主执行任务。
- 结果 回流至主智能体(仅返回核心结论,不包含中间步骤)。
- 主智能体 整合结果,并向用户返回最终答案。
每个子智能体都具备以下特性:
- 独立上下文窗口: 与主对话完全隔离,避免信息冗余
- 自定义系统提示词: 针对特定领域的专业化指令
- 可配置工具权限: 仅开放必要的能力
- 多模型路由: 简单任务使用轻量低成本模型,复杂分析使用高性能模型
- 并行执行: 可同时启动多个子智能体
- 后台任务: 耗时较长的操作可异步执行
内置子智能体
Spring AI Agent Utils 提供四个内置子智能体,在配置 TaskTool 时会自动注册:
| 子智能体 | 用途 | 可用工具 |
|---|---|---|
| Explore | 快速、只读的代码库探索 —— 查找文件、搜索代码、分析内容 | Read、Grep、Glob |
| General‑Purpose | 多步骤研究与执行,具备完整读写权限 | 所有工具 |
| Plan | 软件架构设计,用于制定实现策略与识别权衡方案 | 只读 + 搜索 |
| Bash | 命令执行专家,用于 Git 操作、构建与终端任务 | 仅 Bash |
多个子智能体可同时并行运行 —— 例如在代码审查时,可同时运行 style‑checker、security‑scanner、test‑coverage。
快速上手
1. 添加依赖
|
1 2 3 4 5 |
<dependency> <groupId>org.springaicommunity</groupId> <artifactId>spring-ai-agent-utils</artifactId> <version>0.4.2</version> </dependency> |
2. 配置智能体
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import org.springaicommunity.agent.tools.task.TaskToolCallbackProvider; @Configuration public class AgentConfig { @Bean CommandLineRunner demo(ChatClient.Builder chatClientBuilder) { return args -> { // 配置 Task 工具 var taskTools = TaskToolCallbackProvider.builder() .chatClientBuilder("default", chatClientBuilder) .subagentReferences( ClaudeSubagentReferences.fromRootDirectory("src/main/resources/agents") ) .build(); // 构建主聊天客户端,启用 Task 工具 ChatClient chatClient = chatClientBuilder .defaultToolCallbacks(taskTools) .build(); // 自然语言使用——主智能体自动委派给子智能体 String response = chatClient .prompt("Explore the authentication module and explain how it works") .call() .content(); }; } } |
主智能体会根据子智能体的描述字段,自动判断何时进行委派。
3. 多模型路由(可选)
根据任务复杂度,将子智能体路由到不同模型:
|
1 2 3 4 5 |
var taskTools = TaskToolCallbackProvider.builder() .chatClientBuilder("default", sonnetBuilder) // 默认模型 .chatClientBuilder("haiku", haikuBuilder) // 快速、低成本 .chatClientBuilder("opus", opusBuilder) // 复杂分析 .build(); |
子智能体在定义中指定其偏好模型,Task 工具会自动路由。
创建自定义子智能体
自定义子智能体以 Markdown + YAML 前置元数据 形式定义,通常存放于 .claude/agents/ 目录:
|
1 2 3 4 5 |
project-root/ ├── .claude/ │ └── agents/ │ ├── code-reviewer.md │ └── test-runner.md |
子智能体文件格式
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
--- name: code-reviewer description: 专业代码审查专家,编写代码后主动使用。 tools: Read, Grep, Glob disallowedTools: Edit, Write model: sonnet --- 你是资深代码审查专家,专注于软件质量。 调用时执行: 1. 运行 git diff 查看近期变更 2. 聚焦分析修改过的文件 3. 检查周边代码上下文 审查清单: - 代码清晰度与可读性 - 规范命名 - 异常处理 - 安全漏洞 输出:清晰、可落地的反馈,并附带文件引用。 |
配置字段说明
| 字段 | 必填 | 描述 |
|---|---|---|
name |
是 | 唯一标识(小写字母 + 连字符) |
description |
是 | 自然语言描述,说明何时使用该子智能体 |
tools |
否 | 允许调用的工具(省略则继承所有) |
disallowedTools |
否 | 明确禁止的工具 |
model |
否 | 偏好模型:haiku、sonnet、opus |
重要: 子智能体不能创建自己的子智能体。不要在子智能体的工具列表中包含 Task。
加载自定义子智能体
|
1 2 3 4 5 6 |
var taskTools = TaskToolCallbackProvider.builder() .chatClientBuilder("default", chatClientBuilder) .subagentReferences( ClaudeSubagentReferences.fromRootDirectory("src/main/resources/agents") ) .build(); |
后台执行
耗时较长的子智能体可异步执行。主智能体继续处理其他任务,后台子智能体异步运行。使用 TaskOutputTool 在需要时获取结果。
如需跨实例持久化任务存储,可参考 TaskRepository 文档。
总结
Task 工具为 Spring AI 带来了分层子智能体架构,实现了上下文隔离、专业化指令与高效的多模型路由。通过将复杂任务委派给聚焦型子智能体,主智能体将保持轻量与高效。