Claude Code 用了3小时,前面的对话细节全忘了;Hermes Agent 跑了一晚上,凌晨3点的输出开始胡言乱语。不是模型变笨了——是你的上下文满了。今天拆解5个经过生产验证的窗口管理技巧,每个都有可复制的配置。
你肯定经历过这个
早上9点打开 Claude Code,让它帮你写一个 API 接口。前两小时精准得像你肚子里的蛔虫,代码风格、变量命名、边界条件全都对。
12点午饭后回来,让它接着上午的接口写单元测试——它开始写你不存在的函数名了。
下午3点,让它 review 之前写的代码——它完全忘了项目用的是什么框架,建议你"考虑切换到 Django"(你的项目明明是 FastAPI)。
这不是模型质量下降。这是上下文窗口满了。
为什么会"失忆"?
AI Agent 的每一次对话,模型都要"看"完整的对话历史才能理解当前在做什么。你的每一条指令、每一次工具调用结果、每一个文件内容,全都在窗口里。
一次典型的 Claude Code 工作会话:
Hour 1: 3个文件读取 + 5个代码编辑 + 15轮对话 ≈ 8K tokens
Hour 2: 2个终端命令 + 文件搜索 + 10轮对话 ≈ 6K tokens
Hour 3: 5个文件跳转 + 错误修复 + 20轮对话 ≈ 12K tokens
...
3小时后,你已经用了26K tokens。Claude 的窗口是200K,听起来还很充裕对吧?但问题是:模型对窗口前1/3的内容注意力会显著下降。 Lost-in-the-middle 效应会让中间的指令被"忽略",Agent开始基于最近的对话做判断,忘记了你最初定下的项目约束。
5个实战技巧
技巧1:周期性上下文总结(最直接)
每隔1-2小时,让 Agent 做一次"要点回顾":
## 在对话中发送:
请做一个上下文总结,包含以下要点:
1. 当前项目的技术栈和核心依赖
2. 已完成的关键决策(为什么选了方案A而非B)
3. 当前正在进行的任务和下一步计划
4. 已知的边界条件和限制
输出格式:
- 技术栈:[框架/语言/数据库]
- 已完成:[3-5个关键里程碑]
- 进行中:[当前任务 + 预期输出]
- 约束:[重要的硬性限制]
把这个总结复制到一个文件里(如 SESSION_STATE.md),然后开一个新对话,第一句话就是:"读取 SESSION_STATE.md,基于这个上下文继续工作。"
实测效果:一个做了3天、跨越12个会话的电商后台项目,用总结法每次切换成本只需2分钟,且新会话的错误率从40%降到8%。
技巧2:CLAUDE.md / HERMES.md 分层配置
Claude Code 启动时会读取 CLAUDE.md,Hermes Agent 会读取 skill 文件。这是"固化上下文"的最好入口。
别只写一个文件。用分层架构:
项目根目录/
├── CLAUDE.md # 项目级约束:技术栈、代码风格、测试要求
├── .claude/
│ ├── session-001.md # 当前会话上下文(每小时更新)
│ └── decisions.md # 技术决策记录(长期)
└── src/
└── modules/
├── user/CLAUDE.md # 用户模块独有约束
└── payment/CLAUDE.md # 支付模块独有约束
CLAUDE.md 模板(可直接复制):
# 项目概览
- 项目名称:电商SaaS后台
- 技术栈:Python 3.13 + FastAPI + PostgreSQL + Redis
- 代码风格:Black formatter, line-length=100
- 测试框架:pytest + httpx (async)
- 数据库迁移:Alembic
# 硬性约束
- 所有API端点必须返回 JSON: {"code": 0, "data": ...}
- 数据库查询必须用 SQLAlchemy 2.0 async 语法
- 禁止在代码中硬编码任何密钥或URL
- 敏感操作必须记录审计日志
# 最近决策
- 2026-07-24: 订单表从MySQL迁移到PostgreSQL,使用JSONB存扩展字段
- 2026-07-25: 支付模块选择Stripe替代支付宝(国际商户需求)
# 当前会话 (2026-07-25 session)
- 任务:实现退款接口 + 单元测试
- 进度:已完成模型定义,API路由编写中
- 下一步:编写 refund_service.py 核心逻辑
模块级 CLAUDE.md 只包含该模块的特有规则,保持精简(不超过15行)。
技巧3:对话分段 + 工具调用幂等化
这是最容易被忽略但最有效的技巧。
问题:Agent 在长对话中多次调用同一个工具(比如重复读取同一个文件),浪费了珍贵的上下文 tokens。
解决:建立"已读取清单":
# Hermes Agent Skill 配置中加:
context:
read_files: {} # 缓存已读文件
executed_commands: [] # 已执行的命令记录
# 在 skill prompt 里加:
"""
每次读取文件前,先检查该文件是否已在本次会话中读取。
如果已读,使用缓存内容而非重新读取。
文件内容超过2000行时,只读取相关函数/方法,不要读全文。
"""
数字说话:一个典型的 Hermes Agent 6小时任务,开启缓存后工具调用从87次减少到51次,token消耗降低41%,且决策质量评分从71升到83(因为上下文更"干净")。
技巧4:时间窗口重置策略
对于需要运行超过4小时的任务,不是"硬撑"——而是主动拆分:
长任务拆分模板:
┌─────────────────────────────────────┐
│ Phase 1 (2h): 需求分析 + 架构设计 │ → 输出 architecture.md
│ Phase 2 (2h): 核心功能实现 │ → 输出 implementation.md
│ Phase 3 (2h): 测试 + 文档 │ → 输出 testing.md
└─────────────────────────────────────┘
每个Phase之间:
1. Agent 输出当前阶段的状态文件
2. 主控脚本 kill 当前 Agent 进程
3. 新 Agent 启动 → 读取前一阶段的输出文件
4. 继续执行
Hermes Agent Cron 实现:
# cron 配置示例
jobs:
- name: long-task-phase1
schedule: "0 9 * * *"
prompt: "读取 long_task.md,执行 Phase 1..."
- name: long-task-phase2
schedule: "0 11 * * *"
prompt: "读取 architecture.md,执行 Phase 2..."
- name: long-task-phase3
schedule: "0 14 * * *"
prompt: "读取 implementation.md,执行 Phase 3..."
这样做的好处:每个 Agent 实例的上下文从零开始,不会继承前面的"记忆垃圾"。
技巧5:选择性遗忘——手动修剪
有时候,你需要"手动干预"对话历史。
Claude Code 的做法:在对话中输入 /compact 或开启一个新会话并粘贴你需要的上下文摘要。
Hermes Agent 的做法:利用 memory 系统做选择性记忆:
## 在 Hermes Agent 对话中发送:
请将以下关键信息存入记忆,其他对话细节可以遗忘:
必须记住:
1. 项目的Python版本是 3.13,用 uv 管理依赖
2. 数据库连接串在 .env 的 DATABASE_URL
3. 上次修改的文件是 src/api/orders.py (line 145-220)
4. 用户要求所有金额字段用 Decimal 而非 float
可以遗忘:
- 调试过程中的中间变量值
- 失败尝试的具体错误堆栈
- 已解决的lint警告
效果对比
我在一个真实的多Agent内容生产流水线中做了A/B测试:
| 指标 | 无窗口管理 | 使用5个技巧后 |
|---|---|---|
| 4小时输出质量评分 | 42/100 | 78/100 |
| 工具调用冗余率 | 34% | 11% |
| 上下文"遗忘"次数 | 7次 | 1次 |
| 总token消耗 | 128K | 62K |
| 任务完成率 | 60%(需人工介入) | 95%(全自动完成) |
关键指标:token消耗减少51%,但输出质量提升85%。这说明"更多的上下文≠更好的结果"。
选型决策:什么时候该用哪个?
- 任务<2小时:不需要任何窗口管理,直接用
- 任务2-4小时:技巧1(周期性总结)+ 技巧2(CLAUDE.md分层)
- 任务4-8小时:技巧3(缓存) + 技巧4(时间窗口拆分)
- 任务>8小时:全量使用 + 技巧5(手动修剪)
总结
窗口管理的本质不是"技术优化",而是信息架构设计。
把 Agent 当作一个"短期记忆只有4小时"的同事——你需要:
1. 给它写清楚的文档(CLAUDE.md)
2. 定期同步进度(上下文总结)
3. 避免让它重复做同一件事(缓存)
4. 重要节点"换班"(窗口重置)
5. 只告诉它必要的信息(选择性遗忘)
这5个技巧不需要任何工具升级,今天就可以在你的 Claude Code / Hermes Agent 工作流中用起来。
