论文解读

PRO-LONG 给长期 Agent 的启示:别先摘要历史,先把轨迹变成可编程证据

解读 PRO-LONG 的 programmatic memory:对每次观察、动作和结果做结构化追加,再让 coding agent 用 grep/Python 按需查询。本文拆解它为何在 ARC-AGI-3 上有效、哪些结论不能直接外推,并给出面向研究与研发 Agent 的日志协议、查询预算、验证闭环和一周实验方案。

来源说明

本文讨论长程、授权任务中的记忆与上下文工程。它不主张把所有用户数据、生产日志或完整聊天记录永久保存,更不把研究基准上的结果包装成真实业务系统的生产承诺。

核心来源如下:

  • Alexis Fox 等:PRO-LONG: Programmatic Memory Enables Long-Horizon Reasoning,arXiv:2607.20064v1,2026-07-22。论文提出 programmatic memory:harness 将每一步 observation、action、outcome 追加到结构化日志,Agent 以代码和文本工具搜索日志。作者在 ARC-AGI-3 的 25 个公开游戏上报告,PRO-LONG 相对同一 coding agent 的 no-log baseline 平均提高 18.0 个百分点;在匹配设置下,相对若干专用 harness 使用 4.2 到 5.8 倍更少的 billed tokens。本文把这些明确标为作者报告结果。
  • 论文正文的 方法与消融。我核对了 write/read 定义、每条日志的 action number/level/attempt/score/plan/action/result、完整日志与最近 25 步/无日志条件、工具阶梯消融、workspace persistence 消融、评分与比较限制。论文作者还说明不同模型/游戏运行方差明显,部分外部 baseline 的选择过程或重复 run 不完整。
  • 开源实现:alexisfox7/PRO-LONG。README 说明默认 full log、--log-window 25、无 log 和 stateless workspace 四种条件;实现中 analyzer 在 sandbox Docker container 内通过 read/grep/Python 读日志,输出 JSON action plan,再由 action queue 按步执行。仓库还提供 scorecards 与部分 Fable 5 脱敏 logs,剩余 cohort logs 表示将分批发布。
  • 本站既有文章:定时 Agent 的记忆不是历史聊天。那篇文章讨论跨运行任务状态、checkpoint 和发布副作用;本文讨论一条长程探索轨迹的内部记忆。前者回答“任务是否已发布、能否安全重试”,本文回答“在数百步探索中,模型该怎样保留和查询已经发生的证据”。

事实边界:论文的 benchmark、分数、token/cost、基线和 ablation 均为作者报告,尚未经过我的独立复现;开源仓库中的命令、目录、日志可用性与架构描述来自其 README。本文的企业/研发迁移方案、schema、权限边界、查询预算、SOP 和指标是我的工程推断。ARC-AGI-3 是未知规则的游戏环境,不等同于代码库、研究资料或生产事故环境。

稳定 slug:2026-07-26-pro-long-programmatic-memory-agent

先给结论

长程 Agent 的记忆问题,通常被错误地简化成“该不该把历史摘要进 prompt”。PRO-LONG 给出的更有力选择是:先把历史保存在 prompt 之外的完整、结构化证据日志中;需要时再让 Agent 用程序去问具体问题。

它的核心不是新向量库,也不是更复杂的多 Agent 编排,而是两条极朴素的规则:

  1. 写入时少做判断:每个 observation、action 和 outcome 都以可解析的形式 append;不在写入时凭模型猜测“这条以后有没有用”。
  2. 读取时做计算:用 grep、正则、Python 或小脚本围绕当前假设搜索、分组、回放、统计,而不是把整条历史重新塞入上下文窗口。

论文在 ARC-AGI-3 上报告了强结果,但真正可迁移的不是“全量日志一定胜过所有摘要”。更稳的判断是:当任务满足过去细节会在很久以后决定当前行动、过程状态可被结构化、Agent 已有可靠 coding tools、并且能控制日志权限和查询成本时,programmatic memory 值得成为默认基线。反过来,含高敏感数据、无法结构化、强实时或只需短上下文的任务,完整日志可能带来隐私、存储和检索噪声,而不是收益。

