Skip to content

perf(context): Tier 1 迷你卡按实测收窄 —— 无来源只留工具名,URL 上限 3→1 - #33

Merged
zhanghanduo merged 5 commits into
mainfrom
perf/mini-card-narrow-by-measurement
Sep 6, 2026
Merged

zhanghanduo merged 5 commits into
mainfrom
perf/mini-card-narrow-by-measurement

Conversation

@zhanghanduo

Copy link
Copy Markdown
Collaborator

为什么

Tier 1 迷你卡(0.8.x 起在 _elided_tool_card)此前对每一条被压缩的工具结果一视同仁:
120 字符的 args 预览 + 最多 3 个来源 URL。在 ApodexHarness 上用 12 个真实长跑研究 trial
(1337 条被压缩结果、约 13.5k 个即将被丢弃的来源 URL)量了它的成本与收益,两处按数据收窄。

URL 上限 3 → 1

留 3 个 留 1 个
URL 总保留率 16.5% 7.8%
每次检索至少留一个来源 99.2% 99.2%

下游唯一消费的量是后者 —— 一次检索有没有留下一个可追溯的出处(引用报告需要的是
出处,不是一次搜索的全部 20 个链接)。那个由第一个 URL 就达成,769/775。多留的两个
URL 每个约 120 字符,买的是一个没有读者的百分比。

无来源的结果只留工具名

1337 条里 435 条(33%)根本没有来源 —— shell 命令、任务板更新、写文件。

卡片存在的前提是「不要重做那些出处还看得见的工作」。没有来源,这个前提就不成立;而且
重复这类调用通常是合法的(它读的状态变了 —— date 两次、编辑后重读文件)。所以它们的
args 不构成决策信息,不值 120 字符的预览。

判据是「正文无 URL args 无 URL」,不是单看正文:

# A source can live in the arguments rather than the body: web_fetch's argument
# IS the url. So "no URL in the body" must not be read as "no source".
if not URL_RE.search(content) and not URL_RE.search(args_preview):
    return f"[Called: {tool_name}]" if tool_name else ""

只读正文会把 web_fetch 唯一的来源剥掉。

Consumer impact

需要「每个论断多个独立来源」的 host 现在应当显式抬高 _MINI_CARD_MAX_URLS
而不是继承 3。其余不变:卡片仍然说明调用、仍然在有来源时带上来源,
placeholder / recovery_footer 契约完全未动。

成本

压缩配置 压缩后 context 卡片成本占比
激进 keep_last_k=5 ~11k/trial 25.0%(约 49.6k tok / 12 trial)
产品实际用的 tiered 150–200k 2–3%

keep5 下成本主体是卡片的条目数(1337 条)而非单条长度;要再降只能限制出卡条目数,
而那会牺牲「引用方可以引用任意时刻采集的来源」。keep5 不是产品配置,故不引入该取舍。

这些数字怎么来的

不是 accuracy 实验 —— 那条路走过了,测不出东西。在 ApodexHarness 的 browsecomp_200
后 40 题上跑过两轮两臂 A/B(同题、同 profile、同凭据):

轮次 压缩配置 基线 带卡片 McNemar
1 tiered(阈值 209,715,实测峰值中位 153k → 卡片几乎没触发) 35.0% 42.5% p=0.453
2 keep_last_k=5(每轮压缩,卡片确实生效) 50.0% 47.5% p=1.000

方向相反、都不显著。原因不是改动无效,而是卡片的收益不在准确率上:它保住的是
来源可追溯性(基线 769/769 条含 URL 的结果压缩后一个 URL 不剩,即 0%),消费者是需要
引用出处的报告合成,而 browsecomp 是 exactMatch 短答案、不需要任何引用。

所以本 PR 的依据全部是机制性量化(URL 覆盖率、成本占比),不引用那两轮 accuracy。

