面试 · 2026年3月20日 0

面试勘误-Claude Opus 4.6:1M 长上下文实现逻辑与自动压缩原理

最近面试,遇到了一位和我讨论opus模型上下文原理的朋友(面试官)。基于讨论的内容。我补充一下相关知识和自己的思考。因为opus是闭源大模型,很多情况其实大家都不太清楚。这里也勘误几个面试官说错的问题。

问题1:长上下文实现的原理是什么?

  1. 上下文窗口变大(能装下):Opus 4.6 把一次请求里模型可参考的“工作内存”扩展到 1M tokens。这解决的是“历史塞不进去”的问题。
  2. 长上下文可用性提升(用得准):即便能塞下,大模型在超长上下文里仍会出现 context rot(召回/注意力变差)。因此模型本身需要在长上下文检索与保持方面做得更稳,才能真正“用得准”。官方发布里强调了长上下文 retrieval/保持能力的提升。
  3. 逼近上限时的上下文管理(可持续):当对话越来越长,平台会启用 server-side compaction(上下文压缩/摘要替换),把更早的内容摘要化后替换掉,让长任务继续进行。

问题2:上下文压缩是模型自主进行,还是代码调用 agent 进行?

更精确的答案是:触发与替换由平台/API完成;摘要内容由模型生成。

  • 从官方 compaction 文档描述来看:当输入 token 接近触发阈值时,API/服务器检测到条件并启动 compaction 流程,生成 compaction 块(摘要),并在后续请求中自动丢弃阈值之前的消息,只从摘要继续。
  • 你在代码里通常做的只有:开启 compaction(beta header + context_management.edits 配置),以及把本轮返回的 messages(含 compaction 块)追加到下一轮。

所以它不是“需要你在 agent 里自己手动总结、再把摘要喂回模型”的那种纯应用层方案;但也不是“模型在完全无感知的平台下自己随便压缩”。更像是 平台提供的自动化上下文管理能力 + 模型负责写摘要。

Claude Opus 4.6(claude-opus-4-6)把上下文窗口扩展到 1M tokens,并且在长对话/长任务场景里通过 长上下文检索能力服务器端上下文压缩(compaction)来解决“能塞进去但用不准/用不起”的问题。你可以把它理解为:更大的“工作内存上限” + 更聪明的“持续工作方式”,让模型在代码库、合同/诉讼材料、长链路 Agent 任务中保持连贯。

官方来源:1M context GA 公告与 Opus 4.6 发布说明、以及 compaction / context windows 文档(文末列出)。


1. 为什么 1M context 不只是“窗口变大”

在 LLM 里,“上下文窗口”指模型在一次生成时可参考的全部文本(包括历史对话等)。窗口变大带来两个直接后果:

  1. 成本与延迟增长:token 越多,计算与吞吐压力越大
  2. 长上下文退化(context rot):即便能看到全部历史,模型对“该回忆的细节”的召回质量仍可能随长度下降

Anthropic 的工程文章把这类现象归因到注意力与训练分布带来的“有效注意力预算消耗”,因此需要做 context engineering:不是“把越多放进去越好”,而是“把最有信息密度的内容放进去,并在需要时压缩/替换”。


2. Opus 4.6 的长上下文能力:你真正得到什么

从官方发布信息看,Opus 4.6 的 1M 上下文价值主要体现在三点:

  1. 支持 1M tokens 上下文窗口(1M context window):比以往更大的历史可以直接纳入同一次会话工作内存
  2. 长上下文检索/保持能力更强:发布说明强调其在长上下文 retrieval 基准上表现提升(例如 MRCR v2 的 1M 变体,Opus 4.6 给到 76%,显著高于其前代/同级对比)
  3. 更适配长任务(agentic / long-running):配合工具调用与长链路任务,在不反复清空上下文的前提下持续推进

此外,1M context GA 公告里还提到一些可落地的“工程维度”:

  • 标准计费适用于整个 1M 窗口(没有长上下文额外倍率)
  • 媒体输入上限提升(最多 600 张图片或 PDF 页)

3. 关键原理:在逼近上限时自动“摘要替换”(Compaction)

如果说 1M context window 是“存储上限”,那么 compaction 就是“让长会话可持续运行的机制”。

在 compaction(服务器端上下文压缩)启用后,机制按文档描述大致是:

  1. 当会话接近你配置的 token 阈值时,模型会继续输出回复,同时生成一个 compaction(摘要)
  2. 随后的请求会自动把 compaction 块之前的消息块丢弃,从摘要处继续对话

直观理解:系统把“旧的、很长的对话细节”压成“短摘要”,保留关键状态、待办、关键决策等,避免到顶后不得不清空。

3.1 触发与参数(你可以直接在 API 里控制)

