智能体编排
编排指的是应用中智能体的流程:哪些智能体会运行、以什么顺序运行,以及它们如何决定接下来发生什么?编排智能体主要有两种方式:
- 让 LLM 做决策:利用 LLM 的智能进行规划、推理,并据此决定要采取哪些步骤。
- 通过代码编排:通过你的代码来确定智能体的流程。
你也可以混合搭配这些模式。它们各有取舍,如下所述。
通过 LLM 编排
智能体是配备了 instructions、tools 和任务转移的 LLM。这意味着,面对开放式任务时,LLM 可以自主规划如何处理任务:使用工具执行操作并获取数据,并使用任务转移将任务委派给子智能体。例如,一个研究智能体可以配备如下工具:
- 网络检索,用于在线查找信息
- 文件检索与检索,用于搜索专有数据和连接
- 计算机操作,用于在计算机上执行操作
- 代码执行,用于进行数据分析
- 任务转移,用于转交给擅长规划、报告撰写等工作的专门智能体。
核心 SDK 模式
在 Python SDK 中,最常见的两种编排模式是:
| 模式 | 工作方式 | 最适合的场景 |
|---|---|---|
| Agents as tools | 管理器智能体保持对对话的控制,并通过 Agent.as_tool() 调用专门智能体。 |
你希望由一个智能体负责最终答案、组合多个专门智能体的输出,或在一个地方统一执行共享的安全防护措施。 |
| 任务转移 | 分诊智能体将对话路由到专门智能体,而该专门智能体会在本轮剩余过程中成为活跃智能体。 | 你希望专门智能体直接响应、保持提示词聚焦,或在不由管理器叙述结果的情况下切换 instructions。 |
当专门智能体应协助完成一个有边界的子任务、但不应接管面向用户的对话时,请使用agents as tools。当路由本身是工作流的一部分,并且你希望被选中的专门智能体负责交互的下一部分时,请使用任务转移。
你也可以将两者结合使用。分诊智能体可以任务转移给专门智能体,而该专门智能体仍然可以将其他智能体作为工具来调用,以处理范围较窄的子任务。
当任务是开放式的,并且你希望依赖 LLM 的智能时,这种模式非常适合。这里最重要的策略是:
- 投入精力编写好的提示词。明确说明有哪些工具可用、如何使用它们,以及必须在哪些参数范围内运行。
- 监控你的应用并不断迭代。观察问题出现在哪里,并迭代你的提示词。
- 允许智能体自省并改进。例如,让它在循环中运行并自我评议;或者提供错误消息,让它改进。
- 使用在某一项任务上表现出色的专门智能体,而不是期望一个通用智能体擅长所有事情。
- 投入使用评估。这可以帮助你训练智能体,使其改进并更擅长完成任务。
如果你想了解这种编排方式背后的核心 SDK 基础组件,请从工具、任务转移和运行智能体开始。
通过代码编排
虽然通过 LLM 编排非常强大,但从速度、成本和性能角度来看,通过代码编排可以让任务更具确定性和可预测性。这里的常见模式包括:
- 使用 structured outputs 生成格式良好的数据,供你的代码检查。例如,你可以要求智能体将任务归类到几个目录中,然后基于目录选择下一个智能体。
- 通过将一个智能体的输出转换为下一个智能体的输入来串联多个智能体。你可以将撰写博客文章这样的任务分解为一系列步骤——做研究、写大纲、撰写博客文章、进行评议,然后改进它。
- 将执行任务的智能体放在
while循环中运行,并配合一个负责评估和提供反馈的智能体,直到评估者认为输出满足某些标准。 - 并行运行多个智能体,例如通过 Python 的
asyncio.gather等基础组件实现。当你有多个彼此不依赖的任务时,这有助于提升速度。
我们在 examples/agent_patterns 中提供了许多代码示例。