SKILL.state:把 Agent 从“聊天记录驱动”改造成“显式状态机驱动”
这份文档按论文 1–16 页逐页学习,再把公式、Runtime、Schema、复杂度、Benchmark、实验和生产化边界串成一套可实现的 Agent Runtime 心智模型。
结论先行:这篇论文最值得学的不是“省 Token”,而是执行语义
程序规范 P + 当前状态 Σt + 最新观察 Ot;本轮推理只负责生成 状态补丁 ΔΣt + 下一动作 at,随后推理痕迹被丢弃。最重要的三层理解
- 不是 Memory 技巧:它不是把历史压缩得更聪明,而是改变“下一步决策依赖什么”的执行语义。
- 不是取消推理:单步内部仍允许复杂推理;只是推理不作为跨步持久记忆,持久化的是结构化状态。
- 真正难点从 Context 搬到 State:系统能力取决于 Schema 是否覆盖未来决策所需信息、Patch 是否正确、状态与真实环境是否一致。
论文真正解决什么:长程 Agent 的“执行状态重建税”
“Context poisoning” 在这篇论文里的具体含义
问题不是只有上下文太长。更危险的是:旧事实、失败假设、已经失效的观察和过时推理长期驻留在 Prompt 中。模型必须在每一步区分“历史事实”和“当前事实”,因此执行正确性越来越依赖自然语言历史的再解释。
来源:论文第 1–3 页的 Introduction 与 SKILL.state 定义。
逐页精读:16 页每页应该学到什么
从“推理问题”切换到“系统执行问题”
Aₜ=(P,Σₜ,Oₜ)。要抓住作者把“长程 Agent”重新表述为 Runtime 架构问题,而不仅是更强模型或更长 Context Window。学习问题如果下一步真正需要的是“当前世界状态”,为什么要让模型重复读取完整轨迹?SKILL.state 与 Memory / DST / Context Compression 的边界
真正的算法核心:Reasoning → Projection → State Patch
(Rₜ, ΔΣₜ, aₜ),通过带 null-delete 语义的字典 merge 得到 Σₜ₊₁;给出 Algorithm 1。要抓住Rₜ 是暂态计算,ΔΣₜ 才是跨步持久信息。特别重要InterCode CTF 的 100 个任务共享同一 5 字段 Schema:discovered_flags / tested_hypotheses / active_files / working_dir / cmd_summary。把 Figure 1 看成“上下文数据流图”
实验的自变量不是“模型”,而是 Context Management Paradigm
最有说服力的一页:规模、噪声、恢复同时测
证明“短 Prompt”不是充分条件
整篇论文最值得反复读的一页:充分统计量假设
把论文放回研究谱系:ReAct → Memory → Long Context → Explicit State
本页主要是参考文献。学习时不要逐篇阅读,而要按四条线索建立关联:Agent loop / Tool use、Long-term memory、Long-context degradation、Context compression。SKILL.state 的位置是:不继续优化“怎么保存历史”,而是质疑“执行是否必须依赖历史”。
最适合直接复现的一页:四种 Runtime Prompt 的最小差异
state_patch 与 action。Benchmark 的关键不是“难”,而是可控地暴露状态错误
把 state patch 当成“事务增量”理解
Warehouse 例子中,观察到客户订购 item_12,模型从 state 找到 shelf_42,输出 Patch 将该位置置空,同时生成 Ship item_12 shelf_42。这个例子清晰展示“观察 → 查状态 → 决策 → patch + action”的闭环。
Noise 实验测的是 Attention Drag,不是恶意 Prompt Injection
噪声被严格限定为随机、与任务无关、不会改变 ground-truth state 的背景 telemetry,例如机器人电量、温湿度、Camera OCR、远端服务器 CPU/RAM。作者明确说这部分专注 Condition 1:Irrelevant Context。
因此不能把表 2 / 表 9 的结果外推成“对 prompt injection、恶意 rule override 或可信输入冲突也同样鲁棒”。
关系图状态比独立槽位更难,但趋势仍成立
T=100:Prompt 0.53 / 1.8485M tokens;Memory 0.57 / 2.7527M;Stateful 0.63 / 2.308M;SKILL.state 0.78 / 90.2k。说明当状态存在 PR、branch、CI 的结构依赖时,显式 state 仍明显减少 token,并保持更高分数。
结构化状态把新瓶颈暴露为“结构化输出遵循”
Gemma-4-31B 与 Qwen-3-8B 在长 horizon 下整体分数下降,但 SKILL.state 的 Prompt 仍约 2.1k。Gemma T=100 时 SKILL.state 与 Stateful 都是 0.42,但 token 约为 65k vs 558k;Qwen T=100 为 0.34 vs 0.31,token 约 66.9k vs 569k。
三个结尾证据:高噪声、外部漂移、固定预算
Software Repository 在 50 noise events 下:Prompt 0.11,SKILL.state 0.80;Force Push / Flaky CI 的恢复步数分别对 baseline 为 8–14 步,对 SKILL.state 报告为 0;固定约 1,800 tokens 时,T=100 的 SKILL.state 0.94,而 Summary-capped 0.52、Window 0.18、LLMLingua 0.22。
核心形式化:把 Agent Loop 改写成显式状态转移
1. 每一步模型只看三个输入
Aₜ = (P, Σₜ, Oₜ) P = immutable procedural specification Σₜ = structured execution state at step t Oₜ = latest environment observation
最关键的是“没有 C₁…Cₜ 的完整 conversation”。以前的 actions、observations、reasoning 不直接进入下一轮。
2. 模型输出三类东西,但只有一类跨步持久化
(Rₜ, ΔΣₜ, aₜ) Rₜ = within-step reasoning → ephemeral ΔΣₜ = structured state patch → persistent after validation aₜ = action → sent to environment
3. 状态更新
Σₜ₊₁ = Σₜ ⊕ ΔΣₜ ⊕ = dictionary merge null = deletion semantics
学习视角:可以把它理解成“把本轮推理压缩为一个具有业务语义、可验证、可覆盖的状态增量”,而不是把自然语言推理摘要当作事实。
Runtime 架构:LLM 只是 State Transition Proposal Engine
模型负责
- 理解最新 observation
- 从 state 读取当前事实
- 推导下一动作
- 提出 state patch
Runtime 负责
- Schema ownership
- Patch 语法与类型校验
- 合并与删除语义
- 拒绝 malformed patch
- 持久化 canonical state
Execution State 怎么设计:Schema 是系统的真正 API
论文给出的 CTF 5 字段 Schema
{
"discovered_flags": [],
"tested_hypotheses": [],
"active_files": [],
"working_dir": "...",
"cmd_summary": "..."
}
这五个字段不是“记住所有发生过的事”,而是保存未来搜索仍然有用的信息:发现了什么、哪些假设已失败、哪些文件活跃、当前目录、命令摘要。
设计 State Schema 的四条规则
- Future-use only:字段存在的理由必须是“未来某一步会用它做决策”。
- Canonical:同一事实尽量只有一个权威位置,避免多个字段表达冲突事实。
- Patchable:状态应能局部更新,而不是每轮要求模型重写整份对象。
- Validatable:类型、枚举、ID、引用关系最好能被程序校验。
tested_hypotheses 无限增长,Prompt 仍可能随 T 增长。论文的 O(1) 结论需要进一步假设字段内容规模也被任务域或运行时策略有界化。为什么从 O(T²) 变成 O(T):逐步算清楚
Conversation Runtime
|Cₜ| = O(t) Σₜ₌₁ᵀ |Cₜ| = 1 + 2 + ... + T = O(T²)
第 t 步包含前面近似 t 步历史,累计输入量是三角形增长。
SKILL.state
|Pₜ| = O(|P| + |Σ| + |O|) 若 |P|, |Σ|, |O| 有界: Σₜ₌₁ᵀ |Pₜ| = O(T)
单步 Prompt 不随“已经执行了多少步”增长。
必须补上的复杂度条件
论文把 |Σ| 和 |O| 视为与 t 无关,因此得到“strictly bounded O(1) prompt footprint”。对固定 500 shelves 的 Warehouse,这个假设很自然;但对开放式文件系统、网页探索、代码搜索、长期任务,如果 state 中集合/日志/摘要持续扩大,就不能只因为 Schema 字段数固定而自动得到 O(1)。
生产策略:对每个字段设计 cardinality bound、TTL、top-K、聚合器或 domain-specific compaction;否则只是把“conversation growth”换成“state growth”。
Benchmark 怎么设计:把“状态管理能力”从通用智能里拆出来
| 环境 | 核心状态结构 | 主要动作 | 测什么 |
|---|---|---|---|
| Warehouse | 500 个独立 shelf → item/null | Store / Ship / Move / Wait | 长程独立槽位记忆与精确更新 |
| Software Repository | Branch / Commit / PR / CI 关系图 | Commit / CreatePR / Merge / FixCI / Wait | 结构依赖与连锁状态变化 |
| InterCode CTF | 假设、文件、目录、flag、命令进度 | Linux bash | 开放式搜索 + 工具使用 + 避免重复失败路径 |
| Sierra τ-Bench | 客户意图 + SQLite 业务状态 + Policy | 查询与事务 API | 真实业务工作流、最终数据库状态正确性 |
实验设计最漂亮的地方
作者不仅比较“完整历史 vs state”,还把 Sliding Window、硬上限 Summary、LLMLingua 压缩到与 SKILL.state 近似相同 token budget。这样可以回答一个关键反事实:性能提升到底来自“Prompt 变短”,还是来自“保留了正确的结构化语义”?
实验结果怎么读:四组数字建立完整证据链
| 场景 | 对比 | SKILL.state | 关键信号 |
|---|---|---|---|
| Warehouse T=100 | Stateful: 0.91 / 1,062,387 tokens | 0.94 / 65,408 | 约 16.24× 更少累计 token |
| Warehouse T=200 | Memory: 0.84 / 6,175,509 | 0.94 / 122,384 | 约 50.46× 更少累计 token |
| InterCode CTF | 最佳 baseline pass@1 46.4% | 54.2% | +7.8 个百分点;vs ReAct token -60.4% |
| τ-Bench Retail | Stateful 51.7% / 3.92M | 58.3% / 3.47M | 成功率 +6.6pt |
| τ-Bench Airline | Stateful 28.1% / 5.28M | 32.4% / 2.88M | +4.3pt,token 约 -45.5% |
倍数由论文表中 token 数直接计算,用于帮助理解规模差异。
为什么“压缩历史”不等于“维护状态”
| Warehouse T=100 / ~1,800 tokens | Score | 为什么会丢信息 |
|---|---|---|
| Truncated Sliding Window | 0.18 | 早期但仍有效的库存位置被窗口淘汰 |
| ReAct + LLMLingua | 0.22 | 统计上“低价值”的 slot identifier 可能在业务上是关键主键 |
| Summary-capped | 0.52 | 自然语言 summary 很难无损保存大量精确关系 |
| SKILL.state | 0.94 | 显式保存当前关系状态,不按文本显著性淘汰 |
噪声与状态恢复:为什么旧历史会产生“惯性”
Noise Robustness
Warehouse T=50、50 distractors/turn:Prompt 从低噪声 0.68 降到高噪声 0.53;SKILL.state 仍为 0.98。Software Repository 在 50 noise events 下:Prompt 0.11,SKILL.state 0.80。
State Recovery
环境被外部 actor 静默修改时,历史基线仍反复看到旧事实,因此需要多个 turn 才“相信”新观察;论文报告 SKILL.state 在测试场景中 0 recovery steps。
不要过度外推
Appendix C 明确把噪声限定为 strictly irrelevant + non-state-altering。这证明了对 Attention Drag 的鲁棒性,但没有直接证明对恶意 prompt injection、伪造状态事件、多个可信源冲突、部分可观测世界等问题同样有效。
小模型失败模式:从“推理能力瓶颈”转向“状态协议瓶颈”
| 错误类型 | 占比 | 本质 | 对应工程手段 |
|---|---|---|---|
| Premature overwrite / deletion | 68% | Patch 语义理解错误,误删已有 key | JSON Patch/RFC-like op、字段级 reducer、禁止全量重写 |
| Schema / type coercion | 20% | list/dict/nested type 不一致 | JSON Schema、typed SDK、自动 repair |
| JSON syntax / formatting | 12% | 结构化输出格式错误 | grammar-constrained decoding / native structured output |
关键边界与风险:真正生产化前必须补的四个问题
1. “State 是充分统计量”不是自动成立
如果某条早期观察当时没被识别为重要事实,就不会进入 Σ;历史一旦丢弃,未来无法回看。这是论文自己明确列出的限制。
2. 固定 Schema 不保证 O(1)
Schema 字段固定,但字段值仍可能无限增长。对开放式 Agent 必须额外设计 state budget。
3. Patch 与 Action 的原子性
Algorithm 1 的顺序是 Validate Patch → Apply Σₜ₊₁ → Execute aₜ。如果动作执行失败,论文没有给出完整的 commit/rollback 事务协议。生产实现应避免“状态声称已发生,但外部世界没发生”。
4. Stateful (LangGraph-style) 是一种基线配置,不等于整个框架能力边界
论文中的 Stateful baseline 是“结构化 state + 完整 rolling transcript”。因此它证明的是这种配置相对 SKILL.state 的差异;不能直接理解成所有 LangGraph 应用都必须保留完整 conversation。
生产化架构推导:State / Memory / Event Log 三层分离
本节为基于论文原理的工程推导,不是论文原文实现。
为什么三层都要保留
- State 解决“下一步要知道现在是什么”。
- Memory 解决“有些信息当前不在 state,但可能被未来查询重新激活”。
- Event Log 解决“人类需要知道到底发生过什么”,同时避免把审计历史当作每步推理上下文。
建议把论文的单阶段写状态改成事务式提交
observe Oₜ
↓
LLM proposes {patch, action}
↓
validate schema + invariants
↓
execute action against environment
↓
if success:
commit/reconcile patch → Σₜ₊₁
else:
keep/rollback Σₜ and write failure observation
↓
append immutable event log
对“动作本身会改变世界”的系统,这种顺序更容易维护 state/world consistency。若需要 optimistic update,也应保存版本和 rollback 信息。
最小实现蓝图:200 行以内就能验证核心思想
以下是工程化伪代码,用于复现论文思想;不是论文代码。
State Schema
State = {
"goal": str,
"facts": dict,
"tested_hypotheses": list[str],
"active_resources": list[str],
"progress": dict,
"done": bool
}LLM Structured Output Contract
{
"state_patch": {
"facts": {"key": "new_value"},
"tested_hypotheses": ["..."],
"done": false
},
"action": {
"tool": "...",
"args": {...}
}
}Runtime Loop
state = initial_state()
observation = env.reset()
while not state["done"]:
prompt = build_prompt(skill_spec, state, observation)
proposal = llm.generate_structured(prompt)
validate_patch(proposal.state_patch)
validate_action(proposal.action)
validate_invariants(state, proposal.state_patch)
result = env.execute(proposal.action)
if result.success:
state = merge(state, proposal.state_patch)
observation = normalize(result)
event_log.append({
"state_version": version(state),
"action": proposal.action,
"result": result
})必须加的 6 个 Runtime Guard
- JSON Schema / grammar constrained output
- 字段级 patch allowlist
- 状态 invariant 校验
- state version / optimistic concurrency
- action idempotency key
- event-sourced audit log + replay
学习与复现实验:从理解论文到能自己实现
复述核心模型
不看论文,能解释 P / Σ / O / R / ΔΣ / a 的职责,以及为什么 reasoning ephemeral、state persistent。
实现 Warehouse Mini
100 个 shelf,随机生成 Receive / Order / Move;做 ReAct history 与 state-only 两个 Runtime,对比 10/25/50/100 steps 的 token。
加入 Noise + External Drift
每轮注入 20 条无关 telemetry;随机让外部 actor 移动物品。记录错误率与 recovery steps。
加入 Budget-matched baselines
实现 sliding window、summary capped,与 state-only 对齐 token budget,验证“短上下文 ≠ 正确状态”。
做 Production Hardening
添加 JSON Schema、事务提交、event log、state version、错误重试,再做故障注入。
推荐你在复现时额外测两个论文没完全覆盖的问题
- State growth:让 tested_hypotheses 每步增长,测 O(1) 何时失效。
- Action failure:让 10% 工具调用返回失败,验证“先 patch 后 action”是否造成 state/world divergence。
掌握度自测:能回答这些问题才算真正理解
- SKILL.state 与“对 conversation 做 summary”最根本的语义差别是什么?
- 为什么
Rₜ可以丢弃,而ΔΣₜ必须保留?什么情况下这个假设失败? - 固定 5-field Schema 为什么不自动等于 O(1) Prompt?
- 为什么 Sliding Window 与 LLMLingua 在相同 token budget 下仍大幅掉分?
- 论文的 State Recovery 0 steps 依赖了哪些实验条件?
- 如果最新 observation 本身错误,canonical state 会发生什么?如何加 provenance/confidence?
- 为什么 production 系统仍应该保存 append-only event log,但不必把它喂给模型?
- 多 Agent 共享 Σ 时,
⊕需要解决哪些并发语义? - Action 执行失败时,怎样保证 state 与 world 原子一致?
- 什么类型的任务本质上不适合彻底抛弃历史轨迹?
来源与边界说明
论文
本文逐页分析基于用户提供的 2608.26263v2.pdf(16 页),正文数字、公式、Benchmark、Prompt 模板与限制均按该版本整理。
内容边界
论文直接支持:SKILL.state 的输入/输出形式化、Algorithm 1、Schema 设计示例、复杂度主张、SkillExecBench、InterCode CTF、τ-Bench、各表实验数字、错误分类、Limitations 与 Appendix prompts。
本文工程推导:Markov 化解释、固定 Schema 不等于固定 state size 的复杂度条件、Patch/Action 原子性分析、State/Memory/Event Log 三层架构、事务式 commit、state version / idempotency / invariants 等生产化建议。这些是基于论文机制的系统工程延伸,不是作者在论文中完整给出的实现。
页面格式严格遵循《html_UI 设计规范.md》:240px 固定侧边栏、900px 内容区、白底 / 米白背景、蓝紫单一强调色、Card / Callout / Chip / Hierarchy / Timeline / 对比表格 / IntersectionObserver。