AgenticSTS 有界记忆契约:技术分析与流水线改造操作手册
版本 :基于 arXiv:2607.02255(2026-07-02)及 AlayaLab/AgenticSTS 公开代码库
适用对象:当前采用"C++ 桥接 + Python 转译 + Claude 独立调用"的 OODA 流水线,计划引入跨决策记忆与跨局反思能力的策略游戏智能体开发者
0. 一句话结论
AgenticSTS 的核心主张不是"让模型记住更多",而是把记忆从"不断追加的历史"改写成"每次决策从五个有硬上限的命名槽位重新组装" 。对你流水线的含义是:你不需要引入一个会膨胀的会话;你需要把现有的"全量状态转译"拆成L2(当前决策必需字段) 和L3(按局面检索的相关规则) ,并在局后离线写入 L4/L5 ,下次决策时按触发条件检索注入。消融实验中收益最大的单一改动是 L5 技能库(3/10 → 6/10),而非 L4 情景记忆------这意味着你的反思机制应优先产出"可触发的策略规则",而不是"自由文本赛后总结"。
1. 问题诊断:为什么"追加历史"在你的场景里必然失效
你的流水线当前的无状态设计在"上下文不膨胀"这一点上是对的,但它付出的代价是每一步决策对模型而言都是零记忆的。如果你试图通过引入"一局 = 一个会话"来修复失忆,你会立刻撞上两个结构性障碍:
障碍一:提示规模随决策步数线性增长。 在追加历史的契约下,一局有 (d) 个决策、每个决策的观察大小为 (s) 时,第 (d) 步的提示规模是 (\Omega(d \cdot \bar{s}))。AgenticSTS 对比的两个公开《杀戮尖塔 2》智能体,单次调用提示从约 9k token 增长到接近 500k token ;而采用有界契约的 AgenticSTS,提示规模在任意长度的运行中保持平坦 ,实际用户消息文本约 5k token。
障碍二:归因失效。 把规则、当前状态、历史经验和策略建议混在同一段追加上下文里,当结果变好或变差时,你无法知道是哪一类信息在起作用。AgenticSTS 的设计目标之一,就是让每一层可以独立开关,从而在消融中隔离每类记忆的贡献。
你的单次输入已经接近上下文窗口极限,这意味着"追加历史"在你的场景里不是"成本高"的问题,而是不可行 的问题。AgenticSTS 给出的替代方案是:每次决策一条全新的用户消息,从五个类型化层中通过有上限的 top-k 检索组装,不追加任何原始跨决策对话记录。
2. 五层记忆契约:逐层拆解与工程含义
AgenticSTS 将每次决策 (d) 的提示形式化为:
u_d = \\pi\\big(L1,\\ L2(s_d),\\ L3(s_d),\\ L4(s_d),\\ L5(s_d)\\big)
其中 (s_d) 是当前状态,(\pi) 是组装函数。每层都有独立的上限和检索策略,因此提示总规模与运行长度解耦。
L1 --- 协议层(不可变)
内容:角色定义、交互规则、输出格式模板。在 AgenticSTS 中按状态类型分为四种(COMBAT / COMBAT_BOSS / DECKBUILD / STRATEGIC)。
你的映射:你现有的 Orient 指令和 Decide 指令及其输出格式(Orient 报告 / Decide 报告的结构化 schema),直接构成你的 L1。保持不变。
关键约束 :AgenticSTS 的一个负面结果 值得你高度重视------他们曾让一条 prompt 演化管线在局后自动生成 33 个 L1/L2 补丁,全部 33 个都未通过 A/B 验证 。结论是:局后 LLM 反思只应被允许写入 L4/L5,不应触碰 L1/L2。L1/L2 只能由人类通过代码变更来修改。你的 Orient/Decide 指令属于 L1,不应该被自动反思修改。
L2 --- 状态类型化提示层(不可变,按状态类型路由)
内容:当前局面的 schema 和合法动作格式。不同类型的状态走不同的 L2 模板(战斗、商店、地图、事件等)。
你的映射 :这是你改造的核心落点。你当前的 Python 转译层输出的是整局游戏状态的完整表格 ,接近窗口极限。L2 的要求是:只保留当前决策类型下必需的状态字段,且输出有硬上限。例如,当决策类型是"某区域单位调度"时,L2 不应包含全局所有单位的完整状态,而只包含该区域相关单位、资源余量、以及当前生效中的指令状态。当状态类型切换时,旧类型的 L2 自动退出,不进入下一次决策。
操作要点 :为你现有的转译脚本增加一个状态类型分类器 (按当前需要做出的决策类型路由),并为每种类型定义一个字段白名单 和输出长度上限。这是将"全量转译"改造为"有界 L2"的最直接手段。
L3 --- 游戏知识层(静态,按需检索)
内容 :单位属性、规则、交互关系等相对静态的知识。按版本更新,按当前局面过滤检索,而不是全量注入。
你的映射:你的游戏规则库、单位属性表、武器交互表等,不需要每次全部塞入提示。只检索与当前 L2 中出现的实体和决策类型相关的条目。
L4 --- 情景记忆层(局后写入,跨局检索)
内容 :上一局或历史局结束后的经验摘要,按维度索引。AgenticSTS 的索引键是 (character × ascension × act × enemy)。检索方式是 case-based recall------当前局面与哪个历史情景最相似,就召回那段情景的摘要。
关键消融事实 :在固定 A0 难度下,L4 单独并不带来额外胜率提升 。mode-a(仅 L5,无 L4)和 full-frozen(L5 + L4)都是 6/10。L4 的价值体现在难度爬升场景中:有局后可写 L4+L5 的流可以推进到 A6--A8,没有的流停在 A2--A4。
对你的含义:L4 值得建,但它不是第一优先级。先做 L5,再用 L4 支撑跨难度/跨地图的泛化。
L5 --- 技能库层(门控写入,按触发条件检索)
内容 :从日志中蒸馏出的带明确触发条件的策略指南 。每条技能由两部分组成:显式触发器 (什么局面条件下适用)+ 散文体策略(该条件下应该怎么做)。
这是 AgenticSTS 中观察到的最大单一收益来源:无存储基线 3/10,启用 L5 后 6/10(方向性结论,N=10,Fisher 精确检验 (p \approx 0.37),非统计显著)。两种技能来源------手工撰写(Mode A)和模板填充(Mode B)------达到相同的 6/10 点估计,说明**"拥有一个技能层"本身**比"由谁撰写技能文本"更关键。
触发器的格式 :AgenticSTS 强调触发条件必须显式拆出 ,不能埋在散文中。社区证据也指出,具体的触发条件和明确的排除条件("不要在 X 情况下使用")是智能体上下文中 ROI 最高的内容。
3. 与你的 OODA 流水线的逐层映射:改造蓝图
你当前的架构可以表述为:
C++ 读状态 → Python 全量转译 → Claude Orient → Claude Decide → Python 转译指令 → C++ 执行
改造后的目标架构是:
C++ 读状态 → Python 分类状态类型 → 组装 L1+L2+L3+L4+L5 的受限用户消息 → Claude 单次调用(或 Orient/Decide 合并为一次带结构化输出的调用)→ Python 解析并转译指令 → C++ 执行 → 局后离线管线写入 L4/L5
3.1 决策路径上的改造(实时,1 分钟/循环)
| 步骤 | 当前做法 | 改造后 | 关键动作 |
|---|---|---|---|
| 状态解析 | 全量状态 → 大表格 | 全量状态 → 状态类型分类器 | 按"本步需要做什么类型的决策"打标签(调度/交战/资源分配等) |
| L2 组装 | 全量表格注入 | 按状态类型选择字段白名单,输出有硬上限的结构化摘要 | 为每种决策类型定义"最小充分字段集"和长度上限 |
| L3 检索 | 规则全量注入 | 按 L2 中出现的实体和类型,过滤检索相关规则条目 | 维护一个可按实体索引的知识库 |
| L4 检索 | 无 | 按当前局面特征(地图/阶段/敌方组合等)top-k 召回历史情景摘要 | 仅在 L5 之后建设 |
| L5 检索 | 无 | 按当前局面特征匹配触发器,注入命中的策略指南 | 第一优先级 |
| 模型调用 | 两次独立调用(Orient、Decide) | 可保留两次,但两次都从同一组装管线取上下文;第二次调用携带第一次的输出 | 关键是"每次调用的上下文有界" |
一个重要的设计选择 :你当前 Orient 和 Decide 是两次独立调用,天然满足了"每次调用有界"的要求。改造后,Orient 的输入 = L1 + L2 + L3 + L5;Decide 的输入 = L1 + Orient 报告(作为本轮"已确定事项")+ L2(指令约束)+ L5(命中的策略)。Orient 报告本身充当了局内有界状态摘要 的角色,替代了不断追加的历史------这与 dsh-soul 等方案中"只投影已确定决策"的思路同构。
3.2 局后离线管线的建设(不发生在决策路径上)
局后管线是 L4/L5 的唯一写入通道,不影响单次决策的窗口占用。
AgenticSTS 的局后流水线顺序是:
- 记忆提取与指南整合 → 写入 L4(按节奏门控)
- 非战斗评分 + 失误驱动的战斗技能发现 → 生成 L5 候选
- 模板填充(Mode B)→ 填充角色参数化的技能模板 → 写入 L5
- 自演化引擎 → L5 写入
L5 写入必须通过两道门:
- 4 级写入门:精确匹配 → 余弦相似度 → 触发器 Jaccard 相似度 → LLM 裁判。
- 写入前 A/B 回放门 :对候选技能,在历史局面回放中重采样 (B=3) 次,要求严格优于基线 2/3 以上,且零有害才允许写入。
这两道门的意义是:不是每一条反思都能进入技能库。只有那些在回放中可复现地改善决策、且不引入有害行为的规则,才被固化。这直接回应了你"期望反思后获得更高分数"的目标------反思的质量由回放门控来保证,而不是由反思文本的流畅度来保证。
失误驱动的技能发现 的具体逻辑:标记 loss_ratio 超过敌方/幕基线阈值的交战,经由 LLM 批评器分析后,才提议写入技能。这意味着一局中不是所有失败都值得反思------只反思那些显著偏离基线的失败,将反思预算集中投入真正有信号的地方。
4. 分阶段实施路线图
阶段 0:建立基线和可观测性(1--2 周)
在做任何改造之前,先把当前流水线的决策质量变成一个可比较的数字。
- 定义每步决策的评分函数 :AgenticSTS 的评分是 (s = 100)(胜利)或 (\text{floor} + \frac{52}{3} \cdot \text{bosses})(其他)。你需要一个类似的连续分数,而不仅仅是胜/负,否则消融在 N=10 时无法分辨信号。
- 记录每次调用的提示规模:当前你已经接近窗口极限,基线数据将用来验证改造后 L2 是否真正把提示压下来了。
- 记录每局的关键决策片段:为后续 L5 技能发现提供原料。不需要记录全部上千步,只需要标记出态势发生显著变化或结果显著偏离预期的区间。
阶段 1:L1/L2 有界化------把"全量转译"拆成"按类型路由的有界摘要"(2--4 周)
这是最先做、收益最直接的改造,因为它不依赖任何经验数据。
- 实现状态类型分类器。你的游戏类似 CMO,决策类型至少可以粗分为:单位/编队调度、交战决策、资源/补给分配、侦察/情报处理、全局策略调整。为每类定义独立的 L2 字段白名单。
- 为每种 L2 类型设定硬性 token 上限 。AgenticSTS 的 L1/L2 是不可变的------一旦定下,不通过自动反思修改,只通过人工代码变更修改。这意味着你需要在初期就投入时间把 schema 设计对,而不是让它自动演化。
- 保留 L1 不变:你现有的 Orient/Decide 指令和输出格式就是 L1,不需要改。
验收标准 :改造后,任意决策步的 L2 输出规模与游戏已进行的步数无关。如果某一步的 L2 仍然随局面复杂度线性增长,说明字段白名单设计有问题。
阶段 2:L5 技能库------最小的、最高杠杆的记忆层(4--6 周)
不要先建 L4。 AgenticSTS 的消融明确显示,在固定难度下 L5 是唯一带来可观察差异的层。先做 L5,用最小可行的技能库验证你的流水线能否从记忆中获益。
- 冷启动 :先用手工撰写或模板填充 的少量种子技能(AgenticSTS 的
src/skills/seeds/提供了参考)。每条技能 = 触发条件(局面特征的结构化谓词)+ 散文体策略(该条件下优先做什么、避免做什么)。Mode B 的证据表明,模板填充的技能与手工技能达到相同的点估计,所以你不需要一开始就追求"高质量的自动反思",先验证"有技能层"这件事本身。 - 检索方式 :只做触发器匹配 ,不做相似度 RAG。AgenticSTS 明确警告:表面相似的战局可能有相反的战术含义 (出牌顺序、combo、路线历史不同),因此不检索最近邻日志片段,只检索带有显式触发器的技能条目。你的策略游戏同理------两个看起来相似的态势,可能因为补给状态或情报完整度不同而有完全不同的正确决策。
- 写入门控 :如果你从局后反思自动生成技能候选,必须通过回放 A/B 门 。对每个候选技能,在历史局面中重采样多次,只有严格改善且零有害才写入。这道门是"反思"和"噪音"之间的分界线。
验收标准 :开启 L5 与关闭 L5 的对比中,你的评分函数出现方向性改善。不要求统计显著(AgenticSTS 自己的 N=10 结果也只是方向性的),但改善方向必须一致。
阶段 3:L4 情景记忆------支撑跨难度/跨场景泛化(L5 稳定后)
L4 的定位不是"在固定难度下提升胜率",而是让智能体在难度爬升或场景变化时不至于从零开始。AgenticSTS 的难度梯子证据:有局后 L4+L5 的流推进到 A6--A8,没有的停在 A2--A4。
- 索引键 :在你的场景中,可能是
(地图 × 难度 × 阶段 × 主要敌方类型 × 我方编成类型)。关键是用你在决策时能够可靠提取的特征来索引,而不是用只有局后才能知道的信息。 - 检索 :case-based recall------当前局面匹配到哪个索引桶,就召回该桶下的历史摘要。摘要的内容应该是策略级的("这类局面下哪种决策倾向被证明有效/无效"),而不是行动级的逐步复盘。
- 写入节奏 :不是每局都写。AgenticSTS 的写入是节奏门控的。可以按局数间隔、或按评分变化阈值来触发写入,避免经验库被大量低信息量的对局淹没。
阶段 4:局后反思管线与门控固化(与阶段 2--3 并行)
- 失误驱动的反思 :只对
loss_ratio超过基线的片段触发反思,而非对上千步逐一步反思。反思的产出是L5 候选技能 或L4 策略级摘要,不是自由文本复盘。 - 写入门 :4 级去重 + 回放 A/B。新增技能必须显式声明是否取代 旧技能(AgenticSTS 的
dsh-memory-delta思路),防止经验库腐烂。 - L1/L2 保持不可变 :局后管线的写入权限不覆盖 L1/L2。
5. 需要警惕的边界条件与已知限制
5.1 统计显著性不是前提,方向一致性才是
AgenticSTS 自己的核心结果(L5 从 3/10 到 6/10)在 N=10 时 Fisher 精确检验 (p \approx 0.37),作者明确将其表述为 "directional rather than statistically decisive"。这意味着你不应该指望在你的游戏中第一次消融就得到统计显著的胜率翻倍 。你的目标应该是:在足够多的对局中,开启某个层之后的平均评分出现一致的方向性变化。
5.2 记忆的可迁移性依赖于主干模型
AgenticSTS 的跨主干探针显示:Gemini 训练出的 L4+L5 栈应用到 Qwen 3.6-27B 时平均分上升 84.5%,应用到 DeepSeek V4-Pro 时平均分下降 18.1% 。记忆内容与生成它的模型绑定。如果你未来更换 Claude 的版本或切换模型,需要重新评估已积累的经验库是否仍然适用,不能假设迁移后自动生效。
5.3 有界契约 vs. 追加历史的"干净对照"尚未完成
AgenticSTS 作者自己承认,有界契约是否优于在同一个代码库中 实现的匹配追加历史设计,是一个留给后续控制实验的开放问题。公开对比中的 66--90 倍 token 效率差距混合了路由、决策批处理等混淆因素。对你的含义是:有界契约的"效率"证据是强的,但"决策质量优于任何追加历史方案"的证据是方向性的。你的改造应该以"解决失忆 + 保持提示有界"为第一目标,而不是以"复制一个已被证明最优的架构"为预期。
5.4 你的 Orient/Decide 两阶段拆分不需要合并
AgenticSTS 使用单次决策调用加路由分发(fast / strategic / analysis / evolution),但你的两阶段 OODA 拆分本身已经提供了天然的调试边界和可审查的中间产物 。改造的重点不是把两次调用合并,而是让每一次调用的输入都来自有界槽位组装,并且 Orient 的输出作为 Decide 的有界"已确定事项"前缀。你可以在保持两阶段的前提下获得有界契约的全部结构优势。
6. 最小可操作检查清单
在开始改造之前,用这份清单判断你的流水线是否已经具备 AgenticSTS 所需的结构条件:
- 你是否能为"当前决策类型"定义一个有限的字段白名单,使得 L2 输出规模与游戏步数无关?
- 你的游戏是否能在每步决策时提取稳定的局面特征,用于 L5 触发器的匹配?
- 你是否有一个连续评分函数,而不仅仅是胜/负,用来检测方向性改善?
- 你是否能回放历史局面,用于技能候选的 A/B 门控?
- 你是否接受 L1/L2 由人工维护,不由局后反思自动修改?
- 你是否愿意先做 L5、后做 L4,而不是同时建两层?
如果以上答案大部分为"是",你的流水线已经具备向有界记忆契约迁移的结构条件。改造的核心工作量不在于引入一个外部框架,而在于重新设计你的转译层 ------从"全量状态的压缩器"变成"按决策类型路由的有界字段选择器",以及建设一条局后离线管线 ,将海量轨迹压缩为可触发、可回放验证的策略规则。AgenticSTS 提供的不是可以直接安装的运行时,而是一套经过测试台验证的记忆接口设计协议;你的任务是将这个协议翻译成你游戏语义下的具体 schema 和触发器。