Activity Frames:不用一个模型,把你一天的屏幕活动"编译"成 Agent 能读的记忆
你让 Agent 帮你回答"我今天该优先做什么",它能看到的只有对话框里那点东西。它不知道你一上午都泡在一个 PR 里,不知道你午饭后切了四十次上下文,也不知道你 16:40 放弃了一封写到一半的邮件。
讽刺的是,这些数据其实早就被记录下来了。ActivityWatch 这类自动时间追踪器已经存在了十年,微软 Recall 在 Copilot+ PC 上持续截屏,OpenAI 的 Chronicle 也在给 Codex 构建屏幕记忆。采集已经是commodity,消费不是。一天的屏幕快照大约两千行,每行只说"时刻 t,应用 a 的窗口 w 停在 URL u"——把这两千行直接丢给模型,12.7 万 token,模型还得自己做会话切分、去重、时长统计。或者让 LLM 先总结一遍?总结是便宜了,但引入了 summarizer 的全部毛病:每次运行都要花钱、结果不确定、长输入下可靠性下降,还可能编造根本没发生过的活动。
arXiv 2608.05784 这篇论文给出的答案朴素得有点反常:别用模型,用编译器。
核心摘要:作者提出 Activity Frames,一套确定性、零模型的流水线,把被动采集的屏幕活动流编译成带类型的"活动帧"——每帧是一段有界的注意力片段,带应用、站点、起止时间、输入量和指回原始行的证据指针。全程没有任何模型参与,所以输出字节级一致、可缓存、可机械审计。在作者自己 51 个活跃日、128,756 帧的真实语料上,一天的原始采集被压缩 86 倍、68 毫秒完成;Agent 读这个编译块回答关于当天的问题,准确率 98.4%,而读 LLM 摘要只有 66-80%。更有意思的是,这套编译器顺手变成了一把"需求侧成本标尺",首次实测了 Agent 成本模型里两个一直被假设、从没被测量的参数。这是一篇"机制创新 + 诚实测量"的论文,工程价值大于学术新意,但胜在干净、可复现、敢报难看的数字。
📖 论文信息
- 标题:Activity Frames: Deterministic Screen-Activity Compilation for Agent Memory and Replay
- 作者:Nossa Iyamu(Independent Researcher)
- 发表:2026 年 8 月 6 日提交,arXiv:2608.05784(cs.AI),14 页,5 图 4 表
- 代码:schema、编译器、评测 harness 全部开源(MIT 协议)
🎯 问题动机:Agent 记忆记错了东西
现在的 Agent 记忆,记的都是"用户说了什么",不是"用户做了什么"。MemGPT 把对话历史当操作系统内存一样分页调度,Mem0 从对话里提炼事实,Zep 把记忆组织成时间知识图谱——全都是对话记忆。
行为记忆的原料明明就在那里,为什么没人用?因为两条现成的消费路线都不太行。原文把这笔账算得很清楚:一天 2,066 行快照,序列化成搜索 API 返回的那种 JSON,是 126,812 token。而 LLM 摘要路线,论文后面的实验会证明它在"量"的问题上错得离谱(剧透:把 144 分钟说成 7 小时)。
作者的定位很精准——缺的不是采集,也不是模型,而是中间那层确定性编译。就像编译器把指令变成结构化产物、不带任何"观点"一样,这套流水线把快照流变成活动帧,同样的数据库和窗口永远产出同样的文档。记忆因此可以免费重建、安全缓存、机械审计。
说实话,这个思路让我愣了一下。2025 到 2026 年这波屏幕记忆工作——MIRIX 用多智能体系统跑连续截屏加云端模型调用,FOCAL 用本地视觉语言模型写会话摘要(报告了 60% 的 token 削减),ProAgentBench 在应用切换点切段后上模型标注——几乎清一色把模型塞进记忆构建环路里。这篇论文反着来:编译路径上一个模型都不放,把"解释"隔离到一个独立的、可剥离的层级里。
🏗️ 方法核心:两层 schema + 六条编译规则
两层架构:测得的和推断的,物理隔离

