LangChain 提出异步子智能体架构 让智能体后台并行处理长任务
LangChain 提出“异步子智能体”架构:将智能体拆分为始终对用户保持响应的编排器,以及后台执行长任务并在完成后回报的子智能体。文章指出后台化正成为智能体基础设施的常态,并开源了含研究员与编码子智能体的 Python/TypeScript 参考实现。
报道正文
本文目录5 个章节
Agent 架构开源
Agent 正在走向异步

核心要点
- 随着 Agent 承担起更大的目标,它们需要在同时推进众多长期任务的过程中,始终保持对用户的响应能力。
- 异步子 Agent 将 Agent 拆分为两部分:一个始终对用户保持可用的编排器(orchestrator),以及若干在后台运行任务、并在完成后向编排器汇报的子 Agent。
- 后台工作正逐渐成为 Agent 基础设施的常态,从 Claude Code 这类编码 Agent 到 OpenAI 的 dots 这类个人 Agent,皆是如此。
.w-richtext figure{margin 0 !important}.w-richtext figure img{display;width%;border-radius}.w-richtext figure figcaption{margin-top}.w-richtext div[data-rt-embed-type](video){margin 0;border-radius;overflow}.w-richtext h2{margin-top}.w-richtext h3{margin-top}.w-richtext h4{margin-top}.w-richtext (pre)>code{font-family,SFMono-Regular,Menlo,Consolas,monospace !important;font-size:.82em !important;font-weight !important;color:#030710 !important;background:#fff !important;border solid #D5E1EC;border-radius;padding:.1em .38em !important;white-space}
想象一位幕僚长,每当你交给他一个大项目,他就此消失,直到项目完成才回来。你大概会立刻把他解雇。一位优秀的幕僚长会让项目在后台持续推进,同时保持随时可联系,并一路向你同步进展。当我们要求 Agent 朝着更大的目标努力时,它们也需要同样的两种特性。Agent 必须保持响应性——能够带着此前所有上下文,立即对新的指令作出反应;同时还要保持生产力——能够同时推进众多大型任务。
我们长期以来用于构建 agent 的架构无法同时满足这两项要求。在标准的 ReAct 循环中,每次长时间的工具调用都会阻塞循环,其他所有任务都只能排在它后面等待。相反,我们看到整个生态正在趋于一种分工模式:一个 agent 始终陪伴用户,而由后台 worker 承担耗时的工作。Claude Code 默认在后台运行 subagent,OpenAI 的 dots 把工作交给后台 worker,从而同时推进多项任务,而 DeepSeek Harness 则围绕一个与用户对话的 router 和并行执行任务的后台 worker 构建了它的超级 agent。
我们正通过 async subagents 将这一模式引入 Deep Agents。orchestrator 始终对用户保持可用,并持续整理对话的上下文,而 async subagent 作为后台 worker 运行,完成后回报结果。这样一来,agent 能承担的工作量随后台 worker 的数量增长,而不再受限于单个循环的长度。
async subagent 的工作原理
agent 在一个循环中运行。模型调用工具、等待结果,然后决定下一步做什么。过去,工具和 subagent 会阻塞这个循环,直到它们返回,就像代码依次 await 每个缓慢的调用一样。async subagent 则像一个用 asyncio.create_task 启动的任务,或者一个你尚未 await 的 Promise。调用会立即返回,工作在后台独立运行,结果稍后返回。

orchestrator 将工作交给 async subagent,并保持空闲以便与用户对话。
异步工作依赖于系统的两个特性:
- 用户可以触达 orchestrator。 orchestrator 是用户直接交互的 agent。subagent 不再占用它的循环,因此只要 orchestrator 自身的循环不忙,用户就能触达它,而不必等待每个 subagent 完成。
- 任务并行运行且互不阻塞。 有工作到来时,orchestrator 就启动 subagent,而不是等待一整批任务返回。
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 轮询,任务也可以自行回报:
- 如果编排器忙碌,它会在每次模型调用前检查未完成的任务,并在运行过程中获取结果。
- 如果它空闲,子代理会通过一次新的运行将其唤醒。
- 如果它因等待审批而暂停,审批流程不受影响,结果会在用户答复后送达。

需要审批的子代理会显示为 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 仓库中有一个可运行的 supervisor,包含 Python 和 TypeScript 版本的 researcher 和 coder 子代理。
不妨试用一下异步子代理,并在 GitHub issues 或论坛上告诉我们你的想法。