CONTEXT COST STUDY · 2026.09.10 · FROZEN BENCHMARK
在这五个固定任务中,新模式的 API 费用估值高 22.2%,总 Token 多 19.5%;60 次正式运行全部通过相同验收。
费用差异的 95% 区间为 +11.2%~+33.9%。这轮没有观察到节省,但也没有发生自然跨窗口,因此不能据此判断上下文耗尽后的压缩与恢复收益。
旧模式 = 关闭 features.context_management.experimental_mode;新模式 = 开启同一个开关。下文的美元都是按 API Standard 价格计算的估值,不是订阅账单,也不是额度消耗百分比。
| 先读这三点 | 本轮证据 |
|---|---|
| 平均更贵 | 旧模式 30 次合计 $10.774530;新模式 30 次合计 $13.169534 |
| 统一缓存计价后,方向仍相同 | 两边都假设 90% 缓存命中率,新模式仍高 13.6%,95% 区间 +5.0%~+22.9% |
| 结论有清楚的边界 | 五个合成任务、每类六对、同一模型配置;不代表所有任务,不覆盖跨窗口长任务 |
结论在前 · 完整波动保留 · 方法与复现在后
每一对使用相同的需求、初始文件和验收标准,让两种模式从头自然完成任务。每类任务固定跑六对,不按中途结果增减样本。
| 任务 | 旧模式均费 | 新模式均费 | 费用变化 | Token 变化 | 验收:旧 / 新 |
|---|---|---|---|---|---|
| 实现记账功能 | $0.3742 | $0.4457 | +19.1% | +25.5% | 6/6 · 6/6 |
| 修复报价缺陷 | $0.2835 | $0.3399 | +19.9% | +11.5% | 6/6 · 6/6 |
| 重构日志统计 | $0.4391 | $0.5277 | +20.2% | +17.6% | 6/6 · 6/6 |
| 代码审查 | $0.3172 | $0.3732 | +17.6% | +10.0% | 6/6 · 6/6 |
| 工单数据分析 | $0.3818 | $0.5084 | +33.2% | +31.2% | 6/6 · 6/6 |
均费 = 每模式六次运行的平均费用估值。类别结果为描述性统计,不把每一行都当成已单独证实的普遍规律。
通过同样的验收,说明这轮比较没有拿明显未完成的结果换取更低费用;它不意味着代码质量、可维护性或审查深度在所有维度都相等。
输入 Token 的单价并不相同。本文分别计算普通输入、缓存命中、缓存写入和输出,避免直接用总 Token 推断费用。
然后保留每次运行实际产生的输入与输出数量,把两边假设为相同缓存命中率,重新计价。
| 计价方式 | 新模式相对旧模式 | 95% 区间 |
|---|---|---|
| 实际记录的缓存命中 · 主指标 | +22.2% | +11.2%~+33.9% |
| 两边统一 0% 命中率 | +17.9% | +10.3%~+25.8% |
| 两边统一 50% 命中率 | +16.7% | +8.8%~+24.9% |
| 两边统一 90% 命中率 · 主要敏感性分析 | +13.6% | +5.0%~+22.9% |
| 两边统一 100% 命中率 | +11.7% | +2.5%~+21.7% |
这一步说明,按相同缓存比例重新计价时,费用差异的方向依然存在。 它没有重跑模型,也没有实际控制服务端缓存;不能把 22.2% 与 13.6% 的差额直接解释成“缓存造成的因果影响”。
展开:价格、计算公式与分项明细
冻结的计价规则如下,每百万 Token 计价。价格来源:GPT-6 Astra 官方模型文档,在测量前核对。
| 类别 | 每百万 Token |
|---|---|
| 普通输入 | $10.00 |
| 缓存命中 | $1.00 |
| 缓存写入 | $12.50 |
| 输出 | $50.00 |
ordinary = input - cached - cache_write
cost = (ordinary × 10
+ cached × 1
+ cache_write × 12.5
+ output × 50) / 1,000,000
单响应输入超过 272K 时,输入及缓存各项乘 2,输出乘 1.5。推理输出已包含在输出中,不再重复相加。本轮缓存写入为 0。统一缓存比例的敏感性分析同样假设写入为 0,并保留每个请求对应的长上下文倍率。
| 任务 | 模式 | 缓存命中率 | 普通输入费 | 命中费 | 写入费 | 输出费 |
|---|---|---|---|---|---|---|
| 记账实现 | old | 75.7% | $0.15309 | $0.04772 | $0.00000 | $0.17337 |
| 记账实现 | new | 76.0% | $0.19130 | $0.06046 | $0.00000 | $0.19398 |
| 报价修复 | old | 83.2% | $0.11547 | $0.05730 | $0.00000 | $0.11073 |
| 报价修复 | new | 77.6% | $0.17235 | $0.05986 | $0.00000 | $0.10770 |
| 日志重构 | old | 82.5% | $0.16617 | $0.07846 | $0.00000 | $0.19444 |
| 日志重构 | new | 78.9% | $0.23665 | $0.08870 | $0.00000 | $0.20232 |
| 代码审查 | old | 79.3% | $0.15220 | $0.05835 | $0.00000 | $0.10669 |
| 代码审查 | new | 75.1% | $0.20161 | $0.06091 | $0.00000 | $0.11064 |
| 数据分析 | old | 84.9% | $0.13090 | $0.07379 | $0.00000 | $0.17707 |
| 数据分析 | new | 81.6% | $0.21040 | $0.09355 | $0.00000 | $0.20448 |
上表费用是每次任务的平均值。完整精度见 summary.json,逐响应用量见 records.json。
30 对中,新模式更贵 23 对,更便宜 7 对。这也是需要重复、配对和平衡执行顺序的原因:单次运行不足以代表稳定结果。
图中保留了最极端的正负结果。正式样本没有因费用高、缓存差或不符合预期而被筛掉。
展开:全部 30 对结果
| 配对 | 任务 | 先执行 | 旧费用 | 新费用 | 变化 |
|---|---|---|---|---|---|
| p01 | 记账实现 | new | $0.35359 | $0.42865 | +21.2% |
| p02 | 报价修复 | old | $0.32727 | $0.32638 | -0.3% |
| p03 | 记账实现 | new | $0.30804 | $0.62051 | +101.4% |
| p04 | 日志重构 | old | $0.41725 | $0.60507 | +45.0% |
| p05 | 报价修复 | new | $0.31521 | $0.36303 | +15.2% |
| p06 | 数据分析 | new | $0.34976 | $0.44290 | +26.6% |
| p07 | 日志重构 | old | $0.38576 | $0.60079 | +55.7% |
| p08 | 数据分析 | old | $0.38011 | $0.48921 | +28.7% |
| p09 | 代码审查 | new | $0.37705 | $0.35556 | -5.7% |
| p10 | 数据分析 | new | $0.34177 | $0.52266 | +52.9% |
| p11 | 日志重构 | new | $0.38186 | $0.51123 | +33.9% |
| p12 | 报价修复 | new | $0.24304 | $0.31350 | +29.0% |
| p13 | 记账实现 | old | $0.28163 | $0.43215 | +53.4% |
| p14 | 记账实现 | old | $0.52546 | $0.41018 | -21.9% |
| p15 | 代码审查 | new | $0.31467 | $0.39426 | +25.3% |
| p16 | 日志重构 | new | $0.62726 | $0.47037 | -25.0% |
| p17 | 报价修复 | old | $0.29360 | $0.33658 | +14.6% |
| p18 | 报价修复 | new | $0.29141 | $0.34457 | +18.2% |
| p19 | 数据分析 | new | $0.39602 | $0.58443 | +47.6% |
| p20 | 代码审查 | old | $0.23476 | $0.38360 | +63.4% |
| p21 | 日志重构 | new | $0.45997 | $0.55510 | +20.7% |
| p22 | 代码审查 | old | $0.27003 | $0.37513 | +38.9% |
| p23 | 代码审查 | new | $0.41210 | $0.32885 | -20.2% |
| p24 | 数据分析 | old | $0.34736 | $0.55517 | +59.8% |
| p25 | 记账实现 | old | $0.48561 | $0.38610 | -20.5% |
| p26 | 报价修复 | old | $0.23049 | $0.35543 | +54.2% |
| p27 | 日志重构 | old | $0.36234 | $0.42348 | +16.9% |
| p28 | 数据分析 | old | $0.47555 | $0.45624 | -4.1% |
| p29 | 代码审查 | old | $0.29484 | $0.40155 | +36.2% |
| p30 | 记账实现 | new | $0.29073 | $0.39686 | +36.5% |
下载:pairs.csv。old / new 表示这一对中谁先执行;所有费用均含完成任务过程中的全部已记录模型响应。
本轮新增 Token 的 98.6% 来自输入。新模式首次请求就多约 1,961 个输入 Token,而全部任务都未发生自然跨窗口。 这支持“额外上下文开销”的解释,但还没有逐组件的因果归因。
这是正式运行结束后对已有记录的描述性拆解,不是预先注册的主指标,也没有追加模型实验。以下只统计 records.json 中 selected = true 的 60 次正式运行。
| 用量分项 | 旧模式 · 30 次 | 新模式 · 30 次 | 增量 |
|---|---|---|---|
| 输入 Token(含缓存命中) | 2,324,457 | 2,788,256 | +463,799 |
| 输出 Token(已含推理输出) | 91,476 | 98,295 | +6,819 |
| 总 Token | 2,415,933 | 2,886,551 | +470,618 |
| 模型响应次数 | 176 | 182 | +6 |
| 首次请求的平均输入 Token | 10,886.6 | 12,847.7 | +1,961.1 |
已经直接测到的现象。 30 对首次请求的输入差值全部落在 1,955–1,969 Token,启动差异很稳定。整个任务过程中,平均每次响应的输入从 13,207 增至 15,320 Token(约 +16.0%);响应次数增加约 3.4%。因此,总量上涨主要体现在模型收到的输入,而不是生成的输出。这里的“输入”包括请求携带的上下文,不只指用户新写的需求。
源码支持的机制解释。 在核对的 Codex 实现 中,实验模式满足启用条件时会开启 Token 预算管理、历史/笔记扩展,并解析模型提供的上下文管理指导。这与首次请求中稳定出现的额外输入相吻合;这些上下文在后续请求继续携带时,也继续计入输入用量。源码用于解释机制,不等于已对测量二进制、服务端行为和每段输入完成逐一归因。
本轮没有覆盖的收益。 全部 60 次运行的自然跨窗口次数为 0。实验因此测到了日常额外开销,却没有测到窗口耗尽后历史整理与恢复可能带来的收益,不能据此推出跨窗口长任务也一定更贵。
缓存会影响费用,但不消除 Token 计数。 按合计输入加权,旧模式缓存命中比例为 81.5%,新模式为 78.2%;缓存 Token 仍计入输入总量,只是单价更低。缓存构成变化与费用增长更明显有关,但不是全部解释:上文统一缓存比例后的费用差异仍为正。不能把重计价前后的差额当成缓存的已识别因果效应。
归因边界。 98.6% 是“新增 Token 中输入所占的比例”,不是“98.6% 已证明由某段管理提示造成”。本轮没有分别移除管理指导、工具定义或其他组件,也没有固定两种模式的执行轨迹。因而不能精确拆出各组件贡献,不能把约 1,961 Token 简单乘以响应次数当成已测得的独立因果成本,也不能断言额外响应必然由模式引起。
展开:用已发布记录复算这项拆解
在下载 Gist 的目录运行以下 Python 3 代码,无第三方依赖,不会调用模型:
import json
from statistics import mean
runs = [r for r in json.load(open("records.json"))["runs"] if r["selected"]]
for mode in ("old", "new"):
selected = [r for r in runs if r["mode"] == mode]
counts = {key: sum(r["usage"][key] for r in selected)
for key in ("input_tokens", "output_tokens", "total_tokens",
"cached_input_tokens")}
counts["responses"] = sum(len(r["responses"]) for r in selected)
counts["first_input_mean"] = mean(
r["responses"][0]["usage"]["input_tokens"] for r in selected)
print(mode, counts)
pairs = {p: {r["mode"]: r for r in runs if r["pair_id"] == p}
for p in {r["pair_id"] for r in runs}}
deltas = [p["new"]["responses"][0]["usage"]["input_tokens"]
- p["old"]["responses"][0]["usage"]["input_tokens"]
for p in pairs.values()]
print("paired first-input difference:", mean(deltas), min(deltas), max(deltas))| 控制项 | 本轮做法 |
|---|---|
| 模型与配置 | gpt-6-astra / low / default;CLI 0.153.4 |
| 输入 | 每对的需求和初始文件完全相同,用 SHA-256 验证 |
| 改变的变量 | 配对配置只改变实验性上下文管理开关;开关带来的提示与工具差异属于模式本身 |
| 会话隔离 | 每次使用全新工作目录与本地配置;共同关闭跨会话记忆、插件、子代理、宿主技能发现和 shell 快照 |
| 执行顺序 | 每类恰好三对旧先跑、三对新先跑;任务间打乱;全程串行 |
| 样本量 | 预先固定五类 × 六对 = 30 对 / 60 次,不按费用提前停止 |
| 自然过程 | 不强制压缩,不降低上下文阈值,不要求预写记忆或安排人为阶段 |
| 完成标准 | 原始外部验收;最多两次修复反馈,费用全部保留;本轮实际反馈 0 次 |
| 任务 | 用户可见的完成结果 | 每次固定检查 |
|---|---|---|
| 记账功能 | JSONL 记账 CLI 按规则输出余额和错误 | 57 |
| 报价修复 | 布尔数量、折扣边界、税额舍入等行为正确 | 93 |
| 日志重构 | CLI 行为不变,验证与统计移入领域模块 | 69 |
| 代码审查 | 三个真实缺陷及可执行复现,对比正确参考实现 | 6 |
| 数据分析 | 可复用脚本生成报告,并通过三个未直接展示的数据集 | 11 |
验收脚本放在模型工作目录之外,但没有把这一点夸大为不可访问的远程盲测。另对审查解释、重构职责和数据报告做了 36 份补充人工式检查,由本助手完成,不是独立人类盲审。自动验收不依据新旧模式改变规则。
主指标是整个固定任务集合的新旧平均费用之比:
change = (sum(new_cost) / sum(old_cost) - 1) × 100%
两边各 30 次,因此也等于平均任务费用之比;不是把 30 个百分比直接取平均。
95% 区间采用预先规定的分层配对 bootstrap:每类内部对六个完整配对有放回抽样,合并后重算比值,共 20,000 次,随机种子 81723。任务顺序种子为 202609100814。这些区间反映五个固定任务的运行波动,不能推广成所有真实世界任务的置信区间。
展开:失败、重跑与全部资源消耗
正式批次中有一次 responseStreamDisconnected。按照运行前冻结的规则,整对第一次尝试作废,两边都从干净状态重跑;没有只重跑较贵或失败的一边。被排除的两次尝试保留在公开数据中,主比较使用第二次完整配对。连接中断的具体原因未确定。
更早的准备批次发现需求文档仍引用已从工作目录移走的 acceptance.py。为避免额外找文件的工作污染结果,12 次准备运行整批排除,移除过时交付段落后,完整重启全部 30 对。没有按费用挑选保留结果。
| 用途 | 次数 | Token | API 估值 |
|---|---|---|---|
| 正式配对样本 | 60 | 5,302,484 | $23.944064 |
| 中断导致的整对作废尝试 | 2 | 126,738 | $0.661092 |
| 整批排除的准备运行 | 12 | 980,701 | $4.438194 |
| 模型可用性预检 | 1 | 13,231 | $0.132510 |
| 登记范围内合计 | 75 | 6,423,154 | $29.175860 |
只统计登记的实验及准备调用,不包括调研对话或账户其他任务。正式与中断尝试公开逐响应用量;更早准备与预检公开汇总。见 resources.json 和 invalid_attempts.csv。
离线数值复算和保存产物的重新验收都可以直接运行。 重新调用模型需要自己的可用 Codex 环境,且不能保证相同输出或费用。
下载本 Gist 的所有文件,或使用 Git:
git clone https://gist.github.com/855b99ba8753ea0fd8d77d20dbfe64d7.git context-cost-study
cd context-cost-study
# Python 3.11+,只用标准库
python3 reproduce.py verify这个命令会核对冻结源文件、任务输入、保存产物、所有正式及中断尝试的逐响应计价与累计 Token,重新计算六组指标的 bootstrap 区间,并与公开表格比较。
selected_pairs: 30
accepted_runs: 60
all_attempts_accounted: 62
responses_verified: 367
natural_context_transitions: 0
passed: true
结果写入 recomputed.json。复算不需要登录、API Key、模型调用或第三方 Python 包。
python3 reproduce.py recheck脚本在临时目录中恢复原始验收程序与 60 份正式产物,通过真实 CLI 重新检查,并逐次打印结果。发布前已实际跑通 60/60。
想阅读完整原始任务、代码和数据:
python3 reproduce.py unpack ../context-cost-evidenceexperiment.json 保存运行前冻结的 36 个文件原文及哈希;deliverables.json 以内容哈希去重保存全部尝试的工作文件。公开包只移除了会话身份、个人路径和消息元数据,保留用量、结果与产物。认证文件、私有模型指令和模型目录内容不在公开包中。
python3 -m venv .venv
.venv/bin/pip install matplotlib==3.11.1
.venv/bin/python render_figures.py四张 SVG 从公开 JSON / CSV 自动生成,图内文字全部为英文;PNG 预览输出到 previews/。字体已转成 SVG 路径,阅读时不依赖外部字体服务。
D. 再做一轮实时模型实验 · 需要自己的环境,会消耗用量
准备命令本身不会调用模型:
python3 reproduce.py prepare-live ../context-cost-replay \
--codex /path/to/codex \
--catalog /path/to/your/model-catalog.json--codex 必须指向名为 codex 的实际可执行文件;--catalog 是你自己的兼容模型目录 JSON。本轮目录含私有模型材料,因此没有随 Gist 发布。严格复现本地依赖需要它与公开指纹一致。若你没有原快照,不能声称环境逐字节相同。
默认拒绝 CLI 或模型目录指纹不一致。若明确要做不同环境下的方法复验,可添加 --allow-environment-drift;差异会写入 replication-environment.json,不能与本轮视为同一冻结环境。
准备完成、检查源代码后,再明确启动:
# 这一条才会调用模型:60 次运行,另有最多三次整对基础设施尝试
python3 ../context-cost-replay/start.py
# 完成固定样本后,生成该轮自己的结果
python3 ../context-cost-replay/analyze.py原始 runner 使用现有的 ~/.codex/auth.json 登录;本 Gist 不提供、上传或复制凭据。新一轮需要你自己的模型权限。服务端权重、采样随机性与共享缓存无法由客户端冻结,即使本地依赖一致,也不承诺相同模型输出或费用。
如果关心的是这些能在单个上下文窗口内自然完成的任务是否更省,本轮证据支持:开启新模式没有带来成本节省,平均费用更高。
如果关心的是长任务耗尽窗口后,压缩、恢复、历史信息保留是否更好,本轮没有触及那个条件,因此没有给出答案。这里不通过人为强制切换窗口来补造结论。
五个任务都是合成的 Python CLI 工作,覆盖四个业务领域,需求以英文提供。重复执行增加了对这些任务运行波动的了解,并没有把五个任务变成随机抽取的大规模真实世界基准。
文件索引与审计记录
| 文件 | 内容 |
|---|---|
| reproduce.py | 离线复算、产物验收、文件恢复与新实验准备入口 |
| experiment.json | 冻结任务、验收程序、runner、顺序、配置与环境指纹 |
| records.json | 62 次正式/作废尝试、367 个响应的用量与结果 |
| deliverables.json | 按内容哈希去重保存的工作文件 |
| pairs.csv | 全部 30 对主比较数据 |
| summary.json / effects.json | 类别汇总与全部统计区间 |
| audit.csv / manual-audit.json | 自动验收与补充检查记录 |
| verification.json | 原始完整本地副本的独立目录复算记录 |
| PUBLICATION-CHECKS.json | 公开材料的复算与重新验收结果 |
| resources.json | 准备、正式与重跑的资源账 |
| render_figures.py | 本文四张图的生成代码 |
| analyze_live.py | 新一轮实时实验使用的数值分析器 |
原冻结文件清单 SHA-256:
31d1cbce3b3df5cc4865a3e0eb0f9258390df4a1336da79d031a63be4e9fe785
统计与图表由保存的响应计数生成,不由模型凭感觉打分。公开计数并不等于提供了服务端签名证明;模式与输入一致性的审计依赖保存的客户端证据。原始完整记录已在不含认证和运行时目录的独立副本中复算,主要输出逐字节相同;公开版经过元数据删减后,另行通过了数值与产物验收。
MEASURE WHAT HAPPENED. KEEP THE LIMITS VISIBLE.
跑得快不一定赢,老跌跟头才是成功 —— DentonShaw