多代理业务流程模式和最佳做法

生成式编排还支持多智能体系统,其中一个智能体会调用其他智能体。 将问题分解为多个专用代理时,可使应用程序更具模块化、可缩放性和可管理性。

内联代理

在线代理,也称为子代理,是同一代理内的小型、可重复使用的工作流程。 它们通常只是主代理用作子程序的主题。 例如,主代理可以调用“翻译文本”主题,作为更大计划中的一步。 在线代理与主代理共享上下文,因此数据传递很简单。

最佳实践:让内联代理专注于单一职责,并对其进行充分测试。

连接的代理

连接代理是独立的代理,拥有自己的编排、工具和知识。 主代理将部分请求委托给子代理。 例如,IT 代理调用销售代理以获取有关定价的信息。 连接的代理可实现模块化和域分离,并且可以绕过计划限制。 他们可能拥有不同的权限或知识,因此应应用治理和审计控制。

然而,使用连接代理需要谨慎治理:

  • 编排:父编排器应明确何时将交接给连接的代理。 当用户的意向与连接的代理的域匹配时,业务流程协调程序通常会关闭。 为协助此过程,请在父配置中清晰描述连接代理的用途。 从父级的视角出发,将整个已连接的代理视为一个具有自主性的“工具”,并附带描述。

  • 数据切换:你必须管理数据切换。 决定从父组件传递给连接代理的上下文。 默认情况下,当一个代理调用另一个代理时,Copilot Studio传递会话历史记录,因此连接的代理会了解对话的上一个上下文。 但你可能也需要传递特定的参数。 例如,如果主代理已经知道之前的用户名字,可能会把名字发送给连接的代理,以避免再次询问。

  • 安全性:连接的代理可能拥有母代理无法访问的权限。 确保拨打已连接的客服不会无意中绕过限制。 例如,如果父代理不能删除记录,而连接代理可以,那么在可能在未获适当批准的情况下删除的情况下,父代理不应呼叫连接代理。 把连接的代理电话当作其他强力作一样对待。 如果进行敏感操作,需要进行必要的检查或征得用户同意。

  • 审计与监控:记录连接代理被调用的时间及其作内容。 因为是独立的代理,你有单独的成绩单。 调试时,将父会话与其连接的会话关联起来非常重要。 通常,遥测中的标识符将两者联系起来。

何时分离代理

不要为每个子任务单独创建代理。 如果子任务需要,请使用单独的代理:

  • 足够复杂,因而需要一个独立领域的工具套件或知识。
  • 需要与主代理不同的治理规则或访问控制
  • 可以在许多不同的主代理中重复使用(因此它就像服务代理)

如果这些条件都不适用,则简单的内联代理可以很好地处理作业,同时也比完全连接的代理更简单。 独立的代理会给系统引入额外开销。 由于上下文切换和维护多个代理的复杂性,执行时间略长。 所以要谨慎使用它们。 对于实际方法,请从一个代理开始。 然后,只有在清楚地看到需要模块化或单个代理不应跨越的边界时,才拆分为多个代理。

多智能体编排的最佳实践

在多代理环境中为父代理和子代理编写指令时,应遵循以下最佳实践。

1. 单个响应原则

确保每轮仅与用户进行一次代理对话。 在多代理设置中,父代理是唯一应该提供最终响应的代理。 子代理是研究人员,而不是反应者。

  • 执行:添加到父指令:“你是唯一与用户通信的代理。 将所有子代理的结果合并为单一响应。
  • 不要:表述得模棱两可。 如果没有明确的指导,子代理会直接回复用户,从而导致重复或部分消息。

2. 子代理指令必须声明其角色

始终告诉子代理他们是子代理。 子代理本质上不知道它们是业务流程的一部分。 如果没有明确的指导,它们的行为就是独立的代理,并直接向用户发送消息。

  • 操作:添加到每个子代理的指令中:“你是一个子代理。” 请勿直接回复用户。 你的工作是查找信息,并将查找结果返回给父代理。 父代理处理与用户的所有通信。
  • 不要:认为子代理会自行弄清楚编排模式。

3. 在说明中使用清晰、直接的语言

