多智能体编排
编排指的是你在应用中组织智能体的流程:哪些智能体运行、以什么顺序运行,以及它们如何决定下一步做什么。编排智能体主要有两种方式:
- 让 LLM 做决策:利用 LLM 的智能进行规划、推理,并据此决定下一步的动作。
- 通过代码进行编排:用你的代码确定智能体的流程。
你可以混合使用这些模式。每种方式都有取舍,详见下文。
通过 LLM 编排
智能体是一个配备了指令、工具和任务转移的 LLM。这意味着在面对一个开放式任务时,LLM 可以自主规划解决路径,使用工具执行操作并获取数据,并通过任务转移将子任务委派给子智能体。比如,一个研究型智能体可以配备如下工具:
- 网络检索,用于在线查找信息
- 文件检索与读取,用于在专有数据和连接中搜索
- 计算机操作,用于在计算机上执行操作
- 代码执行,用于进行数据分析
- 任务转移,交给擅长规划、撰写报告等工作的专业智能体
当任务是开放式且你希望依赖 LLM 的智能时,这种模式非常合适。关键做法包括:
- 投入精力打磨提示词。清楚阐明可用工具、使用方式,以及必须遵守的参数与约束。
- 监控应用并持续迭代。找出出错之处,并迭代优化提示词。
- 让智能体自省和改进。例如,让其在循环中运行并自我批评;或提供错误信息并让其改进。
- 采用在单一任务上表现突出的专业化智能体,而非期望一个通用智能体“面面俱到”。
- 投入于评测。这有助于训练你的智能体持续改进并更好地完成任务。
通过代码编排
虽然通过 LLM 编排很强大,但通过代码编排可以让任务在速度、成本和性能方面更具确定性和可预测性。常见模式包括:
- 使用 structured outputs 生成可由你代码检查的格式良好的数据。比如,你可以让一个智能体将任务归类为几个目录,然后基于该目录选择下一个智能体。
- 通过将一个智能体的输出转换为下一个智能体的输入来串联多个智能体。你可以将撰写博客文章这样的任务分解为一系列步骤——进行研究、写出提纲、撰写正文、进行批评和改进。
- 将执行任务的智能体与评估和反馈的智能体一起在
while循环中运行,直到评估者认为输出满足某些标准。 - 并行运行多个智能体,例如通过 Python 基本组件如
asyncio.gather。当你有多个互不依赖的任务时,这有助于提升速度。
我们在examples/agent_patterns中提供了若干代码示例。