Claude学院

Claude 上下文窗口多大?长文档处理实用技巧

Claude 主力模型中,Claude Opus 4.8、Claude Opus 4.7 与 Claude Sonnet 4.6 的上下文窗口都是 100 万 token(1M),Claude Haiku 4.5 为 20 万 token(200K)。输出上限方面,Opus 系列与 Sonnet 4.6 最高可达 128K(Sonnet 4.6 为 64K)。也就是说,单次请求能塞进相当于几百页文档的内容——但塞得进不等于用得好,下面讲实际的处理方法。

各模型上下文窗口一览

模型模型 ID上下文窗口最大输出
Claude Opus 4.8claude-opus-4-81M128K
Claude Opus 4.7claude-opus-4-71M128K
Claude Sonnet 4.6claude-sonnet-4-61M64K
Claude Haiku 4.5claude-haiku-4-5200K64K

这里的 token 是 Claude 自己的计量单位,和英文单词、中文汉字都不是一一对应。中文内容通常每个汉字略多于 1 个 token,混排代码和符号时差异更大。所以"100 万 token 能放多少字"没有固定换算,需要实测——这正是第一个技巧。

技巧一:先用 count_tokens 估算,别靠经验拍脑袋

很多人习惯用 OpenAI 的 tiktoken 估算,这对 Claude 是不准的,通常会少算 15%~20%,代码和非英文内容偏差更大。正确做法是调用官方的 count_tokens 接口(POST /v1/messages/count_tokens),它按你实际要用的模型计算,且不消耗生成额度:

from anthropic import Anthropic

client = Anthropic()  # 读取环境变量 ANTHROPIC_API_KEY

with open("report.md", encoding="utf-8") as f:
    text = f.read()

resp = client.messages.count_tokens(
    model="claude-opus-4-8",
    messages=[{"role": "user", "content": text}],
)
print(resp.input_tokens)  # 这份文档占多少 token

拿到数字后,再除以窗口上限就知道还能放多少内容、要不要分块。关于 token 的换算与更多估算方法,可以参考 Claude API Token 怎么计算?附在线估算方法

技巧二:长文档用 Files API 上传,跨请求复用

如果同一份大文档要在多次请求里反复引用,与其每次都把全文塞进消息体,不如先用 Files API 上传一次,之后用 file_id 引用。这既减少请求体积,也避免重复传输。PDF、图片、CSV、文本等都支持。

// Node.js: @anthropic-ai/sdk
import Anthropic from "@anthropic-ai/sdk";
import fs from "fs";

const client = new Anthropic();

const file = await client.beta.files.upload({
  file: fs.createReadStream("contract.pdf"),
  betas: ["files-api-2025-04-14"],
});

const msg = await client.beta.messages.create({
  model: "claude-opus-4-8",
  max_tokens: 4096,
  betas: ["files-api-2025-04-14"],
  messages: [{
    role: "user",
    content: [
      { type: "document", source: { type: "file", file_id: file.id } },
      { type: "text", text: "提取这份合同里的所有付款条款,并列成表格。" },
    ],
  }],
});

多模态场景(比如直接传扫描件、图表截图)同样走这条路,详见 Claude API 图片输入怎么传?多模态调用教程

技巧三:用提示缓存大幅降低重复成本

处理长文档最容易踩的坑是成本。如果你针对同一份大文档连续问很多问题,每次都把全文当作新输入计费会非常贵。解决办法是提示缓存(prompt caching):在稳定不变的前缀(比如这份长文档)上打一个 cache_control 断点,后续请求命中缓存后,这部分只按约 0.1 倍输入价计费。

response = client.messages.create(
    model="claude-opus-4-8",
    max_tokens=4096,
    system=[{
        "type": "text",
        "text": long_document,            # 大文档放稳定前缀
        "cache_control": {"type": "ephemeral"},
    }],
    messages=[{"role": "user", "content": "第三章讲了什么?"}],
)
print(response.usage.cache_read_input_tokens)  # 命中缓存的 token 数

关键原则:缓存是前缀精确匹配,前缀里任何一个字节变化(比如插入当前时间、未排序的 JSON)都会让缓存失效。所以把不变的内容放前面、把每次都变的问题放最后。如果 cache_read_input_tokens 一直是 0,说明前缀里藏着"静默失效"因素。降本的更多手段见 Claude API 怎么省钱?5 个降低 Token 成本的方法

技巧四:超长多轮对话用压缩与上下文编辑

窗口再大也有上限。当一个 Agent 跑很多轮、累积的工具结果和历史可能逼近 1M 时,有两条路:

  • 压缩(Compaction,beta):开启后接近阈值(默认 150K token)时,API 会自动把较早的历史总结成压缩块。需带 beta 头 compact-2026-01-12。注意每轮要把完整的 response.content(而不只是文本)追加回 messages,压缩块必须保留,否则会丢失压缩状态。
  • 上下文编辑(Context editing):直接裁剪掉过时的工具结果和思考块,不是总结而是删除,按可配置阈值生效。

两者可以并用:上下文编辑负责修剪、压缩负责在临界点收口。多轮对话的上下文管理基础写法,可参考 Claude API 多轮对话怎么实现?上下文管理详解

技巧五:输出量大时务必用流式

处理长文档常常需要长输出(整理摘要、逐条提取)。当 max_tokens 设得较大(超过约 16000)时,非流式请求容易触发 SDK 的 HTTP 超时;要用到 128K 的输出上限,更必须走流式。用 SDK 的 .stream() 配合 .get_final_message() / .finalMessage() 取完整结果即可:

with client.messages.stream(
    model="claude-opus-4-8",
    max_tokens=64000,
    messages=[{"role": "user", "content": "把这份文档逐章总结。"}],
) as stream:
    message = stream.get_final_message()
print(message.content[0].text)

SSE 流式的事件细节与 Python 实现,见 Claude API 流式输出 Python 实现教程(SSE 详解)

实战取舍:1M 窗口不等于无脑塞满

上下文越长,单次请求的输入成本越高、首字延迟也越久。实际工程里更稳的做法是:先 RAG 检索出真正相关的片段,再交给 Claude;只有当文档整体逻辑必须一次性看到(如跨章节比对、全文一致性检查)时,才真正用满大窗口。模型选型上,预算敏感、文档不超过 200K 时 Haiku 4.5 足够;需要深度推理或跨百万 token 长程任务,才上 Opus 4.8。具体怎么选见 Claude 模型怎么选?Opus / Sonnet / Haiku 选型指南

常见问题

Claude 真的能一次读完 100 万 token 吗?

能。Opus 4.8、Opus 4.7、Sonnet 4.6 的窗口都是 1M token,单请求可放入相当于数百页的文档。但要注意:窗口是输入加输出共享的预算上限,输入越满,留给生成的空间越少;同时长输入会显著拉高成本与延迟,建议结合 count_tokens 实测后再决定塞多少。

窗口被填满会怎样?如何避免请求失败?

当对话累积超过窗口,模型会以 stop_reason: "model_context_window_exceeded" 返回。避免方式有三:开启压缩(compaction)自动总结历史、用上下文编辑裁剪过时内容、或在应用侧分块/检索后只送相关片段。不要让历史无限增长。

处理长文档时怎么控制费用?

三个杠杆:一是对反复引用的长文档开启提示缓存,命中后前缀只按约 0.1 倍计费;二是相关片段用 RAG 检索代替全文输入;三是按任务选更便宜的模型(如 Haiku 4.5)。具体价格与配额请以 Anthropic 官网为准。

模型选择与对比