871 字
约 2 分钟
8
S20-J02 · 上下文与记忆:token 预算与管理
适用读者:被"上下文爆了"或"聊到后面忘了前面"困扰的人。
前置:S20-B01。
实测环境:tiktoken(cl100k_base),2026-11-05。
覆盖旧文:231(140) 656(138) 292(48) 743(161) = 487 点。
覆盖扩展:E-S20-013(记忆系统的三种范围)。
上一篇:S20-J01 · 评估:离线指标、在线 A/B 与失败模式
下一篇:S20-J03 · Agent。
1. 一句话结论
上下文是"预算"不是"容器":中文的 token 效率远低于英文(实测 0.94 字符/token vs 5.12),所以同样字数下中文更贵。
实测(cl100k_base 分词):
| 样本 | 字符 | token | 字符/token |
|---|---|---|---|
| 中文 | 122 | 130 | 0.94 |
| 英文 | 210 | 41 | 5.12 |
| 代码 | 57 | 23 | 2.48 |
读法:1 个汉字 ≈ 1.06 个 token,而英文约 5 个字符 1 个 token——同样"看字数"的预算,中文消耗是英文的 5 倍以上。
2. 预算怎么分(E-S20-013)
总窗口 W
├─ 系统提示词 ~10%
├─ 检索片段(RAG) ~40~60%
├─ 对话历史 ~20~30%
└─ 输出预留 ~20%(必须留!)
"为什么必须给输出留预算":输入 + 输出共享窗口——输入塞满,输出会被截断(表现为回答戛然而止)。
判据:"我的输入占了窗口多少?" 超过 80% → 迟早出事。
3. 记忆的三种范围
| 范围 | 内容 | 实现 |
|---|---|---|
| 瞬时(本轮) | 当前对话 | 直接放窗口 |
| 会话(跨轮) | 摘要 + 关键事实 | 滑动窗口/摘要压缩 |
| 长期(跨会话) | 用户偏好/历史决策 | 外部存储 + 检索(与 RAG 同构) |
"为什么不能全放窗口":成本与注意力都会被稀释——这正好对应 S19-B03 的"上下文越长越不聚焦"。
4. 四种上下文管理策略
| 策略 | 说明 | 代价 |
|---|---|---|
| 滑动窗口 | 只留最近 N 轮 | 早期信息丢失 |
| 摘要压缩 | 把旧对话总结成一段 | 细节丢失、需额外调用 |
| 关键事实抽取 | 抽出事实存外部 | 实现复杂 |
| 分层记忆(MemGPT 类) | 分页/换入换出 | 工程复杂 |
判据:"丢失早期细节会怎样?" 会(多轮任务)→ 摘要 + 事实抽取;不会 → 滑动窗口足够。
5. 五个误区
| 误区 | 真相 |
|---|---|
| "字数≈token 数" | 中文约 1 字符 1 token,英文约 1/5 |
| "窗口大就不用管预算" | 成本与注意力仍受限 |
| "输出不用预留" | 会被截断 |
| "历史全留着更准确" | 噪声与成本上升 |
| "记忆=向量库" | 会话记忆常是结构化存储 |
6. 自检
- 实测中英文的字符/token 差异?
- 预算的四个部分与比例?
- 为什么必须给输出留预算?
- 三种记忆范围分别存什么?
- 四种管理策略怎么选?
7. 下一篇
S20-J03 · Agent:Function Calling 与工作流
记忆讲完,下一篇讲"让模型动手":工具调用与循环终止。
本篇属于系列《S20 · AI 应用与工程》。旧文来源:A-231/656/292/743;扩展点 E-S20-013。token 数据为 tiktoken(cl100k_base) 实测。
S20-J02 · 上下文与记忆:token 预算与管理
https://www.clxhxhhr.top/posts/5469/ 评论
0 条
还没有评论,先写一条吧。