架构非常直白:采集引擎(屏幕、无障碍树、输入事件,存本地 SQLite)→ 编译器(会话切分、富化、实体类型化,只读数据库)→ Agent(通过 MCP 工具拿上下文块)。全程在本机,默认什么都不外传。
关键设计是测得层与推断层的边界。第一层每个字段都必须能由确定性代码从采集数据推导出来——没有意图标签,因为代码观测不到意图。第二层允许工具添加解释(比如任务标签、项目聚类),但有三条 schema 强制的规矩:内容必须住在带命名空间的 inferred 块里、必须带 high/medium/speculative 置信度标签、必须指明支撑它的证据字段。消费者随时可以把 inferred 块剥掉,剩下的永远是一份纯测得文档。
这个边界我觉得是全文最值钱的设计。它不是说"我们的模型不会幻觉",而是从结构上让幻觉无法伪装成观测。就算一个 tier-2 工具被攻破或者犯蠢,它也没法把解释注入到测得层里去。
一个活动帧长什么样
论文给出的示例帧(YAML,实体已匿名化):
- id: f-0007
app: "Google Chrome"
site: "linkedin.com"
start: "20:24:04" end: "20:42:11"
duration_min: 18.0 wall_min: 21.5
pages:
- {kind: people_search, entity: "cto paris", count: 2}
- {kind: profile, entity: "jane-doe"}
- {kind: company, entity: "acme"}
input: {keys: 214, clicks: 31}
interruptions: [{app: "Slack", seconds: 12}]
evidence: {frame_ids: "99871..100147"}
注意最后一行:每帧都带 evidence 指针,指回它被编译出来的原始快照行。验证者可以据此重读那些原始行、重算这帧——每段记忆都是可机械审计的,这对防记忆投毒攻击是个硬约束。
还有一条隐私规则写进了 schema 而不是实现里:输入的"量"(按键数、点击数)是标准字段,输入的"内容"(打了什么字)默认排除,只有操作者显式 opt-in 才能包含。合规的产出方没法偷偷吐出内容。
六条确定性编译规则
切分由三个常数控制,全部从采集节奏选出、而不是在结果上调出来的:
| 规则 | 常数 | 干什么 |
|---|---|---|
| Dwell 计酬 | 90 秒上限 | 每帧贡献 \(\min(\Delta t, 90s)\) 的活跃时间,\(\Delta t\) 是到下一帧的间隔 |
| 会话间隔 | 300 秒 | 超过就关闭当前帧,成为候选覆盖缺口,不跨间隔计酬 |
| 抖动合并 | 20 秒 | \(A \to B \to A\) 模式中 \(B\) 不超过 20 秒则折叠回 \(A\),但 \(B\) 作为 interruption 被记录在案,时间不计入 \(A\) |

你想想看,抖动合并这条其实很微妙。用户切到 Slack 回了个 12 秒的消息再切回来,朴素切分会把一段专注撕成两段;合并规则把它折回去,但不丢数据也不重复计数——B 以 interruption 的形式留在帧上,秒数照实记录。"什么都不隐藏,什么都不双算",这种克制在 Agent 系统里挺少见的。
富化阶段修三个采集端的可靠性缺陷:输入事件重新归到时间上最近的快照(修 stale attribution);匿名点击用快照里的元素树做坐标解析(精确包含 → ±40px 容差环 → 屏幕区域兜底,每步都打标,解析不了就老实说解析不了);键盘布局错位由操作者显式提供映射表修复,默认恒等、绝不推断。
实体类型化是纯 URL 解析——路径和查询参数,不抓取、不模型。二十多个站点专用解析器 → 通用搜索参数检测 → 子域名路径启发 → 全兜底,保证每个 URL 都映射到点什么。因为每层都是 URL 的纯函数,新增覆盖就是一行行可 review 的贡献。
🧪 实验:数字说话
语料与 token 成本
语料是作者自己的真实采集(单用户,61 个日历日 / 46 个活跃日冻结版本):109,735 行快照、214,360 个输入事件、840 万行元素树、54 个应用,单显示器流内帧间隔中位数 6.1 秒。
三种表示的 token 账(cl100k_base 编码):

