大模型没有记忆多轮对话怎么做到不失忆
开篇引言
上一篇画了 StreamChatPipeline 的全景地图,八个阶段从加载记忆到流式生成,一行 execute() 方法 20 行代码就是整个问答系统的骨架。你可能注意到了,阶段 1 只有一行调用:
loadMemory(ctx); // 阶段 1
看起来很轻,但这一行背后藏着记忆系统的完整设计——存储、加载、并行拉取、降级容错、摘要注入,全都压缩在这一个方法调用里。
来看一个具体场景。假设你在一家企业做内部知识库助手,有个员工连续问了三个关于 OA 系统的问题:
第 1 轮:OA 系统怎么提交加班申请? 第 2 轮:提交之后审批流程是怎样的? 第 3 轮:如果它超过三天没审批怎么办?
第 3 轮的“它”指的是加班申请,“三天没审批”承接了第 2 轮的审批流程。大模型的 API 每次请求都是独立的,它不记得之前聊了什么。如果你不把前两轮对话塞进去,模型看到的就只是一句“如果它超过三天没审批怎么办”——它不知道“它”是什么,也不知道审批是哪个审批。
这就是记忆要解决的核心问题:让每次独立的 API 调用看起来像一段连贯的对话。
但记忆不是无脑把所有历史都塞进去就完事了。塞多了 Token 预算爆了,加载慢了用户体验差,存储方案选错了扩展性堵死。本篇聚焦记忆的存储与加载——记忆从哪来、怎么存、怎么加载、怎么装进消息数组。至于记忆太长了怎么办——摘要压缩策略,那是下一篇的事。