刚接触大模型业务开发的朋友,尤其是做产品设计的,经常会抛出一个直击灵魂的问题:“既然叫人工智能,为什么它不能像人一样,聊过天就自动记住?非得每次都在代码里把历史聊天记录重新传一遍,这也太不合理了吧?”
说实话,我刚开始搞大模型接入的时候也这么想过。但真到了工程落地上,你会发现大模型不带记忆,并不是技术上做不到,而是不敢这么做。
一旦把大模型做成自带物理记忆的,整个系统的可用性、安全性和成本立马就会彻底失控。
目前业界解决 AI 记忆,无非就三条路:模型微调,强行把记忆写进参数里;无限拉长上下文窗口,硬塞历史记录;外部存储挂载,通过外挂数据库来管记忆。
在真实的企业级应用里,外部存储挂载是唯一的正解。保持大模型的绝对无状态,是让系统能长久活下去的底线要求。
为什么不能让大模型自己去记?
说白了,大模型就是一个极其庞大的、固化的纯数学函数。
你给它一个输入,它在内部跑几百亿个参数的矩阵乘法,吐出一个输出。只要参数不动,同样的输入永远是同样的输出。如果你想让它在物理层面上“记住”刚才说的话,就意味着每一次对话,都要触发一次反向传播去更新这几百亿个权重参数。
先不说现在的技术能不能做到实时更新,哪怕能做到,这种单次对话级别的 GPU 计算开销也能直接把公司搞破产。这还涉及智能 & 数据 & 云层面上的算力调度与成本控制难题。
更致命的是数据越权和隔离问题。假设你的模型通过改参数记住了张三的隐私数据,等李四来提问的时候,模型极有可能顺嘴就把张三的隐私给吐出来了。在企业级应用里,这种跨租户的数据泄露绝对是不可触碰的红线。
无限拉长上下文窗口可行吗?
既然不能改参数,那现在很多模型动不动支持 100 万、200 万的 Token 上下文,我把用户过去一年的聊天记录全作为 Prompt 塞进去不就行了?
这是典型的偷懒思维。
上下文越长,大模型处理首个 Token 的耗时就越长。而且无论你是调 API 还是本地部署,显存和计费都是按 Token 数量来的。为了问一句“今天天气怎么样”,你把过去半年的废话全传过去,不仅响应慢如蜗牛,算力成本也高到离谱。从后端 & 架构的角度看,这种设计完全违背了高并发系统对时延与吞吐的基本要求。
外部存储挂载:计算与存储分离
大厂现在不管是用 RAG 还是外挂 Redis 来做记忆,本质上都遵循了分布式系统最核心的设计美学:计算与存储分离。
大模型应该只负责推理。
用户的长期记忆,我们用向量数据库存起来;短期对话,我们用 Redis 存起来。我们在业务代码里,真正需要的记忆逻辑其实非常朴素:把大模型当成一个没有感情的推理器,记忆由咱们自己的业务数据库来管。这里的数据库/中间件/技术栈选型直接决定了记忆系统的可靠性与扩展能力。
看下面这段伪代码,这就是线上的核心心法:
// 核心心法:大模型必须是无状态的,记忆永远存在外部数据库里
public String chatWithMemory(String userId, String userMessage) {
// 1. 从我们自己的数据库里,把这个用户之前的聊天记录捞出来
List<Message> history = memoryDb.getHistory(userId);
// 2. 把历史记录和当前的新问题,拼装成一个完整的上下文
List<Message> context = buildContext(history, userMessage);
// 3. 把整个上下文发给无状态的大模型,它只负责这一次的推理
String response = llmClient.call(context);
// 4. 把大模型的回答存进数据库,作为下一次的“记忆”
memoryDb.save(userId, userMessage, response);
return response;
}
逻辑非常直白,没有任何黑盒。
这样做最大的好处是系统极其稳定可控。因为状态都在你自己的数据库里,大模型永远是无状态的。你可以今天用 OpenAI,明天无缝切换成 DeepSeek,甚至在流量高峰期随时横向扩容 100 个模型节点来抗并发。
历史记忆太多怎么兜底?
肯定有后端同学会问,每次都要去查数据库再拼装,如果历史记录太多,拼出来的上下文依然很大怎么办?
这就到了考验业务侧架构能力的时候了。在实际的业务落地中,我们绝对不会把所有历史都无脑传过去。
常用的手段是做“记忆滑动窗口”,比如按 Token 截断,只传最近的 5 轮对话;对于更长的历史,我们会写个后台定时任务,调用便宜的小模型把过去的长对话压缩总结成一段 100 字的摘要,下次提问时只带摘要进去。
把这些状态的控制权死死捏在业务代码手里,远比扔给一个不可控的 AI 黑盒要踏实得多。
说在最后
非要让大模型拥有人类一样的物理记忆,就是把系统最核心的状态管理交给了最不可控的环节。一旦记忆出现混乱、幻觉或者越权,你连个排查日志的地方都找不到。
接受大模型的无状态设定,用成熟的传统数据库去管理记忆,单纯把它当成一个推理引擎来用,这才是工程落地该有的姿势。
这么多年搞后端的经验告诉我一条死理,也是任何分布式系统的架构红线:绝对不要让昂贵的计算节点去保存业务状态。
把状态沉淀到数据库,把逻辑留在代码里,把推理交给大模型。边界清晰了,系统才能安安稳稳。
在云栈社区的技术讨论中,我们始终强调这种架构分层的重要性:无状态的计算层搭配有状态的存储层,正是现代人工智能应用能够规模化落地的关键所在。