原始行 126,812 token,编译后的 schema 文档 34,815(3.6 倍),紧凑上下文块 1,469——86 倍压缩,小到可以塞进每个 system prompt。而且两个编译产物都是零模型调用产出的,压缩是免费的。全天编译中位耗时 68 毫秒(Apple Silicon 消费级笔记本),记忆可以每次查询时现重建。
下游问答:编译块碾压两条 baseline
这是我个人觉得最有说服力的实验。评测设计得相当小心:8 天(最近 7 个连续活跃日 + 1 个原始序列化会爆上下文窗口的忙日),每天的问题由独立的 SQL oracle 从原始表算答案——刻意不用 Activity Frames 编译器自己,避免循环论证。oracle 和编译器测的是同一个构念(屏幕驻留时长),作者还先验证了编译器对 oracle 的一致性(覆盖分钟数中位差 0.9 分钟)。
两个档位的 Agent——Claude Sonnet 4.5 和 Opus 4.5——不给工具,分别读三种表示回答同样的问题:
| 表示 | Sonnet 4.5 准确率 | Sonnet 时长误差 | Opus 4.5 准确率 | Opus 时长误差 |
|---|---|---|---|---|
| 原始行 | 82.1% | 39.7% | 91.1% | 25.7% |
| LLM 摘要 | 66.1% | 135.7% | 80.4% | 25.2% |
| Activity Frames | 98.4% | 7.3% | 98.4% | 7.3% |
四个发现值得逐个说。
差距是量上的,不是类别上的。三种表示在"缺席事实"探测上全部满分——模型不会编造应用或网站,幻觉率全程为零。摘要死在数量级上:Sonnet 档摘要回答时间问题只有 7.1% 的准确率,把主导应用的活跃分钟数平均报错 135.7%。论文给的那个例子真的有点吓人:2026-07-05 这天,实测记录是 Chrome 第一(161.6 分钟)、Cursor 第二(143.9 分钟),而 Sonnet 写的摘要把 Cursor 说成主力应用、"约 7 小时"——把 144 分钟吹了 2.9 倍,还凭空造了一段"晚 6:40 到次日早 5:26"的通宵会话。流畅的散文把错误全藏住了。读编译块的 Agent 回答 160 分钟。
强模型缩小差距但抹不平,编译块直接抹平两个档位的差距。Opus 读摘要能到 80.4%,时长误差压到 25.2%,但仍是编译块 7.3% 的 3.5 倍。读编译块时两个模型不可区分(都是 98.4%),读原始行或摘要时前沿模型领先 9 到 14 个点。也就是说,编译块让便宜模型答得和贵模型一样好——确定性编译的收益恰好落在部署成本最低的地方。
摘要是不稳定的。每天重新生成三次摘要,两个档位每天产出三份不同文本;编译块三次重生成字节级一致。摘要的错甚至不稳定到没法校正。此外忙日的原始行序列化到 25.7 万 token,直接爆窗,两条 baseline 在那一天根本跑不了,只有约 2k token 的编译块 8 天全覆盖。
这里我要替审稿人挑一句:编译块 Agent 是带着现成的每应用时长去答题的,另外两条路线得自己算——作者自己点破了这一点,说"这正是编译器存在的意义"。公平性上可以接受,但定量题测的确实是"确定性算术是否已被做完",读题时心里要有这根弦。
一天到底有多碎?
43 天编译出 17,514 帧,活跃时长中位数 0.5 分钟,68% 的帧不足一分钟。

