研究提案 已修订

CBCL:为长程编码 Agent 的上下文压缩补上未执行的反事实分支与逐次压缩价值账本

AutoCompact 让裁判在数据采集阶段改写压缩决策并现场执行改写后的输出,却从未执行策略自己的原版,占监督 53% 的摘要改写价值无人测量;分段优势又被整条轨迹共享,逐次压缩拿不到自己的信用,量摘要质量的关键词筛查已顶到 99.8% 却测不到论文自己命名的自洽失败。本文提出对照分支压缩账本 CBCL:在裁判改写处开配对分支记 Δ,用确定性的消费与自洽判定替换关键词筛查,按账本改写分段优势,λ=0 时严格退化为原方案。

Agent 训练数据 上下文压缩 长程编码 Agent 信用分配 反事实评估 数据工程 RLVR

背景与动机

长程编码 Agent 的上下文管理正从「窗口快满才压」变成策略自己的动作。AutoCompact(2610.02163,新加坡管理大学、南洋理工大学、哈佛大学五位作者,v1 2026-10-01)把 compact() 挂成模型可调用动作,训练时让 GPT-5.5-Codex 当裁判,在数据采集阶段逐条审查压缩时机、工作态摘要、压缩后的续行动作,判定不合格就现场改写再交给环境执行。379 个 SWE-rebench 任务上采到 1,052 条裁判修正轨迹,其中 24% 监督触发时机、53% 监督摘要内容、23% 监督压缩后续接;两轮 SFT 之后在 SWE-Gym 上做 GRPO,每任务采样 8 条轨迹、二值任务成功奖励、50 步环境与 32K token 上限。SWE-bench Verified 上 Base 30.4% 走到 39.6%,SWE-PolyBench Verified 上 19.5% 走到 24.5%,压缩调用率从 SFT 的 44.3% 升到 RL 后的 58.5%。

几处复现必需的设定原文分散在 3.1 节:基座是 Qwen3-Coder-30B-A3B-Instruct,全部变体共用同一个终端式 REPL scaffold,评测上下文 256K(另设 16K 强制压缩阈值的对照),所有量化结果取三次运行的均值,成本档按阿里云 Model Studio 对同一模型的官方定价折算(缓存 token 按 20% 计价)。Figure 4 的两条曲线是在全部 500 个 SWE-bench Verified 任务的轨迹上统计的。

这套流程留了三处断点,彼此独立。第一处是改写被执行、原版从未被执行。第二节逐字写着 Corrections are applied before execution, so each one shapes the rest of the trajectory,并用它与 post-hoc annotation 划界,把对 SWE-Compressor 的 +1.2 与 +1.6 归给「改写真的执行了」。可是 SWE-Compressor 那一臂换了两个东西:压缩调用是离线插进已完成轨迹的,且插入后保留原有后续动作。压缩动作的来源与后续动作的来源一起变,因果归属没有被隔离。需要的配对是同一前缀、同一续接策略、只换压缩输出的两条分支,这一臂没有跑——2026-10-02 在 arxiv.org/html/2610.02163v1 全文上做词频计数,counterfactual 与 ablation 命中均为 0。于是占全部监督 53% 的摘要改写里,有多少改与不改结果一样,是个没有测过的数。

需要把这条缺口与论文已有的对照分开,否则会被读成指控遗漏。第三节图 3(d) 跑过一个方向不同的对照:拿同一个训练好的检查点,一臂照常执行压缩、一臂忽略压缩调用继续用原有历史,两者参数完全相同。结果是执行压缩的一臂通过率更高,0.10档领先19.90.10 档领先 19.9%、4.00 档仍领先 1.9%。这个对照回答的是「压缩这个动作有没有用」,不是「裁判写的这版比策略自己那版好多少」——它把压缩整体开关掉,两条分支里都没有策略原版输出。CBCL 要的是后者:前缀固定、后续策略固定、只换裁判改写与策略原版这两份候选输出。这个配对在全文里确实没有出现,counterfactual 与 ablation 两个词的零命中指的是这层意思。

第二处是逐次压缩的信用不存在。第三节逐字写着 All segments of a trajectory share its advantage, so the decision to compact, the summary, and the actions after compaction receive the same outcome-based signal even though they fall into different segments。一条轨迹压三次,三次压缩与三段续接共用一个标量;哪一次压得对、哪一次压坏了,从奖励里读不出来。论文只报「调用过至少一次 compact() 的任务占比」,没有报每条轨迹的压缩事件数,共享同一标量的决策个数是未知量。

