智能体 · 编排

多智能体交接

一个编排者,各有自己上下文的工作者

模型
Qwen3-1.7B 每个智能体
工作者
5
处理的词元数
4,189 vs 单个智能体 887

全部步骤

  1. 一个智能体,一个上下文

    首先,一个带查询工具的智能体独自处理请求。它一次查了两个模型,把两份资料卡都留在同一个上下文里(到最后 609 个词元),然后作答。

    1 个智能体 · 2 次调用 · 2 次查询

  2. 分派工作

    编排者拿到同样的请求和一个工具 ask_worker。它交出去 5 份,每份是一个模型加一个问题。交接只是一次工具调用,其结果是另一个智能体的工作。

    5 次交接,每次一个工具调用

  3. 每个工作者都从空白开始

    工作者从一个空的上下文开始:它自己简短的说明和一个任务。它从看不到用户的请求、其他工作者或计划。它的第一个回复必须是工具调用(tool_choice “required”),所以它先查询模型,再作答。

    每个工作者一个全新的上下文

  4. 只有报告回来

    资料卡留在工作者的上下文里。编排者只读 5 份简短的报告(作为工具结果),并据此写出回答。

    输入 5 份报告 · 输出 1 个回答

  5. 谁在何时运行

    工作者之间互不依赖,所以服务器可以同时运行它们;编排者等所有工作者完成。在这么小的任务上,额外的调用抵消了并行的好处:单个智能体仍然先完成。

    分发、并行运行、汇总

  6. 代价是什么

    每个工作者都要重读自己的说明和资料卡,所以拆分后处理了 4,189 个词元,而单个智能体只有 887 个,而且这里单个智能体的回答还更完整。当各部分很大、相互独立、会挤满一个上下文时,拆分才划算。

    处理 4,189 vs 887 个词元

代码

def ask_worker(model, question):                       # the orchestrator's one tool
    worker = Agent(instructions=WORKER, tools=[lookup])     # a fresh, empty context
    return worker.run(f'Model: {model}\nQuestion: {question}')   # only the report comes back

orchestrator = Agent(instructions=ORCHESTRATOR, tools=[ask_worker])
answer = orchestrator.run(request)       # calls ask_worker once per piece, then answers from the reports

延伸阅读