LangChain:Agent正在走向异步

发布时间 2026-11-06
来源 LangChain Blog
字数 2,790 字
查看原文 反馈

智能总结

LangChain 博客指出,标准 ReAct 循环中长时间工具调用会阻塞 Agent,使其无法同时保持响应和推进任务。为此它把异步子 Agent 引入 Deep Agents:编排器始终对用户可用并维护对话上下文,子 Agent 在后台独立线程执行任务,完成后汇报。

Sydney Runkle、Thushanth Bengre,2026 年 11 月 5 日,4 分钟阅读 返回博客 创建 Agent 分享

核心要点

  • 随着 Agent 承担更大的目标,它们需要在对用户保持响应的同时,并行推进许多耗时较长的任务。
  • 异步子 Agent(async subagent)将 Agent 拆分为两部分:一个始终对用户保持可用的编排器(orchestrator),以及在后台运行任务、完成后向编排器汇报的子 Agent。
  • 后台工作正在成为 Agent 基础设施的常态,从 Claude Code 这类编码 Agent,到 OpenAI 的 dots 这类个人 Agent,都是如此。

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

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

我们正通过异步子 Agent 将这一模式引入 Deep Agents。编排器始终对用户保持可用,并负责组织对话的上下文;异步子 Agent 则作为后台工作者运行,完成后向编排器汇报。这样,Agent 能承担的工作量便取决于后台工作者的数量,而不再受限于单一循环的长度。

异步子 Agent 的工作方式

Agent 在一个循环中运行。模型调用工具、等待结果,再决定下一步做什么。过去,工具和子 Agent 会阻塞这个循环,直到它们返回结果,就像代码依次等待每个缓慢调用完成的写法。异步子 Agent 的工作方式类似于用 asyncio.create_task 启动的任务,或者一个你尚未 await 的 Promise。调用会立即返回,工作在后台独立运行,结果稍后返回。

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

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

  • 用户能够联系到编排器。 编排器是用户直接交互的 Agent。子 Agent 不再占用它的循环,因此只要编排器自身的循环不忙,用户就能联系到它,而无需等待每个子 Agent 完成。
  • 任务并行运行且不阻塞。 编排器在有工作到来时启动子 Agent,而不是等待一整批任务全部返回。

编排器通过五个工具管理异步子 Agent:

  • start_async_task 在独立线程上启动子 Agent,并立即返回。
  • check_async_task 获取任务状态,并在任务完成后获取其结果。
  • update_async_task 向正在运行的任务发送新指令。
  • cancel_async_task 停止正在运行的任务。
  • list_async_tasks 列出所有任务及其状态。

引导正在运行的子 Agent 与联系编排器是两回事。当编排器通过 update_async_task 发送后续指令时,该子 Agent 定义中的 update_strategy 字段决定会发生什么:

  • "interrupt"(默认值)会停止当前运行,并用新指令重新启动子 Agent。适用于“改用 Postgres”这类纠正。
  • "enqueue" 会暂存后续指令,直到当前运行结束。适用于“完成后运行测试”这类追加。

通知的工作方式

每个未完成的任务都会列在编排器的系统提示中,因此它始终知道有哪些任务正在进行。它可以用 check_async_task 轮询,任务也可以主动汇报:

  • 如果编排器忙碌,它会在每次模型调用前检查未完成的任务,并在运行过程中接收结果。
  • 如果编排器空闲,子 Agent 会通过一次新的运行将其唤醒。
  • 如果编排器因等待审批而暂停,审批流程不受影响,结果会在用户答复后送达。

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

需要审批的子 Agent 会显示为 waiting,用户在子 Agent 自己的线程上作出答复,不会打断编排器。在 Slack 上的 Managed Deep Agents 中,请求会回帖到原始线程。

我们预计这一模式将推广到子 Agent 之外的各类工具。OpenAI 最近新增了对异步工具调用的支持:模型在调用工具后继续工作,由你的应用在后续请求中返回结果。

使用异步子 Agent

异步子 Agent 已在 Python 和 JavaScript 版 Deep Agents 中提供,也在 Managed Deep Agents 中提供;在那里,只需一个字段即可让子 Agent 变为异步:

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 中,每个对外服务的 Agent 还会获得一个异步版的 general-purpose 子 Agent,因此它可以在运行时决定将委派的工作放在前台还是后台执行。

任务通知目前处于测试阶段,API 仍可能变化。async-deep-agents 仓库提供了一个可运行的 supervisor 示例,包含 Python 和 TypeScript 版本的研究员与编码子 Agent。

不妨试用异步子 Agent,并在 GitHub issues 或论坛上告诉我们你的想法。

相关内容

How We Optimized Browser Use for Deep Agents

Deep Agents · Agent 架构

我们如何为 Deep Agents 优化浏览器使用

Sydney Runkle,2026 年 11 月 3 日,10 分钟阅读

Agent 架构

Managed Deep Agents v0.10:浏览器使用与异步子 Agent

Nathan Drezner、Sydney Runkle,2026 年 10 月 29 日,6 分钟阅读

Deep Agents · Agent 架构 · 部署

Managed Deep Agents 中的浏览器使用

Sydney Runkle,2026 年 10 月 29 日,7 分钟阅读

感谢!你的提交已收到!哎呀!提交表单时出了点问题。

看看你的 Agent 到底在做什么

LangSmith 是我们的 Agent 工程平台,帮助开发者调试每一次 Agent 决策、评估变更,并一键部署。

试用 LangSmith 获取演示