🪟 Context Window:上下文窗口

AI的"内存条"——装得下是本事,装不下是事故

📅 2026-04-28 🏷️ 核心限制 ⏱️ 阅读约9分钟 📏 Token优化

什么是 Context Window?

凌晨4点23分,AI正在读你发的100页文档。突然它说"之前的滚动去哪了"——这就是Context Window的边界。上下文窗口是AI一次能"看见"的最大文本量,像一个固定大小的窗口,新内容进来,旧内容就得挤出。

想象你在看一部电影,但屏幕只有32寸。你坐在第一排,画面切到哪你就看到哪,前面的镜头一闪而过就没了——这就是小Context Window。

现在换成了IMAX巨幕,你能同时看到刚才、现在和即将发生的事——这就是大Context Window。

但无论多大,屏幕终究有限。你不可能一次看完整部电影,除非——用分段播放(chunking)或者智能剪辑(summarization)。

各模型Context Window对比

模型 Context Window 约等于 适用场景
GPT-4o-mini 128K tokens ~300页书 日常对话、简单任务
GPT-4-turbo 128K tokens ~300页书 复杂分析、长文档
Claude 3.5 Sonnet 200K tokens ~500页书 大规模代码、长篇报告
Gemini 1.5 Pro 1M tokens ~2500页书 整本书分析、视频处理
开源模型(7B) 4K-8K tokens ~10-20页 边缘设备、快速响应
Token不是字!中文大约1.5-2个字符≈1个token,英文约4个字符≈1个token。估算时按"千中文≈800token,千英文≈250token"算。

窗口会被什么占满?

🏗️ Context组成结构

┌─────────────────────────────────────┐
│  System Prompt (系统提示)           │  ← 固定占用
│    ~500-2000 tokens                 │
├─────────────────────────────────────┤
│  Conversation History (对话历史)     │  ← 动态增长
│    User + Assistant messages        │
│    每轮约100-500 tokens             │
├─────────────────────────────────────┤
│  Tool Definitions (工具定义)         │  ← 固定占用
│    每个工具约50-200 tokens          │
├─────────────────────────────────────┤
│  Tool Results (工具返回)             │  ← 最大变量!
│    可能是几KB或几MB                  │
├─────────────────────────────────────┤
│  Current User Input (当前输入)       │  ← 读到这就开始处理
│    用户当前消息                      │
├─────────────────────────────────────┤
│  Response Buffer (响应预留)          │  ← 必须预留!
│    给AI回复留空间(通常2000-4000)   │
└─────────────────────────────────────┘
         总和 = Context Window Size

🔍 容量杀手排行榜

🥇 Tool Results - 工具返回大数据(数据库查询、文件内容)

🥈 Conversation History - 长对话积累

🥉 System Prompt - 过长的系统设定

踩坑实录:有次我让Agent读10MB的日志文件analysis,直接爆Context。错误信息:"context_length_exceeded"。解决方案:文件大于Context的1/3时必须预处理——提取关键、分段处理、或用RAG。

OpenClaw Context管理策略

1. 自动上下文裁剪

# IDENTITY.md 或 Agent配置

context_management:
  strategy: sliding_window  # 滑动窗口策略
  max_history_turns: 20  # 保留最近20轮
  preserve_system: true  # 系统提示不裁剪
  preserve_recent: 5  # 最近5轮不裁剪
  summarize_old: true  # 旧内容压缩成摘要

2. Token计数与预警

// OpenClaw 自动计算token使用
const usage = context.getTokenUsage();
// {
//   system: 1200,
//   history: 8500,  
//   tools: 3000,
//   available: 23000,  ← 剩余可用
//   percentage: 72%
// }

if (usage.percentage > 80) {
  triggerContextWarning("Context 80% full");
}

3. Tool Result压缩

# 工具返回自动压缩
tools:
  - name: search_database
    result_handling:
      max_size: 5000  # 超过5000 token截断
      summarize: true  # 生成摘要替代原文
      include_summary: "找到{count}条记录,关键信息:{summary}"
OpenClaw的Scene Blocks机制是最好的Context优化实践:把长内容存储在外部,只给AI一个摘要和指针(路径),需要时才读取。这就是"按需加载"的精髓。

容量优化技巧

🎯 减少System Prompt

# ❌ 冗长版(~2000 tokens)
你是一个专业的内容创作助手,你的任务是帮助用户创作高质量的内容。
你需要遵循以下原则:第一,内容必须准确;第二,风格必须专业...
(省略100行废话)

# ✅ 精简版(~300 tokens)
你是内容助手。准则:准确、专业、有洞见。
输出格式见下方template,严格遵循。

🎯 压缩历史对话

# 策略:早期对话摘要化
Turn 1-5: 完整保留(关键决策)
Turn 6-15: 摘要:"用户询问了X功能,我们讨论了Y方案,最终决定Z"
Turn 16+: 只保留结论

🎯 拆分大任务

# ❌ 一次塞进所有内容
用户:帮我分析这100页的财报,然后写份总结

# ✅ 分段处理
Step 1: 读取财报目录 → 确定重点章节
Step 2: 分析重点章节(分批) → 提取关键数据  
Step 3: 综合所有摘要 → 生成最终报告

🎯 使用RAG替代全量加载

# ❌ 全量加载:把整个知识库塞进Context
Context: [10MB文档内容] → 爆掉

# ✅ RAG检索:只加载相关片段
Query: "去年的营收增长"
RAG检索: → 找到3个相关段落(~500 tokens)
Context: [摘要 + 3段落] → 轻松装下

监控与预警配置

monitoring:
  context_alerts:
    warning_at: 70%  # 70%时警告
    critical_at: 85%  # 85%时强制压缩
    log_usage: true
    
metrics:
  track:
    - peak_context_usage
    - average_turn_tokens
    - truncation_events
    - summarization_count
踩坑:长对话后突然报错"maximum context length exceeded",因为对话历史太多。解决方案:设置max_history_turns并启用自动摘要

最佳实践清单

✅ 预留Response Buffer(至少2000 tokens)

✅ System Prompt控制在500 tokens以内

✅ 工具返回结果设置max_size

✅ 长对话启用自动摘要

✅ 大文件首先判断大小再决定加载方式

✅ 使用RAG处理知识库检索

✅ 配置Context监控预警

✅ 定期清理无用的历史数据

相关链接