这个数字乍看惊人,作者很老实地做了分解:不足一分钟的帧里 52% 是单快照过境(6,177 帧,中位计酬只有 6.1 秒)——就是你去别处的路上扫过一眼的应用,忠实记录了但不是注意力片段。另有 20% 落在双显示器时段(每个屏各自记一条流,这是设计使然)。只看至少两个快照的帧,中位数升到 0.9 分钟,仍有 52% 不足一分钟——那部分是真切换。这和注意力中断研究的经典结论对得上:三分钟的"工作球"、75% 的笔记本内容片段不足一分钟。
作者还自曝了一段翻车史:早期草稿把所有显示器交错成一条流切分,双屏时段被撕碎,中位数被压到 0.3 分钟。严格切分在分离过境帧之前总会高估碎片化——这个教训是 schema 层面的:消费者拿到 min_minutes 下限(低于下限的帧被省略但会如实披露),单快照过境在文档里保持可见,编译器不靠启发式替你藏东西。
📊 意外收获:编译器当标尺,首次实测 R 和 h
论文后半段换了副面孔,我觉得这部分比系统本身更有意思。
所有 Agent 成本模型——FrugalGPT 的级联、Cost-of-Pass、HAL 排行榜的每次任务约 1.84 美元——都在用一个摊销公式,里面有两个参数人人都假设、没人测过:常规开销比 \(R\)(Agent 重新推导一个已做过的常规操作要多花多少倍)和常规复现率 \(h\)(用户真实工作里有多少步骤落在可委派的重复常规里)。现有工作全是从 Agent rollout 里读供给侧数据——只有 Agent 全价做完的任务才被观测到,幸存者偏差明摆着。这套编译器从被动的、委派前的人类活动里读数,是需求侧的第一把尺子。
\(R\) 的分子是建模的:一个无记忆、截图驱动的 Agent 逐步重推,每步花一张截图(按 Anthropic 的 \(wh/750\) 图像 token 规则)加 350 token 上下文读入加 180 token 推理输出:
典型 1512×982 截屏下每步约 2,500 token,截图占大头。分母是实测的,而且给了一把梯子而不是一个数:操作档用编译器实际产出的带守卫技能计划(每步带预期元素、角色、应用三重守卫,可安全失败),20 个高频常规中位 247.5 token、0.5 毫秒编译完成;天花板档剥掉守卫只留信息内容,中位 40 token。
| 档位 | 动作粒度 | URL 粒度 |
|---|---|---|
| 常规数 / 实例数 | 614 / 5,508 | 261 / 1,303 |
| \(R_{inject}\)(守卫计划,操作档) | 60 倍(IQR 59-62) | n/a |
| \(R_{info}\)(极简脚本,天花板) | 343 倍(IQR 297-390) | 198 倍 |
| 极简脚本中位 token / 中位步数 | 40 / 5 | 43 / 3 |
作者主动选择用保守的 60 倍打头、把 343 倍标为天花板,因为"拿天花板打头会招 cherry-picking 的质疑"。天花板对旋钮也稳:随常规长度单调缓升(\(k\) 为 3-4 步时 301 倍,9-15 步时 405 倍),换三档屏幕分辨率只在 259 到 425 倍之间移动。
命中守卫的步骤上,确定性本地回放把模型完全摘出环路,单步回收 \(1 - 1/R \approx 99\%\) 的重推导成本。但作者反复强调这不是全 fleet 节省——本地回放只覆盖能守卫的步骤(实测中位 0.415),剩余步骤照付全价。建模的三臂对比(Sonnet 牌价,从实测产物计价而非真实账单):无记忆 Agent 全 fleet 32.8 Mtok / 125.81 美元;注入编译计划省 83.3%;本地回放省 40.8%。
\(h\) 的测量更见功力。原始复现率 83.1%——敲一个字符、回字段、再敲,输入的微观结构天然重复。但这不含可复用的工作内容。加上"至少两个具名目标"的特异性约束后,可委派复现率掉到 9.0%(动作粒度,URL 粒度 13.1%)。作者把 83.1% → 9.0% 这个落差公开报出来而不是引用大数:这是"键盘在重复"和"工作在重复"的区别,只有后者能委派。
全文唯一的预测性声明是一个时间留出实验:用前 40 个活跃日拟合常规表(4,847 个签名),问最后 11 天里多少步骤落在已知常规里——样本外 7.7%,样本内 8.6%,漂移温和。全 fleet 的诚实天花板 \(h(1 - 1/R_{info})\) 约 7.7%。顺便,网页时代 40-58% 的页面重访率被明确排除在外——回退按钮噪声不是可委派任务,直接搬过来会把 \(h\) 高估一个数量级。
有一次真实回放的概念验证:一个两步常规(打开撰写界面、打草稿)被本地小模型匹配到自然语言请求后,在真实登录态浏览器里执行,执行环节零模型 token;同一份计划在错误页面上 grounding 不到任何元素、执行零动作——预期的安全失败。同页面上的在环 Agent 每步要读约 10.5k token 的无障碍快照。
🤔 我的判断
这篇论文最打动我的是一种"反潮流的克制"。整个领域都在往记忆环路里塞更大的模型,它回头把编译器这个最无聊的工具捡了起来——68 毫秒、零 token、字节级可复现。作者自己的话说得挺妙:这种枯燥正是重点,记忆变成了基础设施而不是推理。
批判性的点也得说透。R 的分子和三臂对比的美元数全是建模的,不是账单。作者唯一一次在环对比里,带着编译计划上下文的 Agent 对无障碍树驱动的 Agent 只省了约 14%——离 83.3% 的建模上限很远,大倍率只有模型完全出环才成立。单用户语料:R 和 h 是这一个人的工作属性,作者本人也承认 \(R_{inject}\) 背后的 20 个高频常规被两个家族(撰写消息循环和关窗循环)主导,泛化性未证。采集本身也不免费:9.5GB 数据库(每个活跃日约 0.19GB)、96% 的帧跑常驻端侧 OCR、dwell 把"人走开了但屏幕亮着"也计入——心跳终止的区间占了全部计酬活跃时间的 45%,连续心跳最长 42 分钟。所以全文所有"活跃分钟"其实是屏幕驻留,不是注意力。作者对此的诚实程度,说实话,比绝大多数论文都高。
工程启发很直接。如果你在做个人 Agent 或电脑使用 Agent:被动采集流别直接喂模型也别让模型总结,中间加一层确定性编译,压缩、可缓存、可审计三件事一次拿到;而且"测得与推断分层 + 证据指针"这套 schema 纪律,对任何要做长期记忆可信度的系统都值得抄。Skill 归纳类工作(AWM、SkillWeaver 那一路)全都只能从 Agent 自己的轨迹里学常规,这套东西给出了从人类活动里先验地发现可委派常规的通道——包括那些 Agent 目前根本做不了的、带登录态私有状态的任务。
还有个更大的问题悬着:7.7% 的样本外复现率是单用户单平台上的读数。如果多用户复现后 h 还在这个量级,那"回放优先"的 Agent 经济学就站得住;如果掉到一个点以下,这套东西的价值就主要剩记忆编译那一半了。等作者承诺的多用户复现和真实账单数据。
觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我