第三处是量摘要质量的仪器已经顶到天花板,而论文自己命名的失败模式恰好在它的量程之外。Figure 4 的两条曲线(关键状态遗漏 3.1% 降到 0.2%、下一步动作遗漏 8.2% 降到 2.2%)由 keyword-based screening 加随机人工抽查算出,RL 之后读数是 99.8% 与 97.8%。第四节另给一个名字 summary self-consistency:摘要记了状态也写了下一步,两者可以互相矛盾——django-13809 上 SFT 版摘要记着未解决的 SyntaxError 却提议直接收工,RL 版记着改动完成并提议先验证,前一条跑出 SyntaxError 失败、后一条通过测试。这条判据的证据形态是单任务个案,量化仪器按构造测不到「关键词都在、语义互相打架」。项目页自己写明 Trigger timing can still improve,模型更可靠的是保留什么而不是何时压,两个接近满分的读数恰好落在保留什么这一侧。

核心思路

提出 CBCL(Counterfactual-Branch Compaction Ledger,对照分支压缩账本),把三件事补进 AutoCompact 的数据采集与信用分配:在裁判改写处开配对分支,给每次压缩记一本价值账;把判定器从关键词筛查换成确定性可标定的消费与自洽检验;按账本改写分段优势。

三个量。裁判在第 kk 步判定策略输出 yky_k 不合格并写出改写 y~k\tilde y_k 时,从同一前缀 h<kh_{<k} 分出两条分支:A 支执行 y~k\tilde y_k,B 支执行策略自己的 yky_k,同一 scaffold、同一 seed、同一剩余预算,记

Δk=r(A)−r(B)∈{−1,0,+1},π0=Pr⁡(Δk=0)\Delta_k=r^{(A)}-r^{(B)}\in\{-1,0,+1\},\qquad \pi_0=\Pr(\Delta_k=0)

π0\pi_0 是「白改率」,按修正类型(触发 24% / 摘要 53% / 续接 23%)分开记。χk\chi_k 是消费指示:压缩后头 mm 个动作里,是否动用了只出现在摘要、不在任何保留原文轮次里的标识符(路径、符号、报错串)。σk\sigma_k 是自洽指示:摘要是否记着活跃阻塞项(未解决报错、失败测试、未落盘编辑、缺失符号)而首个后续动作却是终结性动作(提交、空转、重跑摘要里已有结果的检索)。

信用分配上,把含第 kk 次压缩的分段优势从共享的 AA 换成 A+λΔ^kA+\lambda\hat\Delta_k,其中 Δ^k\hat\Delta_k 取该修正类型的任务级均值——RL 阶段裁判已移除,逐次 Δk\Delta_k 不可得,只能用类型级先验。χk=0\chi_k=0 时把摘要 token 从终端优势里 mask 掉:摘要没被消费,任务成败对它不携带信息。λ=0\lambda=0 且不做 χ\chi 掩码时,CBCL 严格退化为 AutoCompact 的分段方案,这一点兼作复现性自检。

与现有工作的分界在四处:AutoCompact 的裁判回答「该不该改」,CBCL 回答「改了值多少」;CompactionRL 把压缩绑在长度阈值上,CBCL 不动触发机制;SWE-MeM 的 step-level mask 由 memory-management failure 触发,CBCL 的掩码由测出来的反事实价值触发;Mem++ 的非破坏原则搬到训练侧——压缩改写上下文而不销毁跨度,被压掉的原始跨度按索引留在磁盘上,并挂一个 recall(span_id) 动作,让「摘要记着未解决报错」变成可回查的断言而不是模型的自述。

技术路线

第一步,配对分支采集。裁判改写的落点已经是天然的分叉点:判定发生在执行之前,两条分支共用同一前缀与同一环境快照。每个被判定不合格的决策多跑一条续接分支,额外成本是一次分支续接,与一次普通 rollout 同量级。这一步不训练、不更新参数,产出 π0\pi_0 与按类型分列的 Δ^\hat\Delta,先跑完再决定是否往下走。

第二步,非破坏后备存储。compact() 只重写上下文,压掉的原始消息按 span 落盘,容量成本是磁盘而非窗口;recall(span_id) 作为第二个 harness 动作暴露给策略。这一步为第三步的阻塞项判定提供可回查对象,也把「压缩」从不可逆操作降级为可撤销的视图切换。

