Supervisor and Workers

监督者-工作者模式是一种强大的工作流设计,其中监督者代理协调多个专门的工作者代理以完成复杂任务。这种模式能够实现更好的任务分配、专业知识的利用以及解决方案的迭代优化。

概述

在本教程中,我们将构建一个协作系统,该系统包含:

  • 监督者:一个大型语言模型(LLM),负责分析任务并决定接下来应由哪个工作者执行

  • 软件工程师:专门从事软件解决方案的设计与实施

  • 代码审查员:专注于审查代码质量并提供反馈

  • 最终答案生成器:将协作成果整合为综合解决方案

步骤1:创建起始节点

流程从一个开始节点开始,该节点捕获用户输入并初始化工作流状态。

  1. 在画布上添加一个开始节点

  2. 输入类型配置为“聊天输入”

  3. 使用以下初始变量设置流状态

    • next:用于跟踪下一个智能体

    • instruction: 给下一个代理的指令,告诉它该做什么

步骤2:添加监督式大型语言模型(LLM)

Supervisor(监督者)是决定由哪个工作者处理任务中每个部分的协调者。

  1. 在“开始”节点之后连接一个LLM节点

  2. 将其标记为“主管”

  3. 配置系统消息,例如:

你是一名主管,负责管理以下员工之间的对话:
- 软件工程师
- 代码审查员

根据以下用户请求,请指示工作人员下一步应采取的行动。
每位工作人员将执行一项任务,并回复其结果和状态。
完成后,请回复“完成”。
进行策略性选择,以尽可能减少所需步骤的数量。
  1. 使用以下字段设置JSON结构化输出

    • next: 枚举值包括“FINISH”、“SOFTWARE”、“REVIEWER”

    • instructions: 下一个工作者应完成的子任务的具体说明

    • reasoning: 下一个工作者被分配执行该工作的原因

  2. 配置更新流状态以存储:

    • next: {{ output.next }}

    • 指令{{ output.instructions }}

  3. 输入消息设置为:“根据上述对话,接下来应该由谁行动?或者我们应该结束对话吗?请选择以下选项之一:软件、审核员。”输入消息将被插入到末尾,就像用户要求主管分配下一个代理一样。

步骤 3:创建路由条件

“检查下一个工作人员”条件节点根据主管的决定来决定流程的走向。

  1. 在监督器之后添加一个条件节点

  2. 设定两个条件:

    • 条件0{{ $flow.state.next }}等于"SOFTWARE"

    • 条件1{{ $flow.state.next }} 等于 "REVIEWER"

  3. “Else”分支(条件2)将处理“FINISH”情况

这创建了三条输出路径:每个工作者一条,完成时一条。

步骤4:配置软件工程师代理

软件工程师专门从事软件解决方案的设计与实施。

  1. 将一个Agent节点连接到条件0的输出端

  2. 配置系统消息:

作为高级软件工程师,你是我们创新开发团队的关键一员。你的专业知识和领导能力将推动我们开发出稳健、可扩展的软件解决方案,以满足我们多样化客户的需求。

你的目标是引领高质量软件解决方案的开发。

为给定任务设计和实现新功能,确保其与现有系统无缝集成并满足性能要求。利用你对React、TailwindCSS和NodeJS的理解来构建此功能。确保遵守编码标准并遵循最佳实践。

输出应是一个功能齐全、文档完善的功能,能够增强我们产品的能力。在代码中加入详细的注释。
  1. 输入消息设置为:{{ $flow.state.instruction }}。输入消息将被插入到末尾,就像用户正在向软件工程师代理发出指令一样。

步骤 5:配置代码审查代理

代码审查员主要负责质量保证和代码审查。

  1. 将一个Agent节点连接到条件1的输出端

  2. 配置系统消息:

作为质量保证工程师,您是我们开发团队不可或缺的一员,负责确保我们的软件产品达到最高质量。您对细节的细致关注以及在测试方法方面的专业知识,对于识别缺陷和确保我们的代码符合最高标准至关重要。

