评测方法

Agent 记住待办还不够:前瞻记忆需要触发器、监控预算与执行门

PM-Bench 把长期记忆从“能否回忆过去”推进到“能否在正确未来状态执行意图”。本文复核其公开场景与 64 条轨迹,并给出适用于企业 Agent 的意图状态机、选择性监控架构、执行门和评测协议。

来源说明

本文基于 2026-07-17 的每日深度技术研究发布流程写成。今天的主材料不是一个新的向量检索算法,而是一个此前在 Agent memory 讨论中经常被忽略的问题:Agent 即使记得用户说过什么,也未必会在正确的未来时刻采取行动。

原始来源如下:

我还做了两项离线复核。第一,在仓库 commit e1093c470c8981daf522d4ef047a7c3a71e077d7 上执行 python3 sim/pm_bench.py validate --scenario data/synthetic_week_v9.json,得到 Scenario OK。第二,运行仓库的聚合报告脚本,成功从公开轨迹重建 8 models × 8 setups 的 64-run 报告,核心 Set-F1、TP/FP/FN 和 query 数字与论文表格一致。

复核也发现一个小的发布卫生问题:README 写的是 runs/March_ALL_results_v9/,实际目录是 runs/all_results_v9/。这不影响数据与评分器,但说明当前仓库只有两个 commit、没有 release tag;复现实验时应固定 commit,不应只跟随 main

事实边界:benchmark 规模、模型与配置、作者报告结果、公开轨迹和代码布局来自论文与仓库;本文提出的生产架构、数据模型、策略规则、上线门槛与 ROI 算法是我的工程建议,不是原作者报告的产品方案。

稳定 slug:2026-07-17-prospective-memory-trigger-monitoring-execution

先给结论

长期记忆系统通常回答一个回顾性问题:过去发生了什么,用户偏好是什么,哪段经验与当前任务相似。前瞻记忆回答的却是另一个问题:某个意图形成以后,系统能否在未来的时间、事件或外部状态满足时执行它,并在条件尚未满足、已取消或已被替代时保持克制。

这不是“加一张 TODO 表”就能解决的问题。生产级前瞻记忆至少需要四个可分离部件:

  1. 意图账本:保存待办内容、触发条件、作用域、依赖、版本和终止状态。
  2. 触发器编译器:把自然语言中的“下午四点”“收到回复后”“构建通过且审批完成”编译成可评估谓词。
  3. 选择性监控器:决定何时读取时钟、邮件、日历、CI、工单或业务状态,而不是固定频率轮询一切。
  4. 执行门:在真正调用工具前检查最新版本、条件证据、权限、幂等键和人工审批要求。

PM-Bench 最重要的结果不是“最佳方法只有 65.1% macro Set-F1”,而是它揭示了一个控制问题:多监控、多提醒、多 Agent 并不自动等于更可靠。作者报告的三 Agent hierarchical union-query 配置总共发出 1661 次 state query,远多于单 Agent 配置,却只有 45.2% macro Set-F1;自动 30 分钟 heartbeat 虽把 non-clock monitoring-required hit 提到 15.8%,同时产生 489 个 false positives,整体 macro Set-F1 只有 57.8%。

我的工程判断是:前瞻记忆应该被实现为一个事件驱动、版本化、可撤销的控制平面,而不是更多 prompt、更多轮询或更长上下文。它的主要指标也不应是 retrieval recall,而应同时衡量按时执行、误触发、旧意图执行、监控成本和人工干预。

技术问题:回忆正确,为什么仍然做错

考虑四个看似简单的要求:

  • “今天 16:00 提醒我提交周报。”
  • “客户回复合同条款后,生成差异摘要。”
  • “CI 通过且安全审批完成后,准备发布说明,但不要部署。”
  • “如果采购额度恢复到阈值以上,再创建订单;我说取消就停止。”

普通 RAG 或对话记忆可以在未来检索到这些句子,但系统仍可能失败:

失败位置表现普通检索为什么不够
意图形成把讨论或假设误写成待执行任务相似度不能证明用户授权
条件保持长任务中丢失待办或只保留动作、丢掉触发条件检索到动作不等于恢复完整意图
环境监控没有查看邮件、CI 或余额,永远不知道条件已满足线索不在当前上下文中
更新合并仍按旧时间或旧条件执行已改期任务新旧记忆都“相关”
动作抑制为避免遗漏而每一步都执行候选动作高 recall 可以靠 spam 获得
完成终止已完成或取消后再次执行检索系统通常缺少消费语义

因此,前瞻记忆包含两个不同的记忆负担。回顾性部分要保留“做什么”;前瞻性部分要在未来识别“现在是不是该做”。后者还必须与注意力分配、环境观测、权限控制和工具副作用结合。

这也是 PM-Bench 与多数 multi-session memory benchmark 的差异。它不只问 Agent 能否回答过去信息,而是在连续的七天、80 个 step 中,让 Agent 继续一个 ongoing activity,同时判断延迟意图是否到期。一个动作在错误 step 执行,即使动作内容完全正确,也应被记为 false alarm 或 update violation。

机制拆解一:PM-Bench 实际隔离了什么

1. 用 query-then-act 分开“看见条件”和“决定执行”

每个 step 中,Agent 先看到叙事场景、三个必须选择的 ongoing activity,以及混有诱饵的匿名动作 handle。它可以先查询 clockemailcalendarshipment_statusappointment_portal 等 11 个隐藏状态通道,再提交最终动作集合。

这个接口把一次前瞻执行拆成三个可观察决策:

flowchart LR
  A["maintain intention<br/>做什么 + 何时做"] --> B{"monitor now?"}
  B -->|yes| C["query state channel<br/>clock / email / CI / status"]
  B -->|no| D["visible cue only"]
  C --> E{"due set satisfied?"}
  D --> E
  E -->|yes| F["execute selected action"]
  E -->|no| G["withhold and continue"]
  F --> H["mark completed / audit"]
  G --> A

如果 Agent 没查必要通道,这是 monitoring failure;查到了证据却没行动,是 decision failure;没有证据就行动,是 control failure。普通端到端成功率无法把这三类问题分开。

2. 用更新、跨日和诱饵测试意图控制

公开 v9 场景包含 83 个 task definition,其中 81 个可评分动作;57 个 event-based、26 个 time-based、15 个 channel-triggered、7 个 cross-day task,并注入 11 次 cancel、override 或 reschedule update,以及 74 个 lure。

这些设计分别测试:

  • 时间触发:是否在目标时间或允许窗口行动;
  • 事件触发:可见事件出现时是否恢复意图;
  • 隐藏状态触发:是否主动查询正确通道;
  • 跨日保持:是否跨越多轮干扰仍保留承诺;
  • 更新敏感:是否让新版本取代旧版本;
  • 抑制能力:是否拒绝尚未到期、已经取消或只是诱饵的动作。

仓库的场景验证器会检查 task ID、触发线索是否存在、时间是否可达、更新是否指向有效任务,以及同日更新不能把任务静默移到已过去时间。这个做法值得生产评测借鉴:先证明测试环境可解,再把失败归因给 Agent;否则 benchmark 自己的脏数据会被误判为模型遗忘。

3. Set-F1 在这里是控制指标,不只是分类指标

PM-Bench 将每一步的 ground-truth due set 与 Agent 选中的 action set 比较,跨完整轨迹累积 TP、FP、FN 并计算 Set-F1。这个选择很关键:

  • 只看 precision,最安全的策略是什么都不做;
  • 只看 recall,最投机的策略是每一步把所有动作都执行一遍;
  • Set-F1 同时惩罚漏做和乱做。

评分器还区分 on-time hit、late execution、miss、false alarm、wrong-content、update violation、dependency violation、exact-set-match 和 query count。对有副作用的企业 Agent,这些诊断指标往往比一个总分更有价值。

机制拆解二:为什么 heartbeat 和多 Agent 会失效

论文比较了单 Agent baseline、最多保留五条的 TODO ledger、可选 heartbeat、固定 30/60 分钟 heartbeat,以及由 event/status/update 三个 watcher 加 coordinator 组成的 hierarchical multi-agent。

聚合结果如下:

配置Macro Set-F1PrecisionFalse positivesState queries工程含义
Single baseline60.0%66.7%199106基线仍会漏做与误做
TODO ledger62.8%73.2%134118显式账本更克制,但跨日 hit 反而较低
Optional heartbeat65.1%70.6%178130总体最佳,但不是所有模型最佳
Auto heartbeat 60m56.6%62.0%422172固定提醒引入大量噪声
Auto heartbeat 30m57.8%63.2%489203监控更强,误触发也更多
Hierarchical union-query45.2%51.2%2731661获取更多证据不等于做出正确动作

这里有三个不能从“模型更聪明”中直接推导出的工程结论。

第一,heartbeat 只是重新分配注意力,不提供真相。固定频率提醒会让模型更频繁地想起“可能有事”,却不会自动判断该查哪个通道、何时停止检查、哪条证据足以执行。提醒过密时,模型可能把“被提醒检查”误解成“现在应该行动”。

第二,多 Agent 增加的是候选信号,不是最终控制。三个 watcher 的 union-query 能扩大观察面,但 coordinator 仍要完成去重、冲突解析、版本检查和动作抑制。如果聚合规则只做多数票或并集,多个弱判断会把 false positive 放大。

第三,scaffold 与 backbone 强耦合。作者报告 GPT-5.4 在 optional heartbeat 下最好,GPT-5.3-Codex 和 Mistral Large 在单 Agent baseline 下最好,Llama 3.3 70B 与 Mistral Small 在 ledger 下最好,Qwen3-32B 则在固定 30 分钟 heartbeat 下最好。不能把某个 prompt scaffold 在单一模型上的收益写成通用架构规律。

工程判断:把前瞻记忆做成五段控制平面

我会把生产系统拆成下面五个模块,而不是让一个 LLM 同时负责理解意图、记住条件、轮询环境、决定执行和承担副作用。

flowchart TD
  U["user / workflow event"] --> I["intent compiler<br/>action + trigger + authority"]
  I --> L["versioned intent ledger"]
  L --> S["monitor scheduler<br/>next_check_at + event subscription"]
  S --> O["state observers<br/>calendar / CI / inbox / business API"]
  O --> G["execution gate<br/>freshness + version + policy + idempotency"]
  G -->|low risk| X["tool executor"]
  G -->|review required| H["human approval"]
  H --> X
  X --> A["receipt + state transition + audit"]
  A --> L
  O --> S

1. Intent compiler:把语言编译成条件,不直接执行

编译器输出必须区分动作、触发器和权限。例如“测试通过后整理发布说明”不代表“测试通过后部署”。LLM 可以抽取候选结构,但高风险动作需要规则或人工确认。

intent_id: int_01K2...
subject: release_notes
action:
  tool: docs.create_draft
  args_ref: artifact://release/context-v4
trigger:
  all:
    - event: ci.completed
      where: { branch: main, conclusion: success }
    - state: security_review.status
      equals: approved
authority:
  actor: user_184
  scope: repo_77
  max_effect: draft_only
review: none

2. Versioned ledger:待办是状态机,不是便签

前瞻意图至少需要以下状态:

stateDiagram-v2
  [*] --> Draft
  Draft --> Armed: confirm intent
  Armed --> Due: trigger satisfied
  Armed --> Superseded: reschedule / override
  Armed --> Canceled: cancel
  Due --> AwaitingApproval: high-risk action
  Due --> Executing: low-risk action
  AwaitingApproval --> Executing: approve
  AwaitingApproval --> Canceled: reject / expire
  Executing --> Completed: receipt committed
  Executing --> Retryable: transient failure
  Retryable --> Executing: retry with same idempotency key
  Superseded --> Armed: new version
  Completed --> [*]
  Canceled --> [*]

更新不应该原地覆盖。rescheduleoverridecancel 都生成新事件,旧版本保留审计但失去可执行性。执行门只接受 current_version,从数据结构上阻止 stale intention 被再次唤醒。

建议的最小记录如下:

type ProspectiveIntent = {
  id: string;
  version: number;
  state: "draft" | "armed" | "due" | "awaiting_approval" |
    "executing" | "completed" | "canceled" | "superseded";
  action: { tool: string; argsRef: string; effect: "read" | "draft" | "write" | "external" };
  trigger: TriggerExpression;
  dependencies: string[];
  scope: { tenantId: string; projectId?: string; actorId: string };
  authorityRef: string;
  nextCheckAt?: string;
  expiresAt?: string;
  idempotencyKey: string;
  sourceRefs: string[];
  lastEvidenceRefs: string[];
};

3. Monitor scheduler:优先订阅事件,轮询要有预算

固定 heartbeat 可以作为兜底,但不应成为主要机制。我会按以下优先级选择观测方式:

  1. 有可靠 webhook/event stream:订阅事件,并在事件到达时只评估相关 intent;
  2. 有明确时间条件:调度到 next_check_at,而不是每 30 分钟问模型;
  3. 只有可查询状态:根据 deadline、状态变化概率、查询成本和动作风险计算动态轮询间隔;
  4. 通道不可用:降级为人工待办,不允许模型猜测状态已满足。

一个简单的初始策略可以完全不使用模型:

if event_subscription_available(trigger):
    subscribe(trigger.channel, intent.id)
elif trigger.has_exact_time:
    schedule(trigger.time - safety_margin)
else:
    interval = clamp(
        base_interval * query_cost / max(change_probability, 0.05),
        min_interval_by_risk,
        time_to_deadline / 3
    )

LLM 可以建议该查哪个通道,但 scheduler 应用 allowlist、租户隔离、速率上限和预算。这样,monitoring cost 是可治理的系统资源,而不是 prompt 中一句“主动一点”。

4. Execution gate:触发命中不等于获得授权

执行前必须重读最新 intent 和最新证据,并检查:

  • 当前版本仍是 active,未取消、未替代、未过期;
  • 所有依赖都已完成,证据在 freshness window 内;
  • tool 与参数在原始 authority scope 内;
  • 外部写入、付款、部署、删除等动作是否需要人工审批;
  • idempotency_key 是否已成功消费;
  • 动作预览与用户确认的 effect 是否一致。

这一步应该尽量确定性。LLM 可以生成草稿、摘要或参数候选,但不能自行扩大 draft_onlypublish,也不能把“准备部署说明”解释成“执行部署”。

5. Receipt:完成是一次可证明的状态转换

工具返回成功不代表业务动作真正完成。系统应保存 receipt:工具调用 ID、输入 hash、外部对象 ID、响应状态、执行时间、intent version 和证据引用。只有 receipt 通过业务验证后,intent 才从 executing 进入 completed

失败重试必须复用相同 idempotency key;不确定是否成功时进入 needs_reconciliation,而不是再次调用。前瞻记忆最危险的错误往往不是忘记提醒,而是重复付款、重复发信、重复建单或在取消后继续执行。

我会如何实现和验证

我不会先建设一个通用“主动 Agent 平台”,而会选一个低风险、可回放的场景,例如“CI 成功且 review 批准后生成发布说明草稿”。一周内完成以下实验。

第 1—2 天:建立事件账本和 oracle replay

目录可以保持很小:

prospective-memory/
  schemas/intent.schema.json
  policies/execution-gates.yaml
  fixtures/release-workflow-events.jsonl
  src/compile-intent.ts
  src/reduce-intent.ts
  src/schedule-monitor.ts
  src/evaluate-trigger.ts
  src/execute-gated.ts
  tests/replay.test.ts

先人工制作 30 条事件轨迹,覆盖准时触发、无关事件、改期、取消、审批撤回、重复 webhook、通道超时和执行响应丢失。用确定性 reducer 计算每一步的 oracle due set,确保环境本身可解。

第 3—4 天:比较三种策略

  • Baseline:把全部历史与当前状态交给单 Agent;
  • Ledger:结构化 intent ledger + 模型判断 due set;
  • Controlled:版本化 ledger + 事件订阅/动态调度 + 确定性执行门。

所有策略使用相同模型、工具 stub 和事件轨迹。每个轨迹至少重复三次,记录动作集合、state query、token、延迟、人工复核与最终 receipt。

第 5 天:故障注入

