70% 的 Agent 运行来自定时任务,人类只负责偶尔开口
Nathan Drezner 发现,几乎所有主动型 Agent 都是 cron 任务加一段提示词。LangSmith 上超过 70% 的 Managed Deepagent 运行来自调度,不是人打字。那些会做梦的记忆、主动找你的助理,底层都是五十年前的老机制。
如果你用过那种会主动给你发消息的 AI 助手,比如提醒你回邮件、跟进某个话题、早上推一份摘要,翻一下它的底层,大概率能找到一个 cron 表达式。
Nathan Drezner 在 LangChain 的博客里写了个观察(原文):几乎所有你见过的 proactive agent,本质上就是一个定时任务加一段提示词。所谓“记忆在夜间做梦”,也是同一个机制,一个每天跑一次的 cron,把之前的对话压缩成更密集的长期记忆。
有个回复说,原来不是只有我这样。他提到的 Baader-Meinhof 现象,学会一个词之后突然到处都能看到它,用在这儿挺合适。
这句话听起来像在拆台。但它解释了为什么这类产品突然多起来:Muse、Instinct、Dots、Claude Duet、Hone,底层都是同一个五十多年前的操作系统概念。
cron 解锁了什么
作者把能力拆成几块:
记忆整理。后台任务按频率压缩历史对话,更新长期记忆,俗称 dreaming。
主动性。cron 按小时唤醒 agent,让它围绕目标探索下一步动作,再把结果推给用户。Hone 这类专用 agent 有明确目标;通用 agent 的目标可能只是当个好助理,比如提醒截止日期、跟进悬而未决的话题。
智能分诊。监控 Slack、邮箱等信息流,每十分钟跑一次,挑出值得提醒的消息。
跟进提醒。用户让 agent 稍后提醒自己,本质上是排一个定时任务。
编排。一个编排 agent 管理一组 agent,等待异步子任务时自己睡去,过一阵醒来检查进度。
一个数据:LangSmith 上 Managed Deepagent 的运行里,超过 70% 来自调度,不是人打字发消息。
需要两块东西
第一,一个好用的 cron 服务器。开发者能按任意频率添加任务,带上要执行的提示词、需要的技能和权限。同一时间点任务太多时,服务器要做抖动,把负载摊开。
第二,agent 友好的接口。像跟进提醒这种动作,agent 得能自己创建和修改提醒,但需要受管控。
MDA 的做法
Managed Deep Agents 托管在 LangSmith Deployments 上,自带 cron 服务器。一次调度运行的内容很朴素:一个提示词,按时间触发,线程和记忆归属于创建者。
静态调度就是一个文件:
# schedules/daily_digest.py
from managed_deepagents import define_schedule
schedule = define_schedule(
cron="0 8 * * 1-5",
timezone="America/Los_Angeles",
prompt="Inspect the sales report using your tools and send a KPI readout.",
)
动态调度把 Schedules SDK 包成工具,让终端用户在运行时创建任务:
# tools/scheduling.py
from langchain.tools import tool
from managed_deepagents import ManagedDeepAgentRuntime
@tool
async def set_schedule(prompt: str, cron: str, runtime: ManagedDeepAgentRuntime) -> str:
"""Run a prompt for the current user on a cron schedule."""
item = await runtime.schedules.create(owner={"type": "user"}, cron=cron, prompt=prompt)
return f"Created schedule {item['id']}."
@tool
async def list_schedules(runtime: ManagedDeepAgentRuntime) -> str:
"""List the current user's schedules."""
page = await runtime.schedules.list(owner={"type": "user"})
return str(page["items"])
@tool
async def delete_schedule(schedule_id: str, runtime: ManagedDeepAgentRuntime) -> str:
"""Delete one of the current user's schedules."""
await runtime.schedules.delete(schedule_id, owner={"type": "user"})
return f"Deleted schedule {schedule_id}."
有时候一个简单的“稍后提醒”就够了:
from datetime import datetime, timedelta, timezone
from langchain.tools import tool
from managed_deepagents import ManagedDeepAgentRuntime
@tool
async def check_in_later(prompt: str, minutes: int, runtime: ManagedDeepAgentRuntime) -> str:
"""Run a prompt once for the current user, a number of minutes from now."""
at = datetime.now(timezone.utc) + timedelta(minutes=minutes)
item = await runtime.schedules.create(owner={"type": "user"}, at=at, prompt=prompt)
return f"Scheduled a check-in {item['id']}."
文档在 langch.in/mda。
评论区里的实话
有人补了两句。一个网友说,随之而来的是那些无聊的问题:重叠运行、任务悄悄停掉、一周没人发现。另一个提到 ramp up 阶段:你得全程盯着 agent,把自己的做事方式喂给它,它才能真的干活。
这两条比大部分 demo 都值得看。cron 不新鲜,新鲜的是这次它驱动的东西会说话。
发布时间: 2026-10-29 11:36