第三步,确定性判定器与外部标定。χ\chi 与 σ\sigma 都做成字符串级判定,不调用生成模型:阻塞项用一组谓词在摘要文本上枚举,终结性动作按动作类型的白名单判定。判定器先在 1,052 条已采集轨迹上人工标注 200 条摘要做标定,要求精确率不低于 0.80、召回不低于 0.70,未达标则整套方案终止。压缩后分段为空(撞到 50 步或 32K 上限)时记 NA 而不是 0,避免把截断当成未消费灌进统计。

第四步,信用重分配。修改分段的 advantage 张量:含压缩的分段加 λΔ^type(k)\lambda\hat\Delta_{\text{type}(k)},χk=0\chi_k=0 的分段把摘要 token 的掩码置零。改动落在 loss 组装处,不动 GRPO 的组归一化,也不引入 KL 或熵项。

# cbcl_credit.py —— 按压缩账本改写分段优势
def segment_advantage(segments, ledger, lam=0.5, mask_unconsumed=True):
    """
    segments : AutoCompact 的分段列表,每段带 kind / compaction_idx / token_mask
    ledger   : 第一步产出的 {(task, k): (delta, chi, sigma)},缺失记 NA
    return   : 每段的优势向量,lam=0 且 mask_unconsumed=False 时退化为原方案
    """
    out = []
    for seg in segments:
        adv = seg.base_advantage
        rec = ledger.get((seg.task, seg.compaction_idx))
        if seg.kind == "compaction" and rec and rec.delta is not None:
            adv = adv + lam * rec.delta
            if mask_unconsumed and rec.chi == 0:
                seg.token_mask &= ~seg.summary_positions   # 未消费,摘要不背终端奖励
        out.append((seg, adv, seg.token_mask))
    return out

第五步,五臂实验。A 臂复现 AutoCompact(SFT + GRPO);B 臂只加配对分支采集,不改训练,用来读 π0\pi_0 与 Δ^\hat\Delta;C 臂在 B 之上加 λΔ^\lambda\hat\Delta 信用项;D 臂在 C 之上加 χ\chi 掩码与 recall;E 臂是安慰剂,把 Δ^\hat\Delta 换成随机打乱修正类型后重算的值。评测沿用 SWE-bench Verified 与 SWE-PolyBench Verified,并在 0.10到0.10 到 4.00 六个预算档上分别报——论文实测压缩本身的贡献在 0.10档是19.90.10 档是 19.9%、在 4.00 档只剩 1.9%,信用项的效果应当集中在低预算档。

关键技术挑战有四条。分支预算:监督事件里 53% 落在摘要改写上,全量配对会让采集成本上升约五成,按修正类型分层抽样可压到两成。单次二值差分的信噪比:单条分支的 Δk\Delta_k 方差大,类型级 Δ^\hat\Delta 需要足够的分支数才收敛,先按 SWE-bench Verified 的 500 题估一个置信区间宽度门槛。RL 阶段的类型级先验:裁判已移除,λΔ^\lambda\hat\Delta 是把采集期测到的值搬到训练期,跨分布漂移需要监控。跨度回填对分段 loss 的影响:recall 会把旧跨度重新拉回上下文,分段边界的定义要从「前缀被重写」扩成「前缀被重写或被扩展」。

预期成果

定量的可证伪预测六条。P1:摘要改写类的白改率 π0\pi_0 不低于 0.35;若三类修正的 π0\pi_0 全部低于 0.10,则「改写大量无价值」这一前提不成立,方案终止。P2:确定性自洽判定器在 RL 后的 SWE-bench Verified 摘要上标记率不低于 5%,而关键词筛查报 2.2%,两者差距不小于 2.8 个百分点;差距落在 1 个百分点以内则第三处断点不成立。P3:C 臂在 0.10到0.10 到 0.40 预算档上相对 A 臂提升 1.0 到 2.5 个百分点,在 4.00档允许持平。P4:RL后不低于204.00 档允许持平。P4:RL 后不低于 20% 的压缩事件满足 \chi=0$,即摘要写了但没被消费,这些摘要原本白拿了终端优势。P5:E 臂与 A 臂无显著差异,确认收益来自测出来的价值而不是重新加权本身。P6:recall 在压缩事件上的调用率低于 5% 时,非破坏后备存储不值得这份 harness 复杂度,从方案里摘掉。

定性目标是给长程 Agent 的上下文管理补一层可记账的判据:压缩不再只由裁判的品味决定,也不再由整条轨迹的终端成败笼统背书,每一次压缩带上自己的价值读数。这一层判据与具体任务无关,可搬到 deep research、GUI 操作、多轮工具调用等同样靠压缩续命的长程场景。对数据工程的直接影响是采集预算的重新分配——若 P1 成立,占全部监督一半以上的摘要改写可以按 Δ^\hat\Delta 排序后砍掉尾部,把裁判预算挪到触发时机这一侧,也就是项目页自己承认偏弱的那一侧。