flowchart LR
  A["Environment observation"] --> W["Append-only event log"]
  B["Agent action"] --> W
  C["Outcome / score / error"] --> W
  W --> D["Current hypothesis"]
  D --> Q["Programmatic query\ngrep / SQL / Python"]
  Q --> E["Small evidence slice\nwith source event IDs"]
  E --> F["Analyzer agent"]
  F --> G["Bounded action plan"]
  G --> H["Deterministic executor"]
  H --> A

一句话:不要把“记住”实现为反复讲述过去;把过去变成可检索、可回放、可反驳的证据,再让模型在需要时做有限推理。

技术问题:完整保存与可用检索为何长期冲突

长程探索任务会不断产生状态、试验、失败路径和局部规律。只保存最近状态有两个明显缺口:早期的反例被遗忘,且当前状态往往不能解释环境规则。把全部历史放进 prompt 则带来另一端的问题:token 成本上升、注意力被稀释、工具输出堆积,模型越来越难定位一个数百步之前的关键转折。

常见方案各自解决一部分问题:

方案写入策略读取策略主要风险
滑动窗口保留最近 N 步直接放 prompt远期因果和反例消失
自由摘要/反思模型挑选“重要”信息摘要进入 prompt写入时丢失细节,错误摘要会自我强化
向量检索chunk + embedding语义近邻相似文本未必对应同一状态、同一时间或可执行反例
显式世界模型写入结构化假设用模拟器/规划器建模成本高,错误模型可能成为新的单点事实
programmatic memoryappend 全量结构化事件代码、正则、聚合、回放日志膨胀、查询能力不足、敏感数据保留

PRO-LONG 的新意不在于否定摘要、向量或世界模型,而在于将完整原始轨迹当前可访问上下文彻底分开。论文区分 accessed state(当前模型调用窗口)与 accessible state(只能经工具读取的外部状态)。这使 Agent 无需在每一步决定什么必须记住;它可以在新的假设出现后,回到日志检索当时的证据。

这对隐藏规则、长反馈回路和反复试验尤其重要。一个早期操作带来的 score change、异常文本或状态转移,可能在 200 步后才被理解为环境机制。若写入阶段已把它压缩成“尝试失败”,后续推理无法恢复细节;若其保留为结构化记录,Agent 可以重放同类动作、统计差异并写一个可执行模型验证猜想。

PRO-LONG 的机制拆解

1. Append-all write:日志是地面事实,不是心得体会

论文的写路径把每一步 append 到 logs.txt,每条包含 action number、level、attempt、score、Agent 的简短计划、选定 action 和 resulting board。这里“完整”有边界:并不是把整个模型内部推理永久保存,而是保存 Agent 与环境交互的可观察事实和行动记录。

可以抽象为如下事件协议:

{
  "event_id": "run-42:step-187",
  "at": "2026-07-26T09:15:03Z",
  "episode": { "level": 4, "attempt": 2, "step": 187 },
  "observation": {
    "kind": "board",
    "digest": "sha256:...",
    "payload_ref": "artifacts/run-42/boards/0187.txt"
  },
  "action": { "kind": "move", "arguments": { "direction": "left" } },
  "outcome": { "score_delta": 10, "terminal": false, "error": null },
  "plan_summary": "test whether the blue switch persists after rewind",
  "provenance": { "agent_version": "v1", "environment_version": "pinned" }
}

我认为可迁移时应补上 digest、artifact reference、environment version 和 schema version。PRO-LONG 的游戏板可以直接放入日志;真实研发系统的长日志、截图、二进制或敏感载荷则应放到受控 artifact store,主日志只保存哈希、类型、可访问引用和最小可检索字段。否则“lossless”很快会变成“无权限边界的大型泄露面”。

2. Programmatic read:让工具做筛选,让模型做解释

PRO-LONG 的 Agent 用 read、grep 和 Python 读取完整日志。论文展示一个实例:Agent 写 regress.py 重放所有 action,以检查自己编码的游戏模型是否预测了已记录的 board states。仓库实现进一步把 analyzer 与 executor 拆开:analyzer 输出 JSON action plan,action queue 每次只 drain 一个 action;队列清空或 score 改变时才重新调用 analyzer。

这可以理解为一条查询管线:

flowchart TB
  H["Current state + hypothesis"] --> P["Query planner"]
  P --> I["Index-free narrowing\nstep range, outcome field, event type"]
  I --> S["Programmatic analysis\ngrep / SQL / Python replay"]
  S --> R["Evidence packet\nrows, aggregates, counterexamples"]
  R --> M["Model explanation / next plan"]
  M --> V["Validator"]
  V --> X["Execute one bounded action"]

关键约束是:模型不应把完整日志读回 prompt 后才开始思考。它先产生一个查询问题,例如“所有 score 增加发生在哪些 action 后?”“尝试 2 与尝试 3 在开关状态上有什么差别?”“我的 transition function 是否能解释事件 80-120?”然后让确定性工具返回小证据包。模型负责提出假设、解释证据和计划下一个受限动作;工具负责筛选、计数、回放和比较。

3. 动作队列:把长计划与环境反馈拆开

长程 Agent 很容易在每一个微动作都重新调用模型,既昂贵又容易失去局部计划。PRO-LONG 的 action queue 把 analyzer 的 JSON plan 一步步执行,在队列耗尽或 score 变化时再重新分析。这不是让模型无限信任旧计划,而是把可预测的局部执行需要重新解释的状态变化分开。

对于非游戏任务,可以迁移为:

  • 数据清理 Agent:先生成最多 20 条无副作用的检查列表,遇到 schema 变化、质量阈值触发或写入请求时重新推理。
  • 代码调查 Agent:先执行已批准的只读 rg/AST 查询队列,发现跨模块证据冲突时再请求模型重新规划。
  • 研究 Agent:先抓取已列出的原始来源和元数据,遇到来源版本变化、引用冲突或内容不足时中断撰写,回到 assessment。

任何会修改生产数据、发布内容、关闭 issue 或执行外部请求的动作,都不能仅凭旧队列自动执行;它必须触发新的验证门和权限检查。

论文结果:该相信什么,不该外推什么

论文的定量结果很有价值,但需要按证据强度读取:

作者报告我能得出的工程信号不能直接得出的结论
PRO-LONG 相对 no-log baseline 平均 +18.0pp结构化完整轨迹在该类任务中有显著价值所有业务 Agent 都会提升 18pp
与特定专用 harness 相比 4.2-5.8x 更少 billed tokens简化的 append+code-search 可能降低“维护上下文”的推理成本programmatic memory 天然比所有 RAG/图谱系统便宜
grep/regex/Python 工具阶梯从 23.1 到 41.2更强的程序化分析与日志价值相关仅给 Agent Python 就能解决长期记忆
full log 优于最近 25 步/无 log,差距随 best@k 变大长期证据保留对高方差探索可能扩大可解任务集合任何任务都不应摘要或删除
清空 workspace 对 PRO-LONG 影响小于 no-log外部事件日志可减少对自写 notes 的依赖workspace、notes、结构化模型从此无用

论文自己也给出重要边界。它在固定的 ARC-AGI-3 公开游戏集上评估,游戏规则未知但状态表示和 action space 受控;所有重复 run 是独立的,任务之间不传递信息;不同模型/游戏方差显著;若干外部 baseline 的选择与重复数据不完全公开。仓库公开了 scorecards 和部分脱敏 logs,但并非全部 cohort logs 已完全发布。因此最佳姿势是:把 PRO-LONG 当作一个很强的可复现设计假设,而不是一个已经跨领域证实的通用定理。

从游戏迁移到真实 Agent:需要加上的四个控制层

完整事件日志在研究游戏里很干净,在生产任务里却会遇到权限、隐私、跨系统一致性和成本问题。我的建议是在 PRO-LONG 的 write/read 核心外加四层控制:

控制层解决的问题最小实现
事件 schema 与 provenance日志文本无法比较、来源不清event ID、actor、input digest、schema/version、artifact ref
分区与访问控制将客户数据或密钥跨任务检索tenant/task partition、field-level redaction、短期 signed ref
查询预算与 evidence contractAgent 漫游全量日志、重新塞爆上下文每轮文件数/行数/执行时间上限;每个结论必须回链 event IDs
写入与外部副作用 gate旧日志驱动错误发布/修改append 可广,effect 需审批、幂等键、当前状态验证

事件 schema 不是可选装饰