测试

  • 4 条既有断言随行为更新:有来源才谈 args;URL 上限 1;超长与多行 args 改用带来源的调用
    (否则那两条测不到 args 路径)
  • 新增 4 条:无来源只留工具名、来源在 args 里仍出完整卡片、无来源卡片长度不足有来源的
    一半(成本降低是本 PR 的目的,直接断言它)、URL-heavy 正文也只留 1 个
  • pytest tests/ -q1485 passedruff check0 error

zhanghanduo and others added 5 commits September 6, 2026 12:11
在 ApodexHarness 的 12 个真实长跑研究 trial(1337 条被压缩结果、约 13.5k 个
即将被丢弃的来源 URL)上量了卡片的成本与收益,两处按数据收窄。

**URL 上限 3 → 1。** 留 3 个使「URL 总保留率」达到 16.5%,但下游唯一消费的量是
「一次检索有没有留下一个可追溯的来源」—— 那个由第一个 URL 就达成,
769/775 = 99.2%。降到 1 后总保留率 7.8%,而 99.2% 一字未变:多留的两个 URL
每个约 120 字符,买的是一个没有读者的百分比。

**无来源的结果只留工具名。** 1337 条里 435 条(33%)根本没有来源 —— shell 命令、
任务板更新、写文件。卡片存在的前提是「不要重做那些出处还看得见的工作」,
没有来源这个前提就不成立,而且重复这类调用通常是合法的(它读的状态变了)。
那些 args 不构成决策信息,不值 120 字符的预览。

判据是「正文无 URL **且** args 无 URL」,不是单看正文:来源可以在参数里而不在
正文里(web_fetch 的参数本身就是 URL),只读正文会把 web_fetch 唯一的来源剥掉。

**Consumer impact:** 需要「每个论断多个独立来源」的 host 现在应当显式抬高
`_MINI_CARD_MAX_URLS`,而不是继承 3。其余不变:卡片仍然说明调用、仍然在有来源时
带上来源,placeholder / footer 契约完全未动。

该样本上的成本:卡片在 12 个 trial 上共增加约 49.6k tokens,在激进的
`keep_last_k=5` 下占压缩后 context 的 25.0%;而产品实际使用的阈值触发式
`tiered` 路径压缩后 context 在 150–200k,同样的卡片占 2–3%。

Tests: 4 条既有断言随行为更新(有来源才谈 args、URL 上限 1、超长与多行 args
改用带来源的调用),新增 4 条(无来源只留工具名、来源在 args 里仍出完整卡片、
无来源卡片长度不足有来源的一半、URL-heavy 正文也只留 1 个);
`pytest tests/ -q` → 1485 passed;`ruff check` → 0 error。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`46b7b0b3` 修掉了「从截断后的 args 预览判断有无来源」这个缺陷之后,
本条目引用的统计就全部过时了 —— 它们描述的是修复前的行为。

误判影响约 130 张卡片(约 10%):那些调用其实带着来源,只是 URL 落在预览的
120 字符之后。修好之后:

| | 修复前(已过时) | 修复后(现值)|
|---|---|---|
| 被压缩条数 | 1337 | 1295 |
| 仅工具名 | 435 (33%) | 306 (24%) |
| URL 总保留率 | 7.8% | 8.9% |
| 成本占压缩后 context | 25.0% | 27.2% |
| 每次检索至少一个来源 | 99.2% | 99.2% |

**修复前的数字之所以"更便宜",只是因为它在丢弃那些调用真实拥有的出处**,
所以 CHANGELOG 里补了一句说明,避免读者把 25.0% 当成收窄本身的成本基线。
条数 1337→1295 是因为卡片变长后,「卡片不比原文短则保留原文」的兜底判据
接住了更多小 body。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
上一个 commit 只改了 _elided_tool_card 的 docstring,漏了常量上方注释里的
1337→1295 与 7.8%→8.9%。CHANGELOG 第 50 行的 33% / 25.0% 是有意保留的 ——
那里正是在说明修复前的数字为什么看起来更便宜。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@zhanghanduo
zhanghanduo merged commit 2179a1b into main Sep 6, 2026
5 checks passed
@zhanghanduo
zhanghanduo deleted the perf/mini-card-narrow-by-measurement branch September 6, 2026 04:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant