How always-on
agents work
always-on agent 是怎么运转的
阅读约 14 分钟
- Speaker
- Lee Robinson
- Course
- Stanford CS146S
- Date
- 2026-10-08
- Runtime
- 45:17
讲者现于 SpaceX(据其个人网站做 ML,此前在 Cursor);产品叫 Bot,口播称 GrokBot;录屏不含 Q&A。
always-on agent 就是把最基础的 agent loop 搬上服务器。这个 loop 即 “model + tools in a loop”:模型在循环里反复调用工具,直到不再需要工具为止;CS146S 学生在课程第一周亲手写过它。搬上服务器之后:
- 事件唤醒它,跑完一轮就停;
- 配一台会休眠的云电脑;
- 状态全部存进数据库。
让它成立的有两样东西:模型能力的提升,以及 loop 周围的基础设施和 context 工程。
怎样把一个关掉终端就会停的 loop,变成能连续工作几个月的同事?
- I00:00–10:04起点Why
模型变强后,agent 从“等你批准”变成“自己干活、你随时转向”,界面反而越来越简单。
- II10:04–18:07骨架Always on
没事时什么都不跑:事件唤醒,跑一轮就停,状态全部存库,崩溃后从断点继续。
- III18:07–27:24HarnessHow it works
只用一个工具和你说话,其余工具按需加载;重活交给 helpers,外加四道安全防线。
- IV27:24–34:27ContextStay sharp, stay cheap
前缀不变,趁缓存还热先压缩,记忆分层:长期运行也不会变笨、变贵。
- V34:27–45:17未来Where it goes
每个失败都变成 eval;尽量少造东西;学好新的积木和底层原理。
Your agent vs. an always-on agent
从 week-one loop 到 always-on
同一个 loop,换一种运行方式
CS146S 学生在课程第一周写过一个最基础的 agent(S03 标题:You built this in week one),它一关终端就停。本讲讲的是,怎样让同一个 loop 一直跑下去。
课程第一周写的基础 loopS03
messages = [system_prompt, user_message]
while True:
reply = llm(messages, tools=TOOLS)
messages.append(reply)
if not reply.tool_calls:
print(reply.text)
break
for call in reply.tool_calls:
messages.append(run_tool(call))
- 它像同事:知道什么时候该安静,在后台干活,有重要进展才来找你。目标是能连续工作几周甚至几个月。
How developers work with AI
怎么走到这里
从审批到转向
AI 做的事越来越多,人的角色从逐步批准变成随时转向;界面反而简单得像发短信。
2022–23复制粘贴在浏览器里聊天,手动把代码搬来搬去。
2024–25终端里的 agent它改文件、跑命令,每一步都要你批准。
2025–26为 agent 做的 app多个 agent 在后台或云端并行,你审查结果。
Nowalways-on你发一条消息,它带着自己的电脑、工具和记忆一直干活。
台阶越高,AI 做的越多。
Before:每一步都停在 “Approve?” 等你。
Now:你的插话(“Also check the Slack thread”“Actually, make it Thursday”)汇入同一条工作流;发日历邀请这一步由 auto-review 自动批准◐。
- 讲者团队的实现叫 Bot(S08)。界面左边是一列 bot(Sales Outbound、Inbox Manager……),右边是聊天。缺少 Salesforce 登录时,它会在自己的电脑上请你登录。
- 很多公司把“用独立模型审查每条命令”叫作 auto review。讲者认为,这比人疲劳地逐条批准上百条命令更安全。他还假设:如果做盲测,模型多半审得更好。
Six new model capabilities
模型变了什么
知识住在文件里
六项新的模型能力让 always-on 成为可能;知识就放在普通文件里,正如幻灯片所说:“Everything is computer”。
六项能力S10
- 长时间工作,并一直遵守指令。
- 把任务交给 helper,每个 helper 都有全新的 context。
- 使用真实工具:shell、文件、浏览器、MCP。
- 操作电脑,没有 API 的应用也能用。
- 知识存在文件里。
- 你演示一遍,它就存成 skill。
memory/profile.md常驻 prompt。memory/log/2026-10.md带日期的事实,一行一条。skills/*/SKILL.md需要时才加载(“Use this when…”)。routines/morning-brief一段 prompt,工作日 8:00 运行。为什么用文件
- 模型极其擅长用 shell。
- 纯文本,人和 agent 都能读写。
- 你说一次偏好,它就存进记忆。
- skills 按需加载,所以多装也不贵。
Inside an always-on agent
生命周期与三段式架构
没事时什么都不跑
always-on 不是机器一直开着,而是没事时什么都不跑,状态都已存好,任何触发都能把它拉回来。
- 一轮正在进行时,电脑绝不休眠。
- routine 用不到电脑时,电脑保持休眠。
- 进程没在运行时,不会有工具调用。
- t0—
每次唤醒都会记录来源◐ —
结论:所有端看到同一个会话。
- 云电脑(S15):每个用户一台 Firecracker 虚拟机,里面跑 Debian 容器,由 supervisor 保持运行。文件、已装的工具、浏览器登录状态都跨会话保留。
- 为什么 loop 跑在服务器上(S17):合上电脑照样干活;手机电脑无缝切换;发版不等 App Store;要跑几个月的 agent 不能放在设备上◐。
- 关键一条(S18):状态都在服务器上,所以虚拟机随时可以重建(比如修复 Linux 0-day 漏洞),不打断 loop。
- 给每个人的电脑都一直开着太贵,“世界上没有那么多电脑”。在 SpaceX,常有人派 bot 进会议记笔记。
Messages, crashes and the queue
可靠性
消息、崩溃与插队
可靠性靠三件事:消息带唯一 ID 和序号,每一轮都跑在 durable workflow 里,新消息按优先级排队。
按下发送之后S19
- 发送:消息先在本地显示,并带上唯一 ID;服务器丢弃重复的 ID,所以重试是安全的。
- 一轮:消息进入队列,一个会话一次只跑一轮,每一步都存进数据库。
- 通知:服务器只发一个“有变化”的信号,各端自己去拉数据,所以丢掉一个信号也无害。
- 排序:每个更新都带序号(41、42、43),缺了哪个就从数据库重新加载◐。
重复执行步数:0 / 0
图注:每一步都有记录;每一步都是幂等的(执行两次也无害);Temporal 这类开源引擎自带定时器和取消功能◐。
你在 1:1 对话里说“改成周四”或按 Stop:消息插队,打断正在跑的那一轮。
群聊、Slack、routine、helper 的消息:排到队尾;连发的 3 条合并成 1 轮。
One tool for talking to you
Harness ①:一个对话工具
SendToUser
agent 只用一个工具和你说话,就是 SendToUser;需要你确认的事,交给专门的 UI 控件。
- 思考不外露。
- 没有新东西就不说话。
- 富消息:文件、多选、安全的密码输入。
- 最后一条消息直接结束这一轮。
登录
由 1Password 填表,密码不经过模型。
付款
等你点 Allow 或 Deny。
邮件草稿
由你选 Send 或 Discard。
表情回应◐
- 讲者说,和课程第一周写的基础 harness 相比(可能也包括一些同类产品),最大的不同就是客户端和服务器之间只有这一个工具。
Tools and helpers
Harness ②:工具与 helpers
先走最便宜的路
工具先只给名字;获取信息的方式按成本逐级升级;重活交给 helper,主 agent 只收简报。
工具细节 62 格 · 空闲 8 格
工具 8 格(细节 6、名字 2)· 空闲 62 格
System prompt工具细节工具名对话空闲
每格 = 1%,按幻灯片示意比例。这种做法也叫 dynamic tool discovery / tool search tool。
越往后越慢、越贵◐
规则:connector 坏了,不要改用浏览器绕过去,而是告诉你。
主 agent 自己回答简单问题,把大任务交出去,收回一份简短报告。
用电脑的三种方式S27
- 读页面结构:拿到按钮和链接的列表,快且稳。
- 点像素:在 1280×800 的屏幕上点,用于桌面 app 和系统对话框。
- 问人:遇到登录、两步验证、captcha、付款时交给你。
- 点击由 helper 完成,截图不会进入主 context。
工具设计 4 条S29
- 两轮之间不增删工具。
- 每个工具的描述加 schema 少于 4,000 字符。
- 存状态用专用工具,方便审查。
- 错误信息要写清下一步,例如:“The computer is asleep. Use Shell or Read to wake it, then try again.”
- 每个 helper 都是一个 durable workflow,崩溃后能接着做。产品因此“感觉像有无限的 context”。
How we keep it safe
安全
四道防线
四道防线:模型审查、来源标记、先问再发、密码隔离。
| 防线 | 规则 |
|---|---|
| 自动审查 | 独立模型在高风险操作执行前检查;被拦下时请你批准,15 秒没有回应就维持拦截 |
| 追踪来源 | 邮件和 webhook 的文本标为不可信;记忆是信息,不是指令 |
| 先问 | 你没要求,就不给别人发消息;新的 routine 需要你同意 |
| 藏好密码 | 密码放在环境变量里,不进模型;要动你的笔记本,需要你批准 |
Keep the start of the prompt the same
Context 工程 ①:Prompt 缓存
cache miss 就是 bug
长期运行的 agent,大部分 token 都应该命中缓存。做法是:prompt 开头保持不变,新内容只加在末尾,出现 cache miss 就当 bug 修。
命中缓存cache miss
- 主 context 只留指针或总结(S33):长输出存文件,截图和重活交给 helper,旧消息换成总结,指令写成 skill。
- 把 cache miss 当 bug(S34):总结前前缀一字不改;部署改了工具描述,就给进行中的对话追加说明;顺序固定、分段哈希;用户一打字就预热缓存。
- 今年 1 月 OpenClaw 流行时,出现了大量 cache miss,后来做了很多修复。做 A/B 测试时,也不能打乱 prompt 的顺序。
Summarize while you're away
Context 工程 ②:压缩与记忆
趁缓存还热先总结
趁缓存还热,先把对话压缩成总结。记忆分四层:Profile 常驻 prompt,Log 只放最相关的 30 条。
- 后台任务马上要唤醒 agent 时,就跳过这次总结。
- 最后几条消息逐字保留。
- 一轮太长时,可以在中途总结。
- 重要的事实排在前面,旧的慢慢下沉。
- 只能删除自己看到过的事实。
- 关于你的事实,你的所有 agent 共享。
- 记忆是信息,不是指令。
- 所有压缩都有损,“可能有整篇博士论文专门研究这个问题”。
Product and model improve together
产品与模型一起进化
每个失败都是 eval
模型要为产品专门训练。每个失败都会变成一条 eval:内循环用它修 harness,外循环用它训练下一代模型。
- 训练三阶段(S37):
- 预训练:学语言、代码和通用知识。
- SFT:学会 harness,包括工具和格式、什么时候该快速回复。
- RL:练习遵循长指令、使用 skills 和记忆、点对位置(grounding)、与其他 bot 协作。
- 推理也分开调:主 agent 几秒内就要回复;helper 要能可靠地跑好几个小时◐。
- 01bot 出错
- 02变成 eval
- 03修 harness、prompt 或推理
- 04跑 evals
- 05发布
- 01用 harness 和 evals 训练新模型
- 02换进产品
- 03用户用出新用法(比如满是 bot 的群聊)
- 04做新的评估和训练
Where this is going
往哪里走
Delete the product
Delete the product:假设模型会大幅变强,围绕它尽量少造东西,用不上的就删掉。
| 6–12 个月的预测(S40) | 对应的开放问题(S41) |
|---|---|
| 更长的项目(几个月) | 怎样测试跑几周的 agent |
| 更好的记忆 | 正确的记忆:更新、遗忘、不编造 |
| 更强的工具 | prompt injection:邮件和网页里的骗人文字 |
| 更简单的界面(也许只用语音) | 何时开口:太多是噪音,太少看不见进展 |
| 在工作中学会新技能 | 协作:多 agent 共用电脑和记忆=分布式系统问题 |
| 知识被写下来 | 成本:空闲近乎免费,活跃也要便宜 |
左右两栏按主题两两对照。
- “今天的模型是它们最差的时候”,半年后可能要把 UI 整个重做。他口头还补充了一个开放问题:安全,不能让 agent 被坏人接管。
What to take away
带走什么
架构会复利
代码越容易写,懂得部件怎么组合就越重要。
- 架构会复利:写代码便宜了,对的架构能让你走得比别人快。
- 自己造一个:从课程第一周写的基础 agent 出发,加上服务器、电脑和记忆。开源的 always-on agent 很适合拿来学。
- 学 LLM 的基本原理:就像做网站要懂数据库◐。
- 他仍然会读自己写的代码,尤其要理解自己发布出去的架构。
Summary
总结
贯穿全讲的 6 条原则读后归纳
| 原则 | 出处 |
|---|---|
| 状态是唯一的真相,其他都可以丢 | 03生命周期04可靠性 |
| 默认沉默,开口要有理由 | 03生命周期05对话工具 |
| 主 context 最稀缺 | 06工具与 helpers08Prompt 缓存09压缩与记忆 |
| 只追加,不修改 | 04可靠性08Prompt 缓存 |
| 先走最便宜、最可控的路 | 06工具与 helpers07安全 |
| 每个失败都是 eval | 10训练飞轮 |
讲者的收尾:假设模型会大幅变强,围绕它尽量少造东西;代码越容易写,懂得部件怎么组合就越重要。
Glossary
术语
glossary25 terms
| 术语 | 中文解释 | 例子 |
|---|---|---|
| Always-on agent | 状态常驻服务器、由事件唤醒、能长期工作的 agent;没事时什么都不跑 | Bot / GrokBot |
| Harness | 包在模型外面的运行框架:工具、prompt、loop、状态管理 | GrokBot harness |
| Agent loop | 模型调工具、拿回结果、再调工具的循环 | S03 |
| Routine | 按计划或由 webhook 触发的一段 prompt,类似 cron job | 工作日 8:00 的晨报 |
| Router | 去重,并把事件分到正确会话的组件 | S14 |
| Turn | agent 处理一批消息的一轮运行 | S19 |
| Firecracker | 轻量级虚拟机技术,便于快照和重启 | agent 的云电脑 |
| Thin client, thick server | 客户端轻、服务器重的架构 | S17 |
| Durable workflow | 每一步都有记录、崩溃后能从断点恢复的执行方式 | Temporal |
| Idempotent 幂等 | 同一步执行两次,结果相同且无害 | S20 |
| SendToUser | agent 和你说话的唯一工具 | S23 |
| MCP / Connector | 让模型调用外部应用的协议 / 接入某个 app API 的工具 | Gmail、Plaid |
| Dynamic tool discovery | 先只给工具名,用到时再加载细节 | S25 |
| Computer use | 模型看屏幕,用鼠标和键盘操作电脑 | 1280×800 屏幕 |
| Accessibility tree | 页面元素的结构化列表,比截图省 token | S27 |
| Grounding | 把指令对应到屏幕上正确位置的能力 | “点对位置” |
| Subagent / helper | 主 agent 派出去的、有独立 context 的子 agent | Video helper |
| Auto-review | 独立模型在执行前审查高风险操作;被拦下时请你批准 | 15 秒无回应就维持拦截 |
| Prompt injection | 外部文本里藏着骗 agent 的指令 | 钓鱼邮件 |
| Context window | 模型一次能处理的 token 上限 | 例:20 万 tokens |
| Prompt caching / cache miss | 复用相同的前缀来降低费用 / 前缀变了,按全价计费 | S32、S34 |
| Compaction | 把长对话压缩成总结,会有信息损失 | S35 |
| Eval | 衡量模型或产品行为的测试用例 | S38 |
| SFT / RL | 监督微调 / 强化学习 | S37 |
| Delete the product | 假设模型会变强,尽量少造东西,及时删掉多余部分 | S39 |












