文本 log 可用 grep,但没有稳定字段的日志会很快退化。每条记录至少需支持按时间、episode/task、事件类型、实体、输入版本、结果和权限域过滤。即使底层保留 JSONL,也可以在运行时派生 SQLite/DuckDB 表或小型索引,供 Agent 用 SQL 和 Python 做聚合。不要在第一版同时建立全套知识图谱;先让“某结论来自哪些 event”和“某 event 属于哪个 task”可回答。

SELECT action.kind, COUNT(*) AS n, AVG(outcome.score_delta) AS mean_delta
FROM events
WHERE run_id = :run
  AND outcome.score_delta IS NOT NULL
  AND event_time >= :window_start
GROUP BY action.kind
ORDER BY mean_delta DESC;

上面的查询比“回忆一下什么动作最有效”更值得交给 Agent。查询结果回到 prompt 时应保留 query、snapshot ID 和返回行的 event IDs;否则下一步写出的解释无法被 reviewer 或后续 Agent 复核。

全量保留不等于全量可读

对研究轨迹可以保留原始 evidence;对真实系统,应采用“可验证引用 + 最小可见载荷”。例如安全扫描日志可存 hash、规则 ID、代码位置和受保护 artifact;客户工单可存去标识化类别和 tenant-scoped reference;发布工作流可存 commit/deployment URL 和浏览器验证摘要。Agent 的 tool 接口默认只返回允许范围的片段,并记录每一次检索。

这也是对 memory injection 的防御:过往日志、外部网页或用户内容都应被视为证据,不应被当成新的系统指令。固定策略、允许工具、写权限和数据范围来自受保护配置;日志文本无权要求 Agent 上传文件、跳过验证或扩大网络访问。

一个可落地的实现方案:研究与研发双用途的 TraceStore

下面不是复刻 PRO-LONG,而是把它的可迁移最小核心用于团队的长程 Agent:

trace-store/
  schemas/
    event.schema.json
    evidence-packet.schema.json
  runs/
    <run-id>/events.jsonl
    <run-id>/artifacts/
    <run-id>/index.sqlite
  policies/
    access.yml
    query-budget.yml
    retention.yml
  tools/
    trace_query.py
    trace_replay.py
    trace_diff.py
  reports/
    <run-id>/evidence-packets/

组件与数据流

组件输入输出权限
Event writerobservation、action、outcomeappend-only events.jsonl、artifact digest只能 append,不改历史
Indexer已验证 eventsSQLite/Parquet 可查询投影无外网、无外部写入
Query planner Agent当前问题、schema、摘要索引有预算的查询计划不直接读原始敏感 artifact
Trace tools计划、scoped storeevidence packet、聚合/反例只读、记录 query audit
Reasoner Agent当前状态、evidence packet下一步假设或 bounded plan不拥有部署/生产写权限
Effect executor已批准 plan、当前状态验证外部动作和结果 event仅动作级 capability
Human reviewerpacket、action diff、审计轨迹采纳/拒绝/升级原因码高影响动作最终裁决

Evidence packet 合同

每次 programmatic retrieval 后,系统应限制模型看到的不是自由文本堆,而是一份结构化证据包:

{
  "question": "哪个配置变化最可能解释延迟突增?",
  "snapshot": "run-8@event-391",
  "queries": [
    { "tool": "sql", "digest": "sha256:...", "row_count": 12 },
    { "tool": "trace_diff", "digest": "sha256:...", "row_count": 4 }
  ],
  "supporting_events": ["e-122", "e-174", "e-208"],
  "counterexamples": ["e-233"],
  "limitations": ["no control run for region B"],
  "recommended_next_check": "replay config A/B on the fixed fixture"
}

counterexampleslimitations 很重要。没有它们,完整日志也可能只被 Agent 用来搜支持自己结论的片段。PRO-LONG 的游戏环境有明确 score;业务场景则应显式要求反证检索和验证建议。

状态机:让查询、计划和副作用彼此隔离

stateDiagram-v2
  [*] --> Observe
  Observe --> Append: immutable event written
  Append --> Hypothesize
  Hypothesize --> QueryPlan: bounded question formed
  QueryPlan --> Retrieve: policy allows scope
  Retrieve --> Evidence: packet validates
  Retrieve --> Escalate: budget/sensitivity/ambiguity limit
  Evidence --> Plan: hypothesis has support and limits
  Evidence --> Observe: insufficient evidence
  Plan --> Simulate: read-only replay or test available
  Simulate --> Plan: model refined
  Simulate --> Authorize: effect requested
  Authorize --> Execute: human/policy gate passes
  Authorize --> Escalate: high-risk or stale state
  Execute --> Observe: outcome appended
  Escalate --> [*]

在这台状态机里,append history 与 external effect 是完全不同的写操作。前者可以是自动化的、审计型的;后者必须检查当前状态、幂等键和权限。这一边界能避免“某次日志里看起来成功过”被误用为“今天可以直接发布或删除”。

可复制 SOP:一周验证 programmatic memory 是否值得引入

Day 1-2:选择一个真的需要远期证据的任务

不要拿一次三步的 FAQ 来验证。选择一个 30-200 步、有重复尝试、可得到客观反馈的任务,例如:复杂 CI 失败定位、数据 pipeline 异常调查、授权的白盒规则调试、跨多份原始论文的研究证据整理。定义 observation/action/outcome 和任务成功标准,先不接任何 LLM 写入。

Day 3:只实现 append 与两个确定性查询

建立 JSONL event schema、按 task 分区的 artifact 引用和两个工具:一个按字段过滤/聚合,一个按 event ID 回放/比较。用手工构造的 10 条轨迹验证:每条查询的答案都可追到原事件,且不能越过 task/tenant 边界。

Day 4:引入 evidence packet,不让模型裸读全量日志

让 Agent 只能请求声明式查询:时间窗口、event type、实体、字段和最大行数。工具返回 packet,要求模型在输出中引用 event IDs,且在高影响判断时写出至少一个反例搜索。记录 token、查询次数、返回行数和人工复核时间。

Day 5:对照三种 memory condition

与 PRO-LONG 的精神一致,但不照搬游戏环境:

条件历史可见性目的
recent-only最近 N 个 event 直接进 prompt代表滑动窗口
summary-only人工/模型摘要 + 当前输入代表压缩记忆
programmatic全量事件外置、预算化查询测试完整可访问性是否值得

对同一批任务保持模型、工具权限、时间预算和成功标准一致。不要只比较“回答是否流畅”,要比较是否找回关键早期证据、是否产生错误行动、成本和复核时间。

Day 6-7:做失败注入与发布决策

注入四种情况:早期反例被最近事件淹没、日志中包含伪指令、artifact 权限被拒、查询超预算。通过条件不是 Agent 总能完成,而是它能在缺证据或越权时停下并报出准确 reason code。达到门槛后,再把范围从只读分析扩展到低风险 action;没有达到则保留日志与离线评测,停止扩大写权限。

质量、成本与 ROI 指标

指标定义目的
远期证据召回率需要早期 event 的样本中,被正确找回的比例判断全量可访问性是否解决遗忘
证据可追溯率结论中能回链 event IDs/artifacts 的比例防止模型将日志改写成无来源叙事
反例覆盖率高影响结论中执行过反证查询的比例控制确认偏误
上下文压缩率注入 prompt 的 evidence tokens / 可访问历史 tokens衡量是否避免把全量日志重新塞进上下文
查询预算违例率超出行数、文件、时间或权限限制的请求 / 全部请求审计检索是否失控
长程任务成功率按预定义 verifier 成功的任务 / 全部任务不能用模型自评代替
单个已验证成功成本模型 + 计算 + 存储 + 人审成本 / verified successes防止完整日志只提升效果却无限烧钱
敏感数据越界率被拒绝或审计发现的跨 scope 读取 / 全部读取必须为 0 才能扩大场景

ROI 的保守表达是:

net_value =
  (verified_successes_delta * estimated_manual_minutes_avoided * blended_cost)
  - (model_cost + query_compute + artifact_storage + reviewer_minutes + maintenance)

不应把“模型调用变少”直接记为 ROI。若 programmatic search 让 Agent 花更多工具时间、增加 artifact 存储或让 reviewer 读更长 packet,这些都必须计入成本。论文在基准上的 token 优势是有价值的研究信号,不是业务 ROI 的替代品。

失败模式与回滚方案

失败模式早期信号处理回滚
日志变成不可解析文本查询靠模糊 grep,字段缺失率上升版本化 schema,拒绝不合格 event保留原 artifact,重建索引投影
日志过大、查询漫游每轮扫描全量文件,token/时延上升行数/时间预算、索引、分区过滤回退为 recent window + 人工触发深查
日志中的内容被当指令查询结果要求上传、跳过验证或执行命令数据与控制面隔离、prompt 明确标不可信禁止该 artifact 再进入 Agent 上下文,审计读取
全量保留引入敏感数据风险跨 tenant 引用、artifact 权限拒绝最小字段、redaction、短期引用、ACL删除派生索引、轮换访问凭据、事件审计
选择性检索支持既有假设packet 没有 counterexample,结论过度自信强制反证查询和 limitations 字段降级为“待验证”,不执行 effect
旧轨迹驱动新副作用当前输入 digest 与历史不匹配每个 effect 前重验 snapshot/幂等键停止 executor,进入人工补偿
任务本身无需长期记忆指标无提升、管理成本高缩小到滑动窗口或规则工具停用 TraceStore,但保留必要审计日志

适用场景与局限分析

programmatic memory 特别适合:未知规则需要试验、过去反例会改变当前计划、轨迹能自然序列化、工具能执行确定性分析、任务可由客观 verifier 判断的场景。ARC 游戏、复杂诊断、实验调参、白盒分析验证、跨多轮资料调查都在这个区域。

它不适合:短小且完全由当前输入决定的任务;没有稳定任务边界的开放式聊天;无法控制数据敏感性的跨用户日志;必须毫秒级返回且不能承担查询开销的请求;没有可验证 outcome、只能靠主观质量评价的场景。在这些情况中,完整轨迹可能只是更昂贵的噪声。

更根本的局限是因果归因。PRO-LONG 的消融显示程序化访问和完整日志相关于性能提升,但仍在特定 harness、模型、工具和游戏分布上测得。业务 Agent 还会受数据质量、权限、工作流设计、人类审核、外部系统延迟和激励机制影响。不能因为日志可回放,就以为 Agent 的解释一定正确;可回放只让错误更容易被定位和反驳。

我会如何实现与验证

如果在一个授权的研发调查 Agent 中实施,我会从每次 CI 失败的诊断开始。系统只 append:commit SHA、CI job、结构化错误摘要、命令、exit code、改动 diff digest、测试结果和受保护日志 artifact。Agent 的第一版只拿到三个工具:按字段 SQL 查询、按 event ID 读取 200 行以内片段、在固定 fixture 上重放一个测试。它不拿生产凭据,也不允许修改代码。

我会选择 30 个已关闭的 CI 事故作为回放集,并人为标出哪些需要早期证据。对照 recent-only、summary-only 和 programmatic 三种条件,记录远期证据召回、错误归因、token、查询量和人工审阅分钟数。只有当 programmatic 条件在远期证据召回和已验证诊断上有清晰增益,同时没有权限越界、查询预算失控和显著的复核成本上升,才让它生成修复建议;再之后才考虑受控的草稿 PR。

对于研究发布任务,等价做法是保留来源版本、主张、引用片段、站内相似文章、构建/部署证据为事件;查询工具负责找“同一主张的更新版本”“尚未覆盖的机制差异”“本次草稿引用的原始来源”。这既保留完整可回溯记录,也避免让旧聊天摘要决定今天是否该发布。

自审

  • 事实可靠性:PRO-LONG 的日期、定义、ARC-AGI-3 范围、作者报告的分数/token、工具阶梯、workspace 消融、日志结构、动作队列与开源可用性均链接到论文或作者仓库;全部数值标为作者报告,未声称独立复现。
  • 来源完整性:使用论文、论文方法/消融与开源实现三类一手证据;说明仓库只部分发布 cohort logs 的限制。
  • 站内差异:7 月 25 日文章处理跨运行账本、checkpoint 和副作用;本文处理单条长程轨迹的 append-all/programmatic read,且给出更细的工具与查询协议。
  • 工程价值:包含机制图、状态机、事件 schema、SQL、evidence packet、TraceStore 目录、角色分工、七天对照实验、指标、成本与回滚。
  • 薄内容与标题检查:不是论文摘要复述;明确哪些机制可迁移、哪些不能外推,标题准确描述方法与边界,不承诺通用性能提升。
  • 安全与隐私:强调全量保留不等于全量可读,要求 artifact 分区、ACL、query audit、最小字段和副作用 gate;不涉及第三方攻击或未授权数据处理。