第九章
上下文管理
🎧 语音播放
理解 Hermes 如何管理长对话的上下文
🎯 本章目标
- 理解上下文长度限制的问题
- 掌握上下文压缩机制
- 理解 token 估算方法
📚 前置知识
- Token 和上下文窗口的概念
💡 学完收获
- 理解上下文管理的必要性
- 能够诊断上下文相关问题
9.1 上下文窗口的问题
每个 LLM 都有上下文窗口限制——这是硬件和算法的本质约束:
| 模型 | 上下文窗口 | 约等于 |
|---|---|---|
| Claude 3.5 Sonnet | 200K tokens | 15万英文单词 |
| GPT-4 Turbo | 128K tokens | 10万英文单词 |
| Llama 3.1 8B | 8K tokens | 6千英文单词 |
💡 Token 是什么?
Token 是文本的最小单元。英文约 4 个字符 = 1 个 Token,中文约 1-2 个字 = 1 个 Token。当对话超过这个限制,LLM 就会出错或丢失早期信息。
9.2 Token 估算
Hermes 需要知道用了多少 tokens,才能判断是否需要压缩:
estimate_tokens_rough()
model_metadata.py
def estimate_tokens_rough(text: str) -> int:
"""Rough token estimation"""
# 英文约 4 字符/token
# 中文约 1-2 字/token
return len(text) // 4
⚠️ 估算 vs 精确计算
这是粗糙估算。真正的 token 数需要用 tiktoken 或 similar 库计算。但估算足够用于判断是否需要压缩。
9.3 压缩策略
当上下文快满时,Hermes 使用"保留最近 + 总结过去"的策略:
压缩前
150+ 条消息
[msg1] [msg2] [msg3] ... [msg100] [msg101] [msg102]
压缩后
保留摘要 + 最近消息
[Summary: 用户在开发 Python 项目...] [msg95] [msg96] ... [msg102]
9.4 压缩执行流程
上下文压缩流程 Context Compression
flowchart TD
A["📊 检查 tokens"] --> B{"超过 80%?"}
B -->|否| C["✅ 继续"]
B -->|是| D["📝 提取旧消息"]
D --> E["🤖 LLM 总结"]
E --> F["🗑️ 删除旧消息"]
F --> G["➕ 插入摘要"]
G --> C
style B fill:#ede9fe,stroke:#7c3aed
style E fill:#dbeafe,stroke:#2563eb
style D fill:#fee2e2,stroke:#ef4444
9.5 Anthropic Prompt Caching
对于 Claude 模型,Hermes 支持 Anthropic 的 Prompt Caching 特性:
Prompt Caching
Anthropic 的 Claude 支持将系统提示和早期消息标记为"可缓存",这样每次调用只需传新增的消息,而不是整个上下文。
这对长对话场景可以大幅降低成本和延迟。
9.6 最佳实践
应该做
- 长任务定期让 Agent 总结进展
- 使用合适的 max_iterations
- 启用记忆摘要
避免
- 单次对话过长(>100轮)
- 上传超大文件到对话
- 重复相同的任务
📚 本章总结
本章重点:
- 上下文窗口是有限资源
- 压缩策略:保留最近,总结过去
- Token 估算是近似值
- Claude 支持 Prompt Caching
一句话记忆点: 上下文管理就是"用多少省多少"——在有限窗口里装最多的有用信息
延伸思考
- 除了总结,还有哪些压缩策略?(如:分层记忆、重要性筛选)
- 如果总结丢失了重要细节怎么办?
- Claude 的 Prompt Caching 和传统压缩相比有什么优劣?