始终使用指令语言。 避免软措辞或礼貌措辞。 平台使用强语言(必须、请勿、从不)注入系统级指令。 使用委婉措辞表述的指令(“请尽量……”“你应该……”“最好……”)在发生冲突时,其优先级会降低。

  • 执行:“绝不要直接回复用户。 仅返回结果。
  • 请执行下列操作:“每个用户问题必须只有一个最终答复。
  • 不要:“请尝试避免向用户发送消息,而是返回你的发现结果。
  • 不要:“理想情况下,我们希望一个组合答案。

4.每个子代理使用一个知识源(无重叠)

为每个子代理分配不同的非重叠知识源。 如果两个子代理搜索相同的知识库,则一个子代理首先找到答案。 第二个子代理返回重复的结果或完全跳过其搜索,不添加任何值。

  • 操作:CA-1 搜索知识源 A(例如,人力资源政策)。 CA-2 搜索知识源 B(例如 IT 文档)。
  • 不要:让两个子代理访问相同的文档、Dataverse 表或 SharePoint 站点。
  • 注意:如果只有一个知识源,请使用具有知识的单个代理,而不是拆分为两个子代理。 只有当信息源确实不同时,多代理才有价值。

5. 为子代理使用准确且有区别的描述

为父级可见的每个子代理编写清晰、不同的说明。 父代理使用子代理说明来决定路由。 如果描述模糊、雷同或不准确,父级节点就无法做出合理的路由决策。

  • 执行:CA-1:“针对员工相关问题搜索人力资源政策文档。” CA-2:“针对技术支持问题搜索 IT 知识库。”
  • 不要:当两个代理服务于不同领域时,给它们使用相同的描述。
  • 请勿:使用泛型说明,例如“此代理可以帮助解决问题”。

6. 父级指令必须定义编排模式

告知父代理如何编排。 不要只说“使用子代理”。父代理需要关于这一模式的明确说明:调用子代理、等待结果返回、整合结果,然后再作答。

  • 执行:“当用户提出问题时:1. 调用这两个子代理来收集信息。 2. 等待两个子代理返回结果。 3. 将调查结果合并为单个统一的响应。 4. 向用户提供一个响应。 子代理不得直接回复用户。
  • 不要:“当用户提出问题时,请调用子代理并从两个源获取响应,并提供单个组合答案。(太模糊了指令不会告知子代理保持沉默。

7. 在任务委派中包含“无直接答复”指令

即使有明确的子代理指令,在委托任务中添加强化功能也提供了安全网。

  • 执行:添加到父级指令中:“当委派任务给子代理时,始终在任务中包含以下内容:‘仅返回你的发现。’” 不要回复用户。”
  • 不要:只依赖子代理自己的指令。 任务上下文为子代理提供更多增强模式的信号。

8.使用域不匹配查询进行测试

始终使用与任何子代理域不匹配的问题进行测试。 这项测试揭示了子代理是否会妥善地返回“未找到信息”,还是会返回可能不正确的信息、卡住,或发送令人困惑的消息。

  • 要做:使用不属于任何子代理领域的问题进行测试(例如,当代理负责人力资源和 IT 事务时,询问天气情况)。
  • 操作:验证父代理是否能妥善处理“两个代理都未找到任何内容”这种情况。
  • 请勿:仅使用与一个子代理的域完全匹配的最简单事例查询进行测试。

9. 在预期会有后续回复时,优先使用 ask 而非 inform

在预期用户做出响应时,请使用问题/提问样式的交互。 仅对最终单向消息使用 inform/send-style。 如果代理使用单向消息询问用户某些内容(通知),用户的回复将返回到父规划器作为全新的查询。 在这种情况下,最好继续与子代理进行同一对话。

  • 编写如下说明:“如果需要澄清,请询问用户一个问题并等待他们的回复。
  • 请勿:编写如下说明:“告知用户选项并让他们选择。“通知”表示单向消息,而“ask”则表示双向交换。

快速参考清单

# 支票
1 父级指令明确说明“只有我响应用户”
2 每个子代理指令都显示“不直接回复用户”
3 说明中使用强制性措辞(MUST、NEVER、ONLY)
4 每个子代理都有一个唯一的非重叠知识源
5 子代理说明准确、不同和具体
6 父指令定义完整的业务流程模式(调用→等待→合并→响应)
7 父级在委派任务上下文中传递“无直接答复”
8 使用域不匹配查询进行测试
9 子代理指令中的“询问与通知区别”是正确的