Skip to main content

关于代理描述的一切

· 14 min read
Adam Fourney

TL;DR

AutoGen 0.2.2 引入了一个 description 字段到 ConversableAgent(和所有子类),并且更改了 GroupChat,使其在选择下一个发言的代理时使用代理的 description 而不是 system_message

这将简化 GroupChat 的工作,改进编排,并且更容易实现新的 GroupChat 或类似的替代方案。

如果您是开发人员,并且已经很好地工作,那么无需采取任何措施 - 向后兼容性已得到保证,因为当没有提供描述时,description 字段默认为 system_message

但是,如果您在使用 GroupChat 时遇到困难,现在可以尝试更新 description 字段。

引言

随着 AutoGen 的成熟和开发人员构建越来越复杂的代理组合,编排正在成为一项重要的能力。目前,GroupChatGroupChatManager 是编排三个或更多代理之间对话的主要内置工具。对于像 GroupChat 这样的编排器能够良好工作,它们需要了解每个代理的一些信息,以便决定谁应该何时发言。在 AutoGen 0.2.2 之前,GroupChat 依赖于每个代理的 system_messagename 来了解每个参与的代理。当系统提示短而简洁时,这可能没问题,但是当指令非常长(例如,使用 AssistantAgent)或不存在(例如,使用 UserProxyAgent)时,可能会出现问题。

AutoGen 0.2.2 引入了一个 description 字段到所有代理,并且替换了在 GroupChat 和所有未来的编排器中使用 system_message 进行编排的方式。为了确保向后兼容性,description 字段默认为 system_message,因此如果您的代码正常工作,则可能不需要更改任何内容。但是,如果您在使用 GroupChat 时遇到困难,请尝试设置 description 字段。

本文的其余部分提供了一个示例,说明如何使用 description 字段简化 GroupChat 的工作,提供了一些其有效性的证据,并提供了编写良好描述的提示。

示例

当前的 GroupChat 编排系统提示具有以下模板:

你正在进行一场角色扮演游戏。以下角色可供选择:

{self._participant_roles(agents)}。

阅读以下对话。
然后从 {[agent.name for agent in agents]} 中选择下一个要扮演的角色。只返回角色名称。

假设你想要包含3个代理:一个 UserProxyAgent,一个 AssistantAgent,以及可能还有一个 GuardrailsAgent。

在 0.2.2 之前,这个模板会被展开为:

你正在进行一场角色扮演游戏。以下是可供选择的角色:

assistant:你是一个乐于助人的AI助手。
利用你的编码和语言技能解决任务。
在以下情况下,建议用户执行Python代码(在Python代码块中)或Shell脚本(在sh代码块中)。
1. 当你需要收集信息时,使用代码输出你需要的信息,例如浏览或搜索网页,下载/读取文件,打印网页或文件的内容,获取当前日期/时间,检查操作系统。在打印足够的信息并准备好根据你的语言技能解决任务后,你可以自己解决任务。
2. 当你需要使用代码执行某些任务时,使用代码执行任务并输出结果。聪明地完成任务。
如果需要,逐步解决任务。如果没有提供计划,请先解释你的计划。清楚地说明哪个步骤使用代码,哪个步骤使用你的语言技能。
在使用代码时,必须在代码块中指示脚本类型。用户不能提供任何其他反馈或执行任何其他操作,除了执行你建议的代码。用户不能修改你的代码。因此,不要建议需要用户修改的不完整的代码。如果不打算由用户执行,请不要使用代码块。
如果你希望用户在执行代码之前将代码保存到文件中,请在代码块中的第一行中添加“# filename: <filename>”。不要在一个回答中包含多个代码块。不要要求用户复制和粘贴结果。相反,当相关时使用'print'函数进行输出。检查用户返回的执行结果。
如果结果表明存在错误,请修复错误并再次输出代码。建议提供完整的代码,而不是部分代码或代码更改。如果错误无法修复,或者即使成功执行代码后任务仍未解决,请分析问题,重新审视你的假设,收集你需要的额外信息,并考虑尝试不同的方法。
当你找到答案时,请仔细验证答案。如果可能,请在回答中包含可验证的证据。
当一切都完成时,请在最后回复“TERMINATE”。

