【Bug已解决】Claude: "prompt is too long" / Input exceeds maximum context — Claude 输入超长解决方案
1. 问题描述
Claude 报输入过长错误,无法处理请求:
# 输入超长 $ claude "分析这个大文件 $(cat large_file.py)" Error: prompt is too long: 250000 tokens > 200000 tokens maximum # 或对话历史过长 $ claude --continue Error: Input exceeds maximum context length Conversation history too long. # 或文件太大 $ claude --print "分析 src/generated.js" # 100000 行 Error: File content too large for context window. # 或系统提示+对话+文件总和超限 $ claude --system-prompt "$(cat large-prompt.txt)" "task" Error: Total input exceeds 200000 token limit.这个问题在以下场景中特别常见:
- 大文件直接粘贴
- 长对话历史累积
- 系统提示过长
- 多文件同时分析
- 日志文件分析
- 代码生成文件过大
2. 原因分析
原因分类表
| 原因分类 | 具体表现 | 占比 |
|---|---|---|
| 大文件 | cat large_file | 约 35% |
| 长对话 | --continue | 约 30% |
| 系统提示长 | prompt 过大 | 约 15% |
| 多文件 | 同时分析 | 约 10% |
| 日志分析 | 大日志 | 约 5% |
| 代码生成 | 大文件 | 约 5% |
3. 解决方案
方案一:分块处理(最推荐)
# 步骤 1:分块读取大文件 claude "分析 src/generated.js 第 1-200 行" claude "分析 src/generated.js 第 201-400 行" # 步骤 2:使用 head/tail claude "分析 $(head -n 200 src/generated.js)" # 步骤 3:使用 grep 定位 claude "分析 src/generated.js 中包含 'function' 的行" # 步骤 4:使用 sed 提取 claude "分析 $(sed -n '1,200p' src/generated.js)"方案二:开新会话
# 步骤 1:不用 --continue,开新会话 claude # 新会话 # 步骤 2:保存之前的讨论 claude "将之前的讨论总结保存到 docs/summary.md" # 步骤 3:新会话引用总结 claude "参考 docs/summary.md 继续" # 步骤 4:验证 claude --print "hello"方案三:精简系统提示
# 步骤 1:检查系统提示大小 wc -c system-prompt.txt # 步骤 2:精简提示(< 4000 tokens) # 只保留必要指令 # 步骤 3:或移除系统提示 claude "task" # 不使用 --system-prompt # 步骤 4:使用简短指令 claude --system-prompt "代码助手" "task"方案四:使用更大窗口的模型
# 步骤 1:使用 200K 窗口的模型 claude --model claude-sonnet-4-20250514 "分析代码" # Sonnet: 200K 窗口 # 步骤 2:或 Opus claude --model claude-opus-4-20250514 "分析代码" # Opus: 200K 窗口 # 步骤 3:避免使用小窗口模型 # 步骤 4:验证 claude --model claude-sonnet-4-20250514 --print "hello"方案五:限制文件读取
# 步骤 1:不要一次性读取大文件 # 错误: claude "分析 src/generated.js"(100000 行) # 正确: claude "分析 src/generated.js 的前 200 行" # 步骤 2:使用管道限制 claude "分析 $(head -n 200 src/generated.js)" # 步骤 3:使用 grep 过滤 claude "分析 $(grep 'ERROR' large_log.txt | tail -20)" # 步骤 4:分步分析 claude "第一步: 列出 src/generated.js 中的所有函数" claude "第二步: 分析第一个函数" # 新会话方案六:使用文件引用而非粘贴
# 步骤 1:不要用 $(cat) 粘贴大文件 # 错误: claude "分析 $(cat large_file.py)" # 正确: claude "分析 large_file.py 文件" # 步骤 2:让 Claude 自己读取文件 claude "读取 src/index.js 并分析" # 步骤 3:或指定行范围 claude "读取 src/index.js 第 1-50 行并分析" # 步骤 4:验证 claude --print "读取 src/index.js" --max-turns 54. 各方案对比总结
| 方案 | 适用场景 | 推荐指数 | 难度 |
|---|---|---|---|
| 方案一:分块 | 大文件 | ⭐⭐⭐⭐⭐ | 低 |
| 方案二:新会话 | 长对话 | ⭐⭐⭐⭐⭐ | 低 |
| 方案三:精简提示 | 系统提示 | ⭐⭐⭐⭐⭐ | 低 |
| 方案四:大窗口 | 超大输入 | ⭐⭐⭐⭐ | 低 |
| 方案五:限制读取 | 文件 | ⭐⭐⭐⭐⭐ | 低 |
| 方案六:文件引用 | 大文件 | ⭐⭐⭐⭐⭐ | 低 |
5. 常见问题 FAQ
5.1 Claude 的上下文窗口多大
- Sonnet/Opus: 200K tokens
- Haiku: 200K tokens
5.2 200K tokens 大约多少
约 150,000 英文单词,约 5,000-8,000 行代码。
5.3 如何估算 Token
python3 -c " import tiktoken enc = tiktoken.encoding_for_model('gpt-4o') text = open('file.js').read() print(f'Tokens: {len(enc.encode(text))}') "5.4 --continue 为什么容易超限
--continue 加载之前的对话历史,历史越长,累积的 Token 越多。
5.5 如何分块处理
使用head -n 200、tail -n 200、sed -n '1,200p'或grep分块。
5.6 系统提示占多少 Token
通常 500-5000 tokens。过长的系统提示会挤占对话空间。
5.7 如何避免长对话超限
- 每个任务开新会话
- 将总结保存到文件
- 不使用 --continue
5.8 $(cat) 粘贴文件有什么问题
将整个文件内容作为命令行参数,可能导致输入超长。
5.9 如何让 Claude 读文件
claude "读取 src/index.js 并分析" # Claude 自己读5.10 排查清单速查表
□ 1. 分块: head -n 200 + tail -n 200 □ 2. 开新会话不用 --continue □ 3. 保存总结到文件 □ 4. 精简系统提示 < 4000 tokens □ 5. --model sonnet 200K 窗口 □ 6. 不用 $(cat) 粘贴大文件 □ 7. claude "读取文件" 让 Claude 自己读 □ 8. grep 过滤大文件 □ 9. sed -n '1,200p' 提取行范围 □ 10. tiktoken 估算 Token 数6. 总结
- 根本原因:输入超长最常见原因是大文件直接粘贴(35%)和长对话累积(30%)
- 最佳实践:使用
head -n 200、grep分块处理大文件,不用$(cat)粘贴 - 新会话:开新会话(不 --continue),将讨论总结保存到文件
- 精简提示:系统提示保持在 4000 tokens 以内
- 最佳实践建议:让 Claude 自己读取文件(
claude "读取 src/index.js"),而非通过命令行粘贴
故障排查流程图
flowchart TD A[输入超长] --> B{是大文件?} B -->|是| C[分块处理] B -->|否| D{是 --continue?} C --> E[head -n 200 分块] E --> F[或 grep 过滤] F --> G[claude 验证] D -->|是| H[开新会话] D -->|否| I{系统提示长?} H --> j[保存总结到文件] j --> K[新会话引用文件] K --> G I -->|是| L[精简系统提示] I -->|否| M[使用大窗口模型] L --> G M --> N[--model sonnet 200K] N --> G G --> O{成功?} O -->|是| P[✅ 问题解决] O -->|否| Q[不用 $(cat)] Q --> R[claude "读取文件"] R --> S[让 Claude 自己读] S --> G G --> T{成功?} T -->|是| P T -->|否| U[分步分析] U --> V[第一步: 列出函数] V --> W[第二步: 逐个分析] W --> P P --> X[长期: 分块 + 新会话 + 文件引用] X --> Y[✅ 长期方案]