专题篇章 · 拆开一只生产级 Coding Agent

Compaction:85% 阈值与可选 two-pass

核对自动压缩阈值、memory flush、two-pass 和超时预算的真实配置

本页解决的问题

先给结论

「Compaction:85% 阈值与可选 two-pass」要解决的关键问题是什么?

核对自动压缩阈值、memory flush、two-pass 和超时预算的真实配置

判断标准

让这个结论先证明自己值得留下。 把这一页当成决策工具,而不是需要背下来的定义。把概念连到一个真实任务、一个可观察结果,以及一个能改变你判断的失败上。

下一步

写下一个问题:试完这个方法后,你能用什么证据回答它?

常见误区

结论听起来很完整,却没有检查最关键的假设。

课程目标
记住 CompactionPolicy 的五个真实字段与默认值,并能追到 Agent::should_auto_compactxai-token-estimation 的阈值判断。
核心视觉 · 自动压缩阈值
0% · 可用空间充足100% · 上下文上限

used × 100 >= context_window × threshold_percent。比较使用饱和乘法,context window 为 0 时返回 false。

CompactionPolicy 默认值
auto_compact_threshold_percent: u3285

自动压缩阈值百分比。

compact_model: Option<String>None

未指定时使用当前 Session 模型。

memory_flush_enabled: boolfalse

启用后,压缩前才运行 memory flush turn。

wall_clock_budget_secs: u64300

单次压缩的墙钟预算,单位秒。

two_pass_enabled: boolfalse

由配置解析后写入;默认走 single-pass 路径。

Two-pass 何时成立
PASS 1 · PREFIRE

预先摘要历史前缀

仅在 two_pass_enabled 为 true 时,接近阈值可投机地在后台总结历史前缀,得到 NOTE₁。

PASS 2 · COMPACT

总结 NOTE₁ 与近期尾部

正式压缩时把 NOTE₁ 与 recent tail 组合后再次总结。配置为 false 时保留原有 single-pass 路径。

真实源码证据
crates/codegen/xai-grok-agent/src/compaction.rs
impl Default for CompactionPolicy {
  fn default() -> Self {
    Self {
      auto_compact_threshold_percent: 85,
      compact_model: None,
      memory_flush_enabled: false,
      wall_clock_budget_secs: 300,
      two_pass_enabled: false,
    }
  }
}
crates/codegen/xai-token-estimation/src/lib.rs
pub fn exceeds_threshold(
  used: u64,
  context_window: u64,
  threshold_percent: u8,
) -> bool {
  if context_window == 0 { return false; }
  used.saturating_mul(100) >=
    context_window.saturating_mul(
      threshold_percent as u64
    )
}
调用位置:Agent::should_auto_compact 接收 total_tokensNonZeroU64 context_window,再调用 xai_token_estimation::exceeds_threshold。策略结构体本身没有虚构的 should_compact(&self, usage: f64) 方法。
源码快照说明:本页依据本地同步副本核对。该副本没有 .git 元数据,因此不声称对应某个 commit 版本。
课堂练习

手算边界

context window 为 100,000,阈值 85。判断 84,999、85,000、90,000 tokens 是否触发。再说明开启 two_pass_enabled 会改变压缩路径,但不会把默认值改成 true。

Takeaway:默认阈值是 85,wall clock 是 300 秒,memory flush 与 two-pass 均为 false。Two-pass 是显式配置能力,自动触发判断落在 Agent 与 token estimation 中。

「核心视觉 · 自动压缩阈值」如何改变一次回答

「used × 100 >= context_window × threshold_percent 。比较使用饱和乘法,context window 为 0 时返回 false」说明,模型处理的不是我们眼中的“字数”,而是一段段 Token。Token 的切分方式会影响输入长度、上下文能放下多少内容,以及一次请求要花多少计算。

长度、信息量和上下文不是一回事

当「仅在 two_pass_enabled 为 true 时,接近阈值可投机地在后台总结历史前缀,得到 NOTE₁」变长时,先要分清三件事:文字被切成多少 Token、哪些内容真正参与当前判断、以及旧内容是否已经超出上下文窗口。删掉重复说明通常比单纯把窗口开得更大更有效。

先保留会改变判断的内容

可以用「context window 为 100,000,阈值 85。判断 84,999、85,000、90,000 tokens 是否触发。再说明开启 two_pass_enabled 会改变压缩路径,但不会把默认值改成 true」做一次对照:保留同样的问题,分别删掉重复背景、压缩格式和移除无关历史,比较答案质量、延迟与 Token 数量。

从「核心视觉 · 自动压缩阈值」走到「CompactionPolicy 默认值」

「核心视觉 · 自动压缩阈值」先把问题落在「used × 100 >= context_window × threshold_percent 。比较使用饱和乘法,context window 为 0 时返回 false」上;到了「CompactionPolicy 默认值」,讨论继续推进到「启用后,压缩前才运行 memory flush turn」。两段连起来,重点就不只是记住一个结论,而是看清它成立所依赖的条件。

把这条判断带到下一个场景

处理长文本时,先保留会改变结论的内容,再决定如何压缩格式和历史;上下文更长只有在新增信息真正有用时才值得付出代价。

  • 「核心视觉 · 自动压缩阈值」:used × 100 >= context_window × threshold_percent 。比较使用饱和乘法,context window 为 0 时返回 false
  • 「CompactionPolicy 默认值」:启用后,压缩前才运行 memory flush turn
  • 「手算边界」:context window 为 100,000,阈值 85。判断 84,999、85,000、90,000 tokens 是否触发。再说明开启 two_pass_enabled 会改变压缩路径,但不会把默认值改成 true

最后的「手算边界」把讨论落到「context window 为 100,000,阈值 85。判断 84,999、85,000、90,000 tokens 是否触发。再说明开启 two_pass_enabled 会改变压缩路径,但不会把默认值改成 true」。回看这条线索时,最值得保留的是:当输入、规模或风险改变,哪些判断需要重新做一遍。

标记为已学完 阅读进度会自动记录
← 上一篇下一篇 →

继续阅读

同一条线上的下一篇。

文章讨论

读到这里,留下一个判断。

把刚想明白的地方、还没想通的问题,留给下一位一起学习的人。

正在讨论 Compaction:85% 阈值与可选 two-pass 拆开一只生产级 Coding Agent
3条讨论文章讨论 · 与共学社区同步
在共学社区查看
AM
Asha Morgan内容编辑
观点实践记录

我把这篇文章里的一个判断改写成了今天可以验证的小实验。比记住结论更有用的是,知道下一步要观察什么。

文章讨论7 有帮助
LH
Lin Harper独立开发者
观点观点

读完以后我先回头找它成立的条件,而不是直接把方法搬进项目。这个顺序让后面的取舍清楚很多。

文章讨论5 有帮助
KM
Kiki Moore产品运营
问题问题

如果把这个判断放到真实工作里,最先需要补的约束是什么?我想知道从阅读到第一次实践之间,哪一步最值得先做。

文章讨论4 有帮助