Compaction 文档给出的关键参数包括:

  • trigger:触发压缩的条件(示例里常见为基于 input_tokens 的阈值,默认文档示例约在 150,000 tokens,且要求至少 50,000 tokens)
  • instructions:自定义摘要指令(可完全替换默认摘要提示)
  • pause_after_compaction:是否在压缩后暂停(默认 false

4. API 实战:如何在 Opus 4.6 上启用 compaction

下面以 Python 为例(字段名与文档一致),启用 compaction 并让它在接近阈值时自动压缩历史:

import anthropic

client = anthropic.Anthropic()

messages = [{"role": "user", "content": "Help me build a website"}]

response = client.beta.messages.create(
    betas=["compact-2026-01-12"],
    model="claude-opus-4-6",
    max_tokens=4096,
    messages=messages,
    context_management={
        "edits": [
            {
                "type": "compact_20260112"
                # 也可以在这里加入 trigger / instructions 等配置
            }
        ]
    },
)

# 把本轮输出(包含 compaction 块)追加到 messages,便于后续继续
messages.append({"role": "assistant", "content": response.content})

工程建议是:把 compaction 当作“长任务的安全绳”,而不是替代你自己的信息组织。最理想的上下文工程仍是:只把高价值内容喂进去,其他用检索/工具在需要时按需拉取。


5. 更进一步的工程策略:让 1M 变成“有效 1M”

即便有 1M 窗口和 compaction,要让长任务更稳,通常还要结合 Anthropic 的 context engineering 思路:

  1. 把上下文当作有限注意力预算:追求“高信息密度”,避免把大量低相关内容堆进来
  2. 使用 just-in-time 的上下文加载:通过工具/检索在运行时拉取相关片段,而不是一次性塞满
  3. 为摘要留好结构:compaction 的摘要会成为后续续写的“新起点”,因此要确保摘要能覆盖状态、下一步、关键决策(必要时用 instructions 定制摘要风格)

其他问题:

  1. Compaction 触发条件/阈值机制?可配置吗?
    到达预设的 trigger 阈值(通常基于 input_tokens)会触发。它是可配置的:文档示例里默认/常见是约 150,000 tokens,且 trigger 需至少 50,000
  2. Compaction 后会丢弃哪些内容?保留哪些内容?
    后续请求会自动丢弃 compaction 块之前的消息块,只从 compaction 块里的摘要(summary)继续。保留的关键是“摘要里被写下来的状态/要点/下一步”等。
  3. 如何避免关键细节被压缩掉?
    instructions 自定义摘要提示,要求摘要“必须保留”的粒度(例如代码片段、变量名、关键决策、待办、未解决问题)。另外做“上下文工程”:把最重要的信息用更高信息密度/结构化方式组织,降低被概括遗漏的概率。
  4. context rot 的具体表现是什么?1M 是否彻底消除?
    随 token 增加,模型对该回忆的细节召回准确率下降,以及长距离推理可能变得不稳定(这就是 context rot)。1M 只是缓解/提升上限与检索能力,并不等于消除所有退化,所以仍需要控制上下文质量。
  5. 上下文压缩是模型自主还是 agent 代码做的?
    触发与“把旧历史替换成摘要并接续”的流程是平台/API 的 server-side 机制。摘要文本本身由模型生成,但你在代码侧主要是开启 compaction(beta header / context_management 配置)并把返回的内容继续追加到后续 messages。
  6. Compaction 和工具调用(tool use)/长链路 agent 的关系?一致性会受影响吗?
    对长任务而言,compaction 的目标是保持“足够的连续性”,用摘要承接状态以继续跑下去。风险在于:若摘要没有覆盖到你后续真正需要的细节,结果就可能偏;因此通常要保证摘要指令包含关键状态,并把“需要复核的证据”用检索/再次拉取补齐。
  7. 1M tokens 的性能/成本/延迟怎么权衡?什么时候用 1M、什么时候用检索?
    成本主要随实际 token 计费;Opus 4.6 的 1M window 官方提到是不额外加长上下文溢价(标准单价覆盖整窗),但输入越长通常也会带来更高延迟与吞吐压力。用 1M:需要跨超大材料做整体依赖推理(大代码库/长合同);用检索:当只需“相关子集”时,避免噪声与 context rot。
  8. 什么时候用 compaction,而不是用 context editing(清空 tool/thinking 等)?
    当你“经常接近上下文上限、长会话需要持续不中断”时,用 compaction 更合适(它是系统性续航)。当你只是想节省 token、清理局部冗余(例如旧 tool result、thinking block)但还能保持原细节可用时,用 context editing 更精细、更轻量。

结论:

claude opus4.6的1m上下文,其实也是语义压缩实现的,而不是模型本身具备这么长的上下文。而且上下文压缩也不是模型自动实现压缩,而且需要代码调用实现。不是模型原生能力。

你这段说法里有两点需要“拆开看”,我按更精确的口径再回答一次:

结论先说

  1. Opus 的 1M 上下文本质上不是“语义压缩出来的”1M context window 指的是:在一次请求里模型可读取的工作内存上限确实扩展到约 1M tokens(这是“容量”能力)。
  2. 上下文压缩/语义压缩对应的是 Compaction(server-side compaction):它才是在“到顶前把旧内容变成摘要,再用摘要续跑”。而且它不是你想的“模型原生一定会替你压缩到不需要任何额外动作”。

1) “1M 上下文是不是语义压缩实现?”

不是。1M context window 是直接把上下文“能放进去”的上限拉到 1M tokens。
语义压缩对应的是 compaction 这类“到阈值后替换旧历史”的机制,不是用来凭空把 200k 变成 1M 的那种“压缩等价”。

2) “上下文压缩不是模型自动实现,而需要代码调用?”

更准确地说是:

  • 触发时机、摘要块写入、以及丢弃旧消息并从摘要继续:这是平台/API 的“server-side compaction”机制(你不启用/不配置,它不会凭空发生)。
  • 摘要文本内容(总结):摘要本身是由模型生成的,但“生成后怎么替换历史、后续怎么接续”由 API/服务器按 compaction 规则处理。