问题从哪里来
在我们开始构建 AI 智能问答系统的时候,遇到了一个很典型的产品问题: 当用户在一个客服会话里聊了二十几轮之后,AI 突然"失忆"了—— 它不知道用户刚才说过自己是会员,不知道对话刚才讨论的是哪个订单。
用户的反馈很直接:"你为什么不记得我刚才说的话?"
这是 LLM 的上下文窗口限制导致的。当前主流模型的上下文窗口在 8K 到 128K token 不等,一旦对话超出窗口,最早的内容就会被截断丢弃。 对于企业级 AI 客服场景,这是一个无法接受的体验问题。
产品层面的核心问题不是"怎么扩大上下文窗口",而是"怎么让用户感知不到窗口的存在"。
三层记忆架构的设计思路
我们借鉴了人类记忆的分层结构,设计了 L1 短期会话 / L2 长期向量记忆 / L3 用户画像 三层架构。 每一层解决不同时间维度的"记忆"问题。
L1:短期会话记忆
L1 是最直接的层,就是把最近 N 轮对话直接放进 LLM 的 Context 里。 这里的关键决策是 N 取多少。
太少(比如 5 轮):用户感觉 AI 健忘;太多(比如 50 轮):Context 很快被填满,而且很多内容是无效的填充。 我们最终选择了 最近 12 轮,配合 token 数量上限双重控制——无论哪个先触发,都触发压缩流程。
L2:长期向量记忆
当一个用户今天问了关于退款的问题,三天后又来问,AI 应该能感知到这是同一个人的同一个问题链。 L2 解决的是跨会话的记忆问题。
实现上,我们在每次对话结束后(异步,不阻塞主流程),
将对话摘要通过 bge-m3 模型 Embedding 成向量,
存入 SQL Server 2025 的原生向量类型(我们刻意避开了引入独立向量数据库的运维复杂度)。
检索时,用用户当前输入的向量做语义检索,召回最相关的历史记忆片段, 作为额外上下文注入 L1 的 Context 里。
L3:用户画像
L3 是最"产品感"的一层。我们维护了一个结构化的用户画像:
- 身份信息:会员等级、注册时长、历史消费
- 偏好信息:惯用语言风格(正式 / 口语)、关注的产品品类
- 问题类型分布:这个用户历史上 80% 的问题都是关于物流的
L3 的数据在每轮对话结束后增量更新,并在每次对话开始时以结构化 Prompt 的形式注入 Context 的系统提示区。 这让 AI 从第一句话就能"认识"这个用户。
几个关键的产品决策
1. 用户感知不到窗口切换是核心设计目标
所有技术方案都服务于这一个产品目标。衡量方式很简单: 在 UAT 测试中,让测试人员聊 30 轮以上,看他们能不能感知到"AI 重置了"。 达标标准是:100 个测试用例中,感知到断裂的不超过 5 个。
2. 压缩摘要的质量是瓶颈
L1 → L2 的压缩摘要质量直接影响长期记忆的可用性。 我们花了大量时间在摘要 Prompt 的调优上,最终确定了一套 强制保留关键实体(订单号、问题类型、未解决事项) 的摘要格式。
3. 多租户数据隔离不能妥协
我们的系统服务多个企业客户,每个企业的用户记忆数据必须严格隔离。 在 L2 和 L3 的存储层,我们实现了 JWT + 行级数据隔离, 确保一个租户的 AI 绝对无法访问另一个租户的记忆数据。
落地结果
上线后我们监控了三个核心指标:
- 会员自助解决率:65%——上线前这个数字接近 0(全人工)
- 客服工单量降低 30%——高频简单问题被 AI 消化,人工客服可以专注复杂案例
- 用户满意度(点赞率):87%——多轮对话体验的满意度是关键驱动因素
总结
LLM 记忆问题的本质是一个产品体验问题,而不仅仅是技术问题。 技术上有很多方案,但哪个方案最终被选择,取决于产品目标—— 我们要的是"用户感知不到窗口切换",而不是"上下文窗口最大化"。
三层记忆架构是在当前约束下(成本、运维复杂度、团队能力)达到产品目标的最优解。 如果你在构建类似的系统,希望这篇文章对你有参考价值。
欢迎通过邮件和我交流:shaoyanyan91@163.com
本文首发于邵炎炎个人博客。转载请注明出处。