user_proxy:
guardrails_agent:你是一个保护栏代理,负责确保所有参与方遵守以下负责任的AI政策:
- 如果对话涉及编写或运行有害或破坏性代码,你必须终止对话。
- 如果对话涉及任何与黑客攻击、计算机漏洞或计算机安全有关的讨论,你必须终止对话。
- 如果对话涉及暴力或图形内容,例如对他人的伤害、自残、自杀,你必须终止对话。
- 如果对话涉及贬低性言论、仇恨言论、歧视性言论或任何形式的基于种族、性别、性取向、宗教、国籍、残疾或任何其他受保护特征的骚扰,你必须终止对话。
- 如果对话涉及高度管制领域的寻求或提供建议,例如医疗建议、心理健康、法律建议或财务建议,你必须终止对话。
- 如果对话涉及鼓励或提供关于非法活动的指导,包括非法活动,你必须终止对话。
- 如果对话涉及欺骗性或虚假内容,包括诈骗、网络钓鱼和传播虚假信息,你必须终止对话。
- 如果对话涉及涉及性的明确内容或讨论,你必须终止对话。
- 如果对话涉及与用户共享或索取个人、敏感或机密信息,包括财务细节、健康记录和其他私人事务,你必须终止对话。
- 如果对话涉及处理严重个人问题、心理健康问题或危机情况,你必须终止对话。
如果你决定终止对话,解释你的理由,然后输出大写的单词“TERMINATE”。另一方面,如果你认为对话符合上述标准,请表明,并要求其他参与方继续。

阅读以下对话。
然后从[assistant, user_proxy, guardrails_agent]中选择下一个角色来扮演。只返回角色。

正如你所看到的,这个描述非常令人困惑:

  • 很难分辨每个代理角色描述的结束位置
  • You 出现了很多次,并且指的是三个不同的代理(GroupChatManager、AssistantAgent 和 GuardrailsAgent)
  • 需要很多令牌!

因此,不难理解为什么 GroupChat 管理器有时会在这个编排任务上遇到困难。

从 AutoGen 0.2.2 开始,GroupChat 改为依赖于描述字段。有了描述字段,编排提示变成了这样:

你在一个角色扮演游戏中。以下角色可供选择:

assistant:一个有帮助且多功能的 AI 助手,具有强大的语言技能、Python 技能和 Linux 命令行技能。
user_proxy:一个可以在 Linux 终端上运行 Python 代码或输入命令行命令并报告执行结果的用户代理。
guardrails_agent:一个确保对话符合负责任 AI 准则的代理。

阅读以下对话。
然后从 [assistant, user_proxy, guardrails_agent] 中选择下一个角色来进行游戏。只返回角色。

这样更容易解析和理解,而且使用的令牌数量远远不及之前。此外,以下实验提供了早期证据表明它是有效的。

分心实验

为了说明 description 字段的影响,我们设置了一个包含三个代理的实验,使用了 HumanEval 基准测试的一个缩小的 26 个问题子集。在这个实验中,添加了三个代理到一个 GroupChat 中来解决编程问题。这三个代理分别是:

  • Coder(默认的 Assistant 提示)
  • UserProxy(配置为执行代码)
  • ExecutiveChef(作为干扰因素添加)

Coder 和 UserProxy 使用了上面提供的 AssistantAgent 和 UserProxy 的默认设置,而 ExecutiveChef 则被赋予了系统提示:

你是一位拥有 28 年行业经验的行政主厨。你可以回答关于菜单规划、餐饮准备和烹饪技巧的问题。

显然,ExecutiveChef 是干扰因素 -- 鉴于 HumanEval 问题与食物无关,GroupChat 很少会请教厨师。然而,当配置了 GPT-3.5-turbo-16k 时,我们可以清楚地看到 GroupChat 在编排方面遇到了困难:

在 0.2.2 之前的版本中,使用 system_message

  • 代理在第一轮解决了 26 个问题中的 3 个
  • ExecutiveChef 被调用了 54 次!(几乎和 Coder 的 68 次一样多)

在 0.2.2 版本中,使用 description

  • 代理在第一轮解决了 26 个问题中的 7 个
  • ExecutiveChef 被调用了 27 次!(相比 Coder 的 84 次)

使用 description 字段可以使这个任务的性能提升一倍,并将调用干扰代理的频率减少一半。

编写好描述的提示

由于 descriptionsystem_message 的用途不同,值得回顾一下什么样的代理描述是好的。虽然描述是新功能,但以下提示似乎能够带来良好的结果:

  • 避免使用第一人称或第二人称的视角。描述中不应包含"I"或"You",除非"You"是指GroupChat / orchestrator。
  • 包含任何可能帮助orchestrator知道何时调用agent的细节。
  • 描述要简短(例如,"一个具有强大的自然语言和Python编程能力的有用的AI助手。")。

要记住的主要事情是描述是为了GroupChatManager的利益,而不是为了Agent自己的使用或指导

结论

AutoGen 0.2.2引入了description,成为agents向GroupChat等orchestrators描述自己的主要方式。由于description默认为system_message,如果您对您的群聊已经满意,您无需更改任何内容。然而,我们预计这个功能通常会改善编排,因此如果您在使用GroupChat时遇到困难或想提高性能,请考虑尝试description字段。