局限性与失效模式

  • Δk\Delta_k 只在采集期可得,训练期用的是类型级先验。 RL 阶段裁判已移除,λΔ^type(k)\lambda\hat\Delta_{\text{type}(k)} 是把采集期测到的均值搬到训练期。采集期跑的是基座策略加裁判改写,训练期跑的是 SFT/RL 之后的策略,两次分布不同。若漂移方向与修正类型相关,类型级先验会把信用加错地方,且这个错误不会在终端奖励上显形。
  • 二值差分的信噪比。 单次 Δk∈{−1,0,+1}\Delta_k\in\{-1,0,+1\},一条分支的方差极大。B 臂能读到 π0\pi_0 的点估计,但类型级 Δ^\hat\Delta 的置信区间要先按 500 题估一个宽度门槛才谈得上进 loss。P3 给的 1.0 到 2.5 个百分点,量级与这个区间宽度同阶。
  • χ\chi 与 σ\sigma 是字符串判定,不是语义判定。 消费指示靠「压缩后头 mm 个动作里是否出现只存在于摘要的标识符」来定,自洽指示靠谓词枚举加终结性动作白名单。摘要換了同义说法、或路径以变量形式拼接,判定器会漏。这就是第三步要求先在 200 条人工标注上卡精确率 0.80 / 召回 0.70 的原因,未达标整套终止。
  • recall 会改变分段的定义。 被压掉的跨度回填进上下文之后,分段边界不再只是「前缀被重写」,还得包含「前缀被扩展」。第四步的 advantage 张量改动落在 loss 组装处,但分段器本身也要跟着改,这一处工作量没有被五步路线单列。
  • 裁判预算是外生约束。 本提案假设裁判改写发生在执行之前、因此可以顺手开一条对照分支。若部署时的裁判是异步的或批量的,分叉点就不存在,装置一需要退化成离线重放,成本从「一次分支续接」涨到「一次完整重放」。
  • 结论绑定在 256K 与代码任务上。 39.6% 与 24.5% 都是 Qwen3-Coder-30B-A3B 在仓库级软件工程任务上的读数,π0\pi_0 的大小与裁判强度、任务难度、基座能力三者都有关。换到 deep research 或 GUI 操作场景,P1 的 0.35 门槛需要重新标定,不能直接沿用。

相关工作

  1. AutoCompact(arXiv:2610.02163)——本提案的主锚点,judge-guided 在线修正加结果级 RL,SWE-bench Verified 39.6%。
  2. Mem++(arXiv:2610.02002)——非破坏记忆,写时不蒸馏、读时选择,OrgMemBench 上超过最强记忆系统基线 8.0 到 13.1 分;本提案借用其非破坏原则,把压缩改写成视图切换。
  3. CompactionRL(arXiv:2607.05378)——长度阈值触发的压缩 RL,SWE-bench Verified 32.7%,本提案保留其分段训练结构而不动触发机制。
  4. SWE-MeM(arXiv:2606.28434)——记忆管理的 step-level mask,与本提案最接近的逐段信用尝试,其掩码由管理失败信号触发,本提案换成反事实价值。
  5. Context-Folding(arXiv:2510.11967)——子轨迹折叠式上下文压缩,代表「压缩什么」这一侧的表示设计,本提案不与之竞争。

核查记录(2026-10-03):主锚点 AutoCompact 的标题、五位作者、v1 日期经 arxiv.org/abs/2610.02163 的 citation meta 核验一致;379 个 SWE-rebench 任务、1,052 条裁判修正轨迹、24% / 53% / 23% 的监督分布、Base 30.4 与 19.5、AutoCompact 39.6 与 24.5、44.3% → 58.5%、3.1% → 0.2% 与 8.2% → 2.2%、对 SWE-Compressor 的 +1.2 与 +1.6、0.10档19.90.10 档 19.9% 与 4.00 档 1.9%、Corrections are applied before execution 与 All segments of a trajectory share its advantage 两句原文、summary self-consistency 与 django-13809 个案,均逐条回源 arxiv.org/html/2610.02163v1 命中。counterfactual 与 ablation 词频为零的计数在该 v1 全文上复核仍成立;图 3(d) 的「同一检查点执行 vs 忽略压缩调用」对照为本轮新补,用于划清已有对照与本提案所需配对的边界。99.8% 与 97.8% 是由 0.2% 与 2.2% 的遗漏率换算得出,非原文数字。