跳到正文
LangChain Blog·· 5 小时前精选AI 评分67

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

Agents Are Going Async

AI 导读

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

推荐理由

原文给出异步子智能体的五个管理工具与通知机制,读者可据此判断长任务智能体的架构取舍。

正文 · AI 翻译

想象一位幕僚长,每次你交给他一个大项目他就消失,直到项目完成才回来。你大概会立刻解雇他。一位优秀的幕僚长会让项目在后台持续推进,同时保持可联系,并一路向你汇报进展。当我们让智能体朝着更大的目标努力时,它们也需要同样的两个特性。智能体必须保持响应性,能够结合此前所有上下文立即执行新指令;同时必须保持生产力,能够同时推进许多大型任务。

我们长期以来用于构建智能体的架构无法同时满足这两项要求。在标准的 ReAct 循环中,每次长时间的工具调用都会阻塞循环,其他所有任务都排在它后面。相反,我们看到整个生态正趋向于一种分工:一个智能体始终陪伴用户,而由后台工作者执行长时间的工作。Claude Code 默认在后台运行子智能体,OpenAI 的 dots 将工作交给后台工作者以同时推进多项任务,而 DeepSeek Harness 围绕一个与用户对话的路由器和并行运行任务的后台工作者构建了它的超级智能体。

我们正通过异步子智能体将这一模式引入 Deep Agents。一个编排器保持对用户可用,并维护对话上下文的有序组织,而异步子智能体作为后台工作者运行,并在完成时回报结果。这样,智能体能够承担的工作量便随后台工作者数量的增加而增长,而不是受限于单个循环的长度。

异步子智能体如何工作

智能体在一个循环中运行。模型调用工具、等待结果,然后决定下一步做什么。过去,工具和子智能体会阻塞该循环,直到它们返回,就像代码依次等待每个缓慢的调用。异步子智能体则像用 asyncio.create_task 启动的任务,或一个你尚未 await 的 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 最近新增了对异步工具调用的支持,模型在调用工具后可以继续工作,你的应用会在后续请求中把结果发回。

使用异步子代理

异步子代理已在 Python 和 JavaScript 版的 Deep Agents 中提供,也在 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 子代理的异步副本,因此它可以在运行时决定是在前台还是后台执行委派的工作。

任务通知目前处于测试阶段,因此 API 仍可能变化。async-deep-agents 仓库中有一个可运行的 supervisor,包含 Python 和 TypeScript 版的 researcher 与 coder 子代理。

试试异步子代理吧,欢迎在 GitHub issues 或论坛上告诉我们你的想法。

来源:LangChain Blog · langchain.com