听说过 Baader-Meinhof 现象吗?就是你第一次学到一个词,然后突然发现到处都能听到它。我觉得同样的原理也适用于软件工程:你了解到一个简单但有效的设计模式,然后突然发现它无处不在。

我们在主动式智能体上正看到这种情况,我们注意到几乎所有你喜爱的新兴主动式智能体系统都由一个非常简单的机制驱动:智能体作为 cron 任务运行,把一个已有五十多年历史的操作系统原理用于一个非常现代的用例。

未来属于主动式、始终在线、环境感知的智能体。Muse、Instinct、Dots、Claude Duet、Hone 等产品的发布都反映了这一点。

Cron 驱动了几种不同的能力,它们结合起来让这些智能体变得主动、个性化且环境感知——也就是说,它们可以自行执行任务,无需人工指示。

在这篇博客中,我们将逐一介绍 cron 解锁的各项能力、构建这类智能体所需的两个核心底层组件,然后展示如何在Managed Deep Agents中实现这些。

我们已经看到了 cron 能带来的影响。主动性正成为智能体行为的新默认,因为它解锁的新功能范围非常广泛。LangSmith 上超过 70% 的 Managed Deepagent 运行来自定时运行而非人工输入消息。

Cron 解锁了什么?

Cron 虽然是个简单的概念,却解锁了几种不同的行为,塑造了这些主动式、始终在线的智能体。

记忆:所有这些智能体的一个显著特点是,它们能在更长的时间跨度内记住关于你的事实。实现这一点部分涉及运行一个后台任务,把之前的对话压缩成更密集的记忆形式。这被通俗地称为“做梦”。在底层,这只是一个按某种节奏(例如每天一次)运行的 cron,通过反思对话中的收获来更新长期记忆。

主动性这些智能体之所以能发挥作用,部分原因在于它们会主动就一个它们认为你可能感兴趣的想法发起沟通。在底层,其运作方式是存在某种关于该智能体应该完成什么的“想法”。

对于通用智能体来说,这可能简单到只是做一个好助手:主动预判你接下来需要什么,比如提醒即将到来的截止日期、跟进一个未完结的线程,或推送与你工作相关的新闻。对于专用智能体,比如 Hone,智能体是在朝着一个明确的目标努力。然后 cron 按某种节奏(每小时一次)运行,提示智能体探索新的行动以推进其目标。这些行动随后会以主动消息的形式呈现给用户。

智能分诊:这个世界上的噪音太多了。常驻智能体的一个主要用例是监控某个信息源(Slack、Email 等),并把相关消息推送给用户。在底层,这可以通过一个按某种节奏(每十分钟一次)运行的 cron 来实现,它提示智能体查看事件流,并把任何值得注意的内容通知用户。

跟进提醒:cron 并不只是用在后台。用户常常会要求在某 个时间点被提醒某件事。cron 可以用来设定一个时间表,到那时唤醒并提醒用户。

编排:智能体集群可以由单个编排智能体来管理,该智能体具备在未来唤醒自己的能力。一个编排智能体可以用 cron 监控一个集群。它可以在等待某个异步子任务完成时休眠,并按固定间隔重新唤醒自己来检查进度。

构建主动型智能体的两个关键部分

为了构建这类智能体,我们发现通常有两个关键部分。

首先是一个健壮的 cron 服务器。你需要一个让开发者能轻松添加 cron 的服务器。他们应该能够按自己需要的任何时间表添加它们,并附带一个要作为其中一部分运行的提示。如果智能体在运行时需要某些技能或权限,这些也应该包含在内。如果在某个特定时间点有大量运行,服务器应该对它们做轻微的“抖动”以分散负载。

其次,你需要一个对智能体友好的接口。对于后续跟进之类的操作,智能体需要能够与这些提醒进行交互。它需要一种简单但有约束的方式来设置和修改提醒。

用 MDA 构建这个

Managed Deep Agents——它们托管在LangSmith Deployments 上——提供一个内置的 cron 服务器,可以动态触发智能体运行。定时运行看似简单:它只是传入的提示词,按计划触发,其线程和记忆基于创建该计划的主体。上述工具包为仅接受提示词和 cron 计划的工具提供了基础。

借助 Managed Deep Agents,计划可以静态定义,也可以由智能体动态定义。

在 Managed Deep Agents 中,计划可以在智能体定义中定义,也可以在运行时通过使用工具调用 Schedules SDK 来创建。

例如,将固定计划作为其核心设计的一部分来构建智能体——比如每日销售简报——只需在以下位置放一个文件schedules/:

# schedules/daily_digest.pyfrommanaged_deepagentsimportdefine_scheduleschedule = define_schedule(cron="0 8 * * 1-5",timezone="America/Los_Angeles",prompt="使用你的工具检查销售报告并发送 KPI 简报。",)

Managed Deep Agents 还提供动态计划,最终用户可以提示你的智能体安排你在开发时未曾预料到的周期性任务。为支持这一点,将 Schedules SDK 封装在工具中:

# tools/scheduling.pyfromlangchain.toolsimporttoolfrommanaged_deepagentsimportManagedDeepAgentRuntime@toolasyncdefset_schedule(prompt:str,cron:str,runtime: ManagedDeepAgentRuntime) ->str:"""按 cron 计划为当前用户运行提示词。"""item =awaitruntime.schedules.create(owner={"type":"user"}, cron=cron, prompt=prompt)returnf"已创建计划{item['id']}。"@toolasyncdeflist_schedules(runtime: ManagedDeepAgentRuntime) ->str:"""列出当前用户的计划。"""page =awaitruntime.schedules.list(owner={"type":"user"})returnstr(page["items"])@toolasyncdefdelete_schedule(schedule_id:str,runtime: ManagedDeepAgentRuntime) ->str:"""删除当前用户的某个计划。"""awaitruntime.schedules.delete(schedule_id, owner={"type":"user"})returnf"Deleted schedule{schedule_id}."

‍开发者需要灵活性,Managed Deep Agents 的工具系统正是为此而设计。不同的智能体类型可能需要暴露不同的工具包来进行调度。在某些情况下,一个基础的remind_me包装一次性运行或一个check_in_later可能就足够了:

fromdatetimeimportdatetime, timedelta, timezonefromlangchain.toolsimporttoolfrommanaged_deepagentsimportManagedDeepAgentRuntime@toolasyncdefcheck_in_later(prompt:str, minutes:int, runtime: ManagedDeepAgentRuntime) ->str:"""为当前用户在当前时间之后的若干分钟运行一次提示词。"""at = datetime.now(timezone.utc) + timedelta(minutes=minutes)item =awaitruntime.schedules.create(owner={"type":"user"}, at=at, prompt=prompt)returnf"Scheduled a check-in{item['id']}."

从我们的文档开始为你的 Managed Deep Agents 添加调度:langch.in/mda。你只需mda init和mda deploy就能在组织内分发一个主动式智能体。

‍