编排多个智能体
编排指的是应用中智能体的运行流程:哪些智能体运行、以什么顺序运行、以及它们如何决定接下来发生什么。编排智能体主要有两种方式:
- 让 LLM 做决策:利用 LLM 的智能进行规划、推理,并据此决定采取哪些步骤。
- 通过代码编排:通过你的代码来确定智能体的流程。
你可以混合使用这些模式。每种方式都有权衡,见下文。
通过 LLM 编排
一个智能体是配备了指令(instructions)、工具(tools)和任务转移(handoffs)的 LLM。这意味着面对一个开放式任务时,LLM 可以自主规划如何完成任务,使用工具执行操作和获取数据,并通过任务转移将任务委派给子智能体。例如,一个研究智能体可以配备如下工具:
- 网络检索以在网上查找信息
- 文件检索与提取以搜索专有数据和连接
- 计算机操作以在计算机上执行操作
- 代码执行以进行数据分析
- 任务转移到擅长规划、写报告等的专业智能体
当任务是开放式且你希望依赖 LLM 的智能时,这种模式非常适合。关键做法包括:
- 投入精力于优质提示词。明确可用的工具、如何使用它们,以及它必须遵循的参数范围。
- 监控你的应用并迭代改进。找出问题发生的位置,并迭代优化提示词。
- 允许智能体自省和改进。例如,将其置于循环中,让其自我批判;或者提供错误信息并让其改进。
- 使用在单一任务上表现出色的专业智能体,而不是期望一个通用智能体在所有方面都表现良好。
- 投入于评测(evals)。这可以让你训练智能体以改进并更好地完成任务。
通过代码编排
尽管通过 LLM 编排功能强大,但通过代码编排可以在速度、成本和性能方面让任务更具确定性和可预测性。常见模式包括:
- 使用 structured outputs 生成可由你的代码检查的格式良好的数据。例如,你可以让一个智能体将任务分类到几个目录中,然后根据该目录选择下一个智能体。
- 将多个智能体串联,把一个智能体的输出转换为下一个的输入。你可以将写博客文章这样的任务分解为一系列步骤——进行研究、写大纲、写正文、批判性审阅,然后改进。
- 让执行任务的智能体与负责评估并提供反馈的智能体在一个
while
循环中运行,直到评估者判定输出满足某些标准为止。 - 并行运行多个智能体,例如通过 Python 基本组件如
asyncio.gather
。当你有多个彼此不依赖的任务时,这有助于提升速度。
我们在 examples/agent_patterns
中提供了许多代码示例。