你的目标是通过彻底的代码审查和测试,确保交付高质量的软件。

审查由高级软件工程师设计和实现的新功能的代码库。提供建设性反馈,指导贡献者采用最佳实践,并培养持续改进的文化。你的方法确保交付高质量的软件,该软件稳健、可扩展且符合战略目标。
  1. 输入消息设置为:{{ $flow.state.instruction }}。输入消息将被插入到末尾,就像用户正在向代码审查代理发出指令一样。

步骤 6:添加环回连接

两个工作代理都需要向监督者反馈,以便持续协调。

  1. 在“软件工程师”之后添加一个循环节点

    • 将“循环回送至”设置为“主管”

    • 最大循环次数设置为5

  2. 在代码审查器之后添加另一个循环节点

    • 将“循环回送至”设置为“主管”

    • 最大循环次数设置为5

这些循环使得代理之间能够进行迭代协作。

步骤7:创建最终答案生成器

最终的代理将所有协同工作整合成一个全面的解决方案。

  1. 将一个Agent节点连接到条件2的输出(即“Else”分支)

  2. 由于对话具有来回交互的特性,会消耗大量标记,因此建议使用像Gemini这样上下文规模更大的大型语言模型(LLM)。

  3. 设置输入消息。这很重要,因为输入消息将被插入到末尾,就像用户正在指示最终答案生成器查看所有对话并生成最终回复一样。

根据上述对话,生成由软件工程师和代码审查员共同开发的详细解决方案。

你的指导原则:
1. **保留完整上下文**
   包括对话中的所有代码实现、改进和评审内容。不得遗漏、总结或过度简化关键信息。

2. **仅限Markdown输出**
   你的最终输出必须采用Markdown格式。

工作原理

监督者-工作者模式带来了几个关键好处:

智能任务委派:主管利用情境和推理为每个子任务分配最合适的员工。

迭代优化:团队成员可以基于彼此的成果进行构建,由软件工程师负责实现功能,而代码审查员则提供改进反馈。

有状态协调:流程在迭代过程中保持状态,使监督者能够就下一步应采取的行动做出明智的决策。

专业特长:每个代理都有其专注的角色和专门的提示,从而在其领域内实现更高质量的输出。

示例交互

以下是一个典型交互的可能流程:

  1. 用户:“创建一个带有表单验证的用户认证React组件”

  2. 主管:决定由软件部门首先实施该组件

  3. 软件工程师:使用验证逻辑创建一个React身份验证组件

  4. 主管:决定由评审员检查实施情况

  5. 代码审查员:负责审查代码,并提出安全性和用户体验方面的改进建议

  6. 主管:决定软件应实施所建议的改进措施

  7. 软件工程师:根据反馈更新组件

  8. 监督者:确认任务已完成,并转至“完成”状态

  9. 最终答案生成器:整合包含实现细节和评审反馈的完整解决方案

完整流程结构

{"Supervisor Worker Agents": [
  {
    "Name": "Supervisor Worker Agent 1",
    "IP": "10.0.0.1",
    "Port": 5000
  },
  {
    "Name": "Supervisor Worker Agent 2",
    "IP": "10.0.0.2",
    "Port": 5000
  }
]}

最佳实践

  • 由于代理之间需要反复通信,这种架构会消耗大量令牌,因此并不适用于所有情况。它尤其适用于:

    • 需要同时执行实施和审查的软件开发任务

    • 从多个角度出发,有利于复杂问题的解决

    • 注重质量和迭代的工作流程

    • 需要不同类型专业知识之间协调的任务

  • 确保每个代理都有明确且具体的职责。避免职责重叠,以免造成混乱或工作重复。

  • 为客服人员沟通其进度、发现和建议制定标准格式。这有助于主管做出更优的路线安排决策。

  • 适当使用内存设置,以保持对话上下文,同时避免出现令牌限制问题。对于较长的工作流程,可以考虑使用“对话摘要缓冲区”等内存优化设置。

视频教程

Last updated