跳到正文
实时
LangChain Blog·· 9 天前精选72

LangChain 为 Deep Agents 推出异步子智能体

Agents Are Going Async

要点速览

LangChain 在 Deep Agents 中推出异步子智能体,由常驻的编排智能体对接用户,子智能体在后台并行执行长任务并在完成后回报结果。

Why it matters

原文给出异步子智能体的五个管理工具与通知机制,可据此判断长任务并行的工作流怎么搭。

正文 · AI 翻译

想象一下,每次你交给助手一个重大项目,他们就会消失,并且只有项目完成后才会回来。你可能会立即解雇他们。一个好的助手在后台推动项目进展,同时保持联系并随时更新进展。当我们要求代理为实现更大的目标而工作时,它们需要同样的两个特性。代理必须反应迅速,立即根据之前的所有背景信息执行新指令,并且高效,同时处理多个大型任务。

我们用来构建代理的架构 不能 满足这两个要求。在标准的 ReAct 循环中,每个长工具调用都会阻塞循环,并且每个其他任务都会排队等待。相反,我们正在看到生态系统形成一种划分:一个与用户保持一致的代理和执行长期工作的后台工作者。 Claude Code 默认在后台运行子代理,OpenAI 的 dots 将工作交给后台工作者以同时推进多个任务,而 DeepSeek Harness 围绕一个与用户和后台工作者并行运行任务的路由器构建了其超级代理。

我们将这种模式带到 Deep Agents 中,使用 异步子代理。协调器保持可用状态以供用户使用,并组织对话的上下文,而异步子代理作为后台工作者运行,并在完成后报告。代理可以承担的工作量随着后台工作者的数量增加,而不是单个循环的长度。

异步子代理的工作原理

代理在一个循环中运行。模型调用一个工具,等待结果,然后决定下一步做什么。历史上,工具和子代理会阻塞这个循环,直到它们返回,就像依次等待每个慢调用一样。异步子代理就像使用 asyncio.create_task 或 Promise 启动的一个任务,你还没有等待它。调用立即返回,工作在后台独立运行,结果稍后返回。

Sync vs async subagents: the orchestrator hands work to async subagents and stays free to talk to the user

协调器将工作交给异步子代理,并保持空闲以与用户交谈。

异步工作依赖于系统的两个特性:

  • 用户可以联系协调器。 协调器是用户直接交互的代理。子代理不再持有它的循环,因此用户可以在它自己的循环不忙时联系它,而不是等待每个子代理完成。
  • 任务并行运行而不阻塞。 协调器在收到工作时启动子代理,而不是等待整个批次返回。

协调器使用五个工具管理异步子代理:

  • start_async_task 在自己的线程上启动子代理并立即返回。
  • check_async_task 获取任务的状态,一旦完成,就获取其结果。
  • update_async_task 向正在运行的任务发送新的指令。
  • cancel_async_task 停止正在运行的任务。
  • list_async_tasks 列出每个任务及其状态。

引导正在运行的子代理与联系协调器是分开的。当协调器使用 update_async_task 发送后续指令时,该子代理定义中的 update_strategy 字段决定发生什么:

  • "interrupt"(默认)停止当前运行并使用新指令重新启动子代理。用于修正,如 "使用 Postgres 代替。"
  • "enqueue" 持续后续指令,直到当前运行完成。用于添加,如 "完成后运行测试。"

通知的工作原理

所有未完成的任务都列在协调器的系统提示中,所以它总是知道有哪些任务正在进行。它可以check_async_task进行轮询,或者任务可以自行报告:

  • 如果协调器忙碌,它在每次模型调用前会检查未完成的任务,并在运行中途接续结果。
  • 如果它空闲,子代理会用新的运行唤醒它。
  • 如果它在审批上暂停,审批就会被保留,直到用户回答后结果才会到达。

An async subagent reports back whether the orchestrator is busy, idle, or paused on an approval

异步子代理会报告协调器是否忙碌、空闲或审批上暂停。

需要审批的子代理会显示为waiting,用户在子代理自己的线程上回答,不会打断协调器。在Slack的Managed Deep Agents中,请求会回帖到原始线程。

我们期望这种模式能推广到子代理之外的所有工具。OpenAI最近添加了对异步工具调用的支持,模型在调用工具后会继续工作,你的应用程序会在稍后的请求中将结果发送回来。

使用异步子代理

异步子代理在Deep Agents的Python和JavaScript中可用,以及在Managed Deep Agents中,其中使子代理异步需要一个字段:

from managed_deepagents import define_deep_agent

agent = define_deep_agent(
    name="research-assistant",
    model="openai:gpt-5.5",
    subagents=[
        {
            "name": "researcher",
            "description": "Researches a topic in the background.",
            "system_prompt": "Research the topic and report your findings.",
            "async": True,
        },
    ],
)

在Managed Deep Agents中,每个服务的代理也会得到general-purpose子代理的异步副本,所以它可以在运行时决定是否在前景或后台运行委派的工作。

任务通知处于Beta阶段,所以API可能还会变化。在async-deep-agents仓库中有一个可用的监督者,包含Python和TypeScript的研究者和编码者子代理。

试试异步子代理,并在GitHub问题或论坛上告诉我们你的想法。

来源: LangChain Blog · langchain.com