核心 · Key Idea
一句话:短期记忆 = 当前会话里最近若干轮的消息。模型本身没有「会话」概念 —— 我们每轮都把整个聊天历史拼回 prompt,让模型「以为」自己记得。一旦超出 context window,就要决定留哪些、丢哪些。
是什么#
每次调用 LLM 实际发的是:
[
{"role": "system", "content": "你是助手"},
{"role": "user", "content": "我叫小明"},
{"role": "assistant", "content": "你好,小明"},
{"role": "user", "content": "我叫什么?"} ← 当前问题
]模型「记得名字」纯粹是因为前面几条 message 还在 prompt 里。一旦总长超出 context window,前面的会被砍掉,模型就「失忆」了。
打个比方#
打个比方 · Analogy
模型的脑袋 = 一张有限大小的白板。每轮对话都把过去的笔记重新抄一遍上去,再写当前问题。
白板写满了,就得擦掉一些旧的 —— 短期记忆策略就是「擦哪些」。
关键概念#
Sliding Window滑动窗口
只保留最近 N 轮,旧的直接丢 —— 最简单。
Summarization摘要压缩
把旧轮压成一段摘要塞回 system prompt,节省 token。
Token BudgetToken 预算
实际可用 = context window − system prompt − 工具定义 − 输出预留。
Pin Messages钉住消息
重要事实(用户名、偏好)始终保留,不参与裁剪。
怎么工作#
实际生产里几乎都用 Hybrid:钉关键事实 + 摘要中段 + 留最近 5–10 轮。
实操要点#
- 总 token 算清楚:context window 不是免费的 —— system + 历史 + 工具 + 预留输出全算进去。
- 摘要要给具体格式:让模型「用 3 行 markdown 列表输出关键事实」,再插回 system prompt。比让它自由发挥稳得多。
- 重要事实立刻提取:用户提到「我对花生过敏」时当场抽取写进 system prompt,不依赖未来摘要。
- 不要把 tool 输出原样存:动辄几 KB 的 JSON 立刻吃完上下文。摘要后再回喂。
- 超长任务上 LangGraph / 自带 checkpoint 的库:自己手写历史拼接是 bug 大户。
易混点#
短期记忆
**当前会话内**。
本质是 prompt 里的几条消息。
本质是 prompt 里的几条消息。
长期记忆
**跨会话**持久化。
存进 DB / 向量库,下次会话再检索回来。
存进 DB / 向量库,下次会话再检索回来。
短期记忆
**应用策略**:怎么塞进窗口。
Context Window
**模型属性**:窗口本身有多大。
延伸阅读#
- Context Window —— 短期记忆的物理上限
- Long-term Memory —— 跨会话持久记忆
- RAG —— 当历史太长时,用 RAG 检索旧对话