上下文窗口与 1M 的区别
说明编程智能体的上下文窗口由系统提示、工具定义和对话历史构成,介绍查看占用的方法,并比较默认窗口与超长模式在容量、价格与质量上的差异
上下文窗口是什么
上下文窗口(context window)是模型单次请求能“看到”的全部内容的上限,按 token 计算。对编程 Agent 来说,窗口里装的远不止你的提问:
┌───────────────────────────────┐
│ 系统提示(Claude Code 自身) │ ~1-2 万 token
│ 工具定义(内置 + MCP) │ 数千 ~ 数万 token ⚠️
│ CLAUDE.md / AGENTS.md / 记忆 │ 数百 ~ 数千 token
│ 对话历史(你的每条消息) │
│ 工具调用与结果(读文件、命令输出)│ ← 占大头,持续增长
│ 模型的思考与回复 │
└───────────────────────────────┘
一次任务中 Agent 每读一个文件、每跑一条命令,结果都追加进窗口。窗口是只增不减的,直到触发压缩(compact)——Claude Code 会在接近上限时自动把早期历史总结成摘要,细节随之丢失。
用 /context 查看当前占用
上面的结构不用凭空想象——在 Claude Code 里随时输入 /context,就能看到当前会话的窗口被什么占着、还剩多少:
左边的方块图是整个窗口的可视化(实心 = 已用,空心 = 剩余),右边按类别列出占用:
- System prompt / System tools Code 自身的系统提示和内置工具定义,会话一开始就固定占着;
- Skills——装得越多,开场预算被吃得越多;
- Messages + 工具调用结果,干活时真正持续增长的部分;
- Free space,决定还能跑多久才触发自动 compact。
建议养成习惯:长任务中途、感觉模型“变笨”时、开新任务前,先 /context 看一眼。如果 Messages 占比很高,考虑 /compact 或 /clear;如果还没开始干活开销就不小,该去查查工具爆炸和多余的 MCP/Skills 了。
200K vs 1M
Claude 模型默认 200K token 上下文;Sonnet 4 起提供 1M token 的长上下文模式(约 5 倍)。直观感受 ≈ 15 万英文单词或数千页代码摘录;1M 可以装下一个中型仓库的大部分源码。
但两者的区别不只是“更大”:
| 维度 | 200K(默认) | 1M(长上下文) |
|---|---|---|
| 容量 | 中型任务足够,长任务依赖 compact | 超长会话、大仓库分析、多文档对照 |
| 价格 | 标准价 | 超过 200K 的部分按约 2 倍输入价、1.5 倍输出价计费 |
| 延迟 | 较低 | 上下文越大,首 token 延迟越高 |
| 质量 | — | 并非无代价“迷失在中间”(lost in the middle)、指令遵循变弱的现象 |
| 缓存 | 重要 | 更重要——1M 的前缀全量重建一次非常昂贵(见缓存篇) |
在 Claude Code 中开启 1M
在会话中用 /model 命令,在模型 ID 后加 [1m] 后缀:
/model claude-opus-5[1m]
也可以在启动时指定,或写进配置:
# 启动参数
claude --model claude-opus-5[1m]
# 环境变量
export ANTHROPIC_MODEL='claude-opus-5[1m]'
// .claude/settings.json
{
"model": "claude-opus-5[1m]"
}
支持 1M 的模型都可以用同样的后缀,例如 claude-sonnet-5[1m]。切换后用 /context 查看,窗口上限会显示为 1M,自动压缩的触发点也随之推后。
直接调 API 时开启 1M
如果你在自己的程序里用 Anthropic API,长上下文通过 beta header 开启:
import anthropic
client = anthropic.Anthropic()
resp = client.beta.messages.create(
model="claude-sonnet-4-5",
max_tokens=4096,
betas=["context-1m-2025-08-07"], # 开启 1M 上下文
messages=[{"role": "user", "content": "..."}],
)
大窗口 ≠ 不需要上下文管理
即使开了 1M,这些实践依然成立:
- 能压缩就压缩
/compact主动收拢,或在阶段性任务完成后/clear重开; - 别让工具定义吃掉开场预算(/guide/tool-explosion);
- 让探索发生在子代理里,只把结论带回主窗口;
- 前缀稳定,缓存才有效,缓存策略的收益越大。