注入以下故障:事件乱序、重复投递、旧版本延迟到达、一个 observer 超时、模型输出无效 JSON、人工审批过期、工具成功但响应丢失。验证系统能进入可解释的 fallback 状态,而不是静默漏做或重复执行。

第 6—7 天:shadow mode 与上线门

在真实 CI/review 流上只生成“本来会执行什么”的 decision record,不调用写工具。人工审阅一周 shadow decisions,通过门槛后才开放 draft_only 权限;发布和部署仍保留人工动作。

上线顺序应是:提醒 → 生成草稿 → 内部写入 → 可撤销外部动作 → 高影响动作。每一级都重新设定误触发上限,不因前一级成功就自动获得更高权限。

可验证指标

建议至少同时维护质量、控制、成本三组指标:

指标定义为什么要测
On-time execution rate在允许窗口内完成的 due intent / 全部 due intent核心召回能力
Action Set-F1跨 step 累积 TP/FP/FN同时惩罚漏做和乱做
False activation rate未到期、已取消或错误作用域动作 / 全部执行尝试有副作用场景的关键安全指标
Update violation rate执行旧版本 intent 的次数 / 有更新 intent验证版本语义
Duplicate effect rate同一 intent 产生多次外部副作用的比例验证幂等与 reconciliation
Dependency violation rate前置条件未满足却执行的比例验证 workflow 正确性
Monitoring recall需要主动观测的线索被及时发现的比例区分没看见与看见没做
Queries per successful intentstate query / 按时完成数衡量监控效率
Irrelevant query rate与 active trigger 无关的查询比例发现 heartbeat 噪声
Decision latency p95条件满足到动作决策的延迟验证时效性
Human review precision送审事件中确实需要人判断的比例避免审批疲劳
Cost per accepted effect模型、查询、工具与人工成本 / 有效结果与业务 ROI 对齐

对写操作,我会把 false activation rateduplicate effect rate 设成 release blocker,而不是只看综合 F1。一个提醒 Agent 可以容忍少量误报;付款、部署、安全处置或客户外发 Agent 不可以用更高 recall 换取同样的误触发。

适用场景

前瞻记忆适合有明确未来条件、持续状态和可验证完成回执的任务:

  • 研发:CI/review/依赖发布满足后生成变更材料,失败后回到负责人;
  • 安全:扫描任务完成后聚合证据,超过风险门槛时创建人工复核项;
  • 运营:活动状态、库存或审批变化后生成草稿与检查清单;
  • 研究:数据或实验任务结束后触发分析,但结论发布前必须人工审核;
  • 团队知识库:决策到期、政策替代或文档 owner 变化时发起复核,而不是自动改写权威内容。

它不适合把含糊愿望自动升级成行动。例如“以后多关注这个方向”“有机会提醒我”“帮我留意市场”缺少可执行边界。系统应该先澄清触发条件、频率、停止条件和允许动作,或者只保存为低优先级观察项。

失败模式与回滚

失败模式

  1. 把相关性当触发条件:检索到相似内容就执行,没有证明当前事件满足谓词。
  2. 固定 heartbeat 造成注意力污染:提醒越密,模型越倾向于过度行动,查询成本也持续增长。
  3. 旧版本复活:改期或取消只修改一份摘要,向量索引、缓存或子 Agent 仍持有旧意图。
  4. 多 Agent 信号放大:多个 watcher 共享同一偏差,投票把相关候选误当成到期动作。
  5. 完成状态不可靠:工具响应丢失后重试,产生重复副作用。
  6. 授权漂移:用户允许“准备草稿”,Agent 在触发后直接发布或部署。
  7. 监控通道泄漏:为了主动性扩大邮箱、日历、代码库或业务数据访问范围。
  8. 审批疲劳:低质量触发持续送审,人类开始机械批准。

回滚方案

  • 关闭 executor,只保留 shadow decision 和提醒;
  • 冻结新 intent 写入,但继续允许 cancel 与人工完成;
  • 按 policy version 回放最近事件,找出从哪个规则版本开始出现误触发;
  • 将所有 executing 且无可信 receipt 的记录转入 reconciliation queue;
  • 撤销尚可撤销的外部动作,并保留原始审计事件;
  • 对已取消/替代 intent 重建派生索引和缓存,验证旧版本不可再召回为 active;
  • 恢复时先开放 read/draft effect,再逐级开放写权限。

与站内已有文章的差异

站内已经讨论过 memory benchmark hygiene、memory lifecycle evaluation、adaptive retrieval、memory control plane 和 Agent policy-as-code。本文不再回答“怎样把过去的信息检索得更准”,也不重复“记忆需要版本、来源和删除”。

本文新增的轴是 prospective execution:把一条未来意图从形成、维持、观测、触发、抑制、更新到一次性消费串成完整状态机,并用误触发与监控预算评价主动行为。它补上了长期记忆从“回答依据”进入“未来动作依据”后的控制缺口。

局限分析

PM-Bench 是有价值的诊断工具,但不能直接代表生产可靠性。

第一,当前公开 benchmark 只有一个确定性 synthetic week。81 个可评分任务与 80 个 step 足以暴露机制问题,却不足以估计模型跨领域、跨语言和长时间运行的稳定性。仓库提供 seeded generation,但论文主结果仍来自同一个 v9 week。

第二,实验每个 model × setup 只有一条主轨迹。64 runs 指八个模型与八种配置的笛卡尔积,不是每个条件 64 次随机重复。因此,表中差异可能同时受到单次采样与模型服务版本影响,不应从 2—3 个百分点得出强排序结论。

第三,匿名 action handle、结构化 JSON 和离散 step 让评分可重复,但比真实企业环境干净。现实系统有乱序事件、权限变化、重复 webhook、不确定完成状态、跨系统时钟、人工延迟和不可逆副作用。

第四,paper 中的 hierarchical majority/unanimous 是对同一 union-query 轨迹的 replay ablation,不是两次独立的多 Agent 运行。它适合隔离聚合规则,不适合计算完整在线成本差异。

第五,论文列出的 best overall method 是跨八模型聚合后的 optional-heartbeat setup;摘要中“a GPT-5.4 agent reaches only 65.1% F1”容易被误读。细表显示 GPT-5.4 + optional heartbeat 的单次 Set-F1 是 79.1%,65.1% 是该 setup 的 macro aggregate。本文采用表格口径,并把这一表述差异列为阅读边界。

第六,我只运行了场景验证和公开轨迹报告重建,没有消耗外部模型 API 复跑 64 条推理轨迹。当前复核能证明代码、数据和聚合数字相互一致,不能独立证明上游模型响应可再次完全复现。

自审

  • 事实可靠性:提交日期、场景规模、八模型八配置、实验数字和错误分类来自论文;代码布局、轨迹数量与命令来自官方仓库;场景验证和报告重建已在固定 commit 上实际执行。
  • 来源完整性:包含论文、HTML 全文、官方代码与数据、原始认知科学范式和多过程理论来源。
  • 非复述检查:文章主线是生产前瞻记忆的 trigger/monitor/gate/receipt 控制平面,不是翻译论文摘要或 README。
  • 标题党检查:标题只表达“记住待办不足以可靠执行”这一由 benchmark 直接支持的边界,没有宣称解决前瞻记忆。
  • 薄内容检查:包含机制图、状态机、数据模型、配置示例、伪代码、工程方案、一周实验、指标、失败与回滚。
  • 事实与建议分离:作者报告结果使用“论文/作者报告”;架构阈值和上线策略明确标为我的工程建议。
  • 站内重复检查:既有文章侧重回顾性检索、生命周期、控制面或安全边界;本文聚焦未来意图的正确时机执行与动作抑制。
  • 安全边界:只讨论授权工作流、权限最小化、人工审核和可回滚执行,不包含针对第三方目标的攻击流程。
  • 可执行价值:给出最小目录、intent schema、状态机、监控策略、执行门、shadow rollout 和 release-blocking 指标。

最终判断:材料足以支撑原创支柱文章。最值得保留的结论不是某个模型或 scaffold 的排名,而是前瞻记忆必须同时优化“记得做”和“不要乱做”,并把主动监控视为有成本、有权限、有停止条件的系统行为。