第七章 · 会话记忆设计

本章定位:前面几章聚焦「单轮问答」——用户问一句、检索+生成答一句。但真实对话是多轮的:用户问「报销流程」,接着追问「那需要哪些材料」,再问「多久能到账」。如果系统记不住上文,每轮都当成全新问题,就会答非所问(「需要哪些材料」——什么材料?)。会话记忆就是让大模型在多轮对话中「记住上文」的能力。但记忆越多 token 越爆,成本越高——如何在「上下文不断」和「token 不爆」之间找平衡,是本章的核心。

本章分两部分:

  • 上篇 · 概念与原理(科普):大模型的「失忆」真相是什么?会话记忆的五种策略各有什么优劣?RAG 场景下 token 预算怎么分配?
  • 下篇 · SparkX 源码落地(实践):SparkX 的双层记忆(L1 滑动窗口 + L2 话题摘要)怎么实现?为什么摘要「只记话题不记答案」?跨会话持久记忆(L3)为什么默认关闭?

上篇 · 概念与原理

一、大模型的记忆真相:每次请求都是失忆的

1. 一个常见的误解

很多人以为:你跟 ChatGPT 聊了 20 轮,它「记住」了前面所有内容。真相是:大模型本身没有任何记忆

大模型是一个无状态的函数——每次调用,它只看你这次传入的内容,之前聊过什么它完全不知道。你能感觉到它「记得上文」,是因为应用层每次都把历史对话重新塞进了请求里

2. messages 数组就是记忆的全部

调用大模型 API 时,你传的是一个 messages 数组:

{
  "messages": [
    {"role": "system", "content": "你是客服助手"},
    {"role": "user", "content": "报销流程是什么"},
    {"role": "assistant", "content": "报销流程是:1.填单子 2.主管审批..."},
    {"role": "user", "content": "需要哪些材料"}
  ]
}

第四条 user: 需要哪些材料 能被正确理解,仅仅是因为前面三条历史也被一起传进去了。大模型看到「报销流程」的上下文,才知道「材料」指的是报销材料。

如果删掉前面的历史,只传最后一条 需要哪些材料,模型根本不知道你在说什么。

3. Token 膨胀:记忆越多,成本越高

问题来了——历史对话越多,messages 数组越长,消耗的 token 越多:

  • 每次请求都要把全部历史重新传一遍(模型是无状态的);
  • 历史越长,输入 token 费用越高、响应越慢
  • 超过模型的上下文窗口(如 128K),直接报错或被截断。

假设每轮对话 500 token,聊 50 轮就是 25000 token。第 51 轮请求要把前 50 轮全传进去——每轮的边际成本越来越高,呈二次方增长

💡 这就是会话记忆要解决的核心矛盾:记得太少 → 上下文断裂、答非所问;记得太多 → token 爆炸、成本失控。需要一个聪明的策略在两者间平衡。


二、会话记忆的五种策略

1. 完整历史(Full History)

把所有历史对话原样塞进 messages

  • ✅ 优点:信息完整,不丢任何上下文;
  • ❌ 缺点:token 线性增长,几轮后就爆;成本高、延迟大。

只适合极短对话(3~5 轮)或上下文窗口极大的场景。

🔒 以上为本章部分预览(约 10%)

本章剩余 90% 内容包含:关键源码逐行拆解、设计细节与工程权衡、代码示例与生产实践要点。

加入知识星球,获取《SparkX 源码深度解析》全部 13 章

💡 本次展示的仅为部分预览内容(约 10%)。完整的源码深度解析包含每一个技术点的完整实现细节。点击上方按钮扫码加入知识星球,解锁全部内容。

🔒

本章为知识星球会员专属内容

完整源码解析、设计决策与落地实践,加入知识星球即可解锁全部章节。

知识星球
🌟 加入知识星球
解锁源码与设计详解
知识星球二维码 了解详情