Solon v3.8.0

multi - TeamAgent 配置与构建

</> markdown
2026年1月4日 下午11:17:54

1、TeamAgent 配置参考(可参考 TeamConfig 字段)

分类参数名称类型默认值说明
身份定义nameString/团队唯一标识,影响 TraceKey(__name)及内部存储。
titleString/视觉标题,多用于可视化 UI 或日志报表的友好显示。
descriptionString/核心字段。定义团队职责,供上级团队调度时识别能力。
决策大脑chatModelChatModel/充当主管(Supervisor),负责理解需求、分派任务与总结。
chatOptionsConsumer/用于精细控制主管模型的参数(如调低 Temperature 以稳健调
promptProviderReActPromptProvider英文模板定义团队协作的提示词骨架,包含成员画像与工作流规范。
组织结构agentMapMap/团队成员列表,存储所有参与协作的子智能体(Agent)。
protocolTeamProtocolHIERARCHICAL协作灵魂。决定任务是层级派发、顺序执行还是竞争投标。
执行控制maxTotalIterationsint8总步数限制。全队协作的最大轮次,防止成员间无限“踢皮球”。
maxRetriesint3主管模型决策失败或解析异常时的自动重试次数。
retryDelayMslong1000L两次重试决策之间的时间间隔(毫秒)。
扩展定制finishMarker 自动生成任务完结标识。模型输出此标记代表全队任务整体终结。
graphAdjusterConsumer/进阶项。允许在协议生成的默认执行图基础上微调链路。
interceptorTeamInterceptor/生命周期拦截器,用于监控成员切换、指令下达等过程。

关键配置点补充说明

  • 关于职责描述 (description):在 TeamAgent 中,描述不仅是给人看的,更是给“主管模型”看的。一个清晰的描述能让主管更准确地判断何时该把任务交给这个团队处理。
  • 关于协作协议 (protocol):这是 TeamConfig 最强大的地方。只需更改此参数,你就能将团队从“经理负责制 (HIERARCHICAL)”一键切换为“流水线模式 (SEQUENTIAL)”,无需重写业务逻辑。
  • 关于最大迭代 (maxTotalIterations):在多 Agent 协作中,Agent 之间可能会产生反复确认或死循环。该参数是全队的“保险丝”,确保系统不会因为无限对话而耗尽 Token。

2、TeamAgent 构建

  • 基础版:顺序流水线 (Sequential)。

适用于逻辑固定的线性任务,例如:翻译 $\rightarrow$ 润色 $\rightarrow$ 总结。这种模式下,Agent 按照添加顺序依次执行。

// 创建一个简单的翻译润色团队
TeamAgent simpleTeam = TeamAgent.of(chatModel)
        .name("translator_group")
        .description("负责多语言翻译与内容优化的团队")
        // 1. 添加成员(注意描述的重要性)
        .addAgent(ReActAgent.of(chatModel).name("translator").description("将中文翻译为英文").build())
        .addAgent(ReActAgent.of(chatModel).name("polisher").description("润色英文表达,使其地道").build())
        // 2. 设置协议为顺序执行
        .protocol(TeamProtocols.SEQUENTIAL)
        .build();

// 执行:任务会自动从 translator 流转到 polisher
String result = simpleTeam.call(FlowContext.of(), "你好,很高兴认识你");
  • 进阶版:层级专家团队 (Hierarchical)

这是一个模拟真实公司架构的复杂示例。由一个主管(Supervisor)根据任务需求,自主调度下属的“专家智能体”,并包含重试策略、拦截监控及性能调优。

// 创建一个全能的技术支持团队
TeamAgent techTeam = TeamAgent.of(chatModel)
        // --- 1. 身份与职责定义 ---
        .name("tech_support_center")
        .title("技术支持专家中心")
        .description("负责处理复杂的客户技术问题,包括查询数据库和排查日志")

        // --- 2. 招募专家成员 (Members) ---
        .addAgent(ReActAgent.of(chatModel)
                .name("db_expert")
                .description("数据库专家,擅长编写 SQL 查询用户信息")
                .addTool(dbTool)
                .build())
        .addAgent(ReActAgent.of(chatModel)
                .name("log_analyser")
                .description("日志分析专家,负责从服务器日志中提取异常")
                .addTool(logTool)
                .build())

        // --- 3. 配置决策大脑(主管)的运行策略 ---
        .protocol(TeamProtocols.HIERARCHICAL) // 层级调度模式
        .maxTotalIterations(12)               // 允许全队最多协作 12 轮,处理深度问题
        .retryConfig(3, 2000L)                // 决策失败自动重试
        .chatOptions(options -> {
            options.setTemperature(0.1f);     // 调低主管温度,让任务分发更严谨
        })

        // --- 4. 插入定制化逻辑 ---
        .finishMarker("[TASK_SOLVED]")        // 自定义任务完结标识
        .interceptor(new TeamInterceptor() {
            @Override
            public void onAgentSwitch(Agent from, Agent to) {
                System.out.println("🔄 任务转办:从 [" + from.name() + "] 移交给 [" + to.name() + "]");
            }
        })
        
        // --- 5. 手动微调计算图(高级项) ---
        .graphAdjuster(spec -> {
            // 可以在此处对生成的 Graph 进行链路微调
            // 例如:强制某个节点之后必须经过人工确认节点(预留扩展)
        })
        .build();

// 执行调用:主管会分析问题,决定先找 db_expert 查数据,再找 log_analyser 分析情况
String finalAnswer = techTeam.call("用户 ID 为 9527 的反馈登录失败,请排查原因并给出建议。");

TeamInterceptor 接口参考

public interface TeamInterceptor extends FlowInterceptor {
    /**
     * 调用结束时
     */
    default void onCallEnd(FlowContext context, Prompt prompt) {

    }
}



public interface FlowInterceptor {
    /**
     * 拦截执行
     *
     * @param invocation 调用者
     */
    default void doFlowIntercept(FlowInvocation invocation) throws FlowException {
        invocation.invoke();
    }

    /**
     * 节点运行开始时
     */
    default void onNodeStart(FlowContext context, Node node) {

    }

    /**
     * 节点运行结束时
     */
    default void onNodeEnd(FlowContext context, Node node) {

    }
}