大模型根本没有记忆,那 AI 到底是怎么“记住“你的?

📅 2026/7/22 16:25:43 ✍️ 编辑团队 👁️ 阅读次数
大模型根本没有记忆,那 AI 到底是怎么“记住“你的?
01、“你不是说过吗”一次让人血压升高的对话INCIDENT · 虾粥事故你上午跟一个智能体客服聊天告诉它“我叫小林对海鲜过敏麻烦帮我订餐的时候都避开海鲜。”它痛快答应了。你俩又聊了十几轮敲定了各种细节。下午你回来接着聊问它“对了帮我加一份今晚的宵夜。”它兴高采烈地说“好的小林为您推荐鲜虾粥鲜美滋补”你人都麻了我早上刚说过对海鲜过敏啊这不是它笨而是它压根不记得你说过这句话。因为对大模型来说“记忆”这个词本身就是个精心营造的幻觉。我们今天就来彻底聊清楚智能体的记忆到底是怎么一回事为什么会遗忘以及怎么亲手给它装一套靠谱的记忆系统。02、拆穿真相模型压根没有“记忆”这回事TRUTH · 无状态本质先说一个可能颠覆你认知的事实大模型本身是彻底无状态stateless的它不像人一样脑子里有个记忆区随着对话推移不断往里存东西。每一次你调用模型的接口它都是一张白纸它之所以看起来“记得”你之前说的话纯粹是因为你把完整的历史对话一字不落地重新打包发给了它。这就好比你每次跟一个刚认识的陌生人聊天都得先把你俩之前聊过的所有内容从头到尾给他念一遍念完了他才能接着往下聊。他表现得“记得”其实只是因为你每次都把“记忆”原原本本地塞回他脑子里而已。代码层面这个“塞记忆”的动作长这样你在前几篇里应该也见过messages [ {role: user, content: 我叫小林对海鲜过敏}, {role: assistant, content: 好的小林我记住啦避开海鲜}, {role: user, content: 帮我订个午餐吧}, # ... 中间可能还有几十条历史消息 # 最新一条消息 {role: user, content: 帮我加一份今晚的宵夜}, ]只要“我叫小林对海鲜过敏”这句话一直老老实实地待在 messages 列表里被完整传给模型模型就“记得”。一旦这条消息因为某种原因被漏掉、被截断、被删掉模型立刻失忆态度诚恳地给你推荐一碗虾粥。问题来了为什么会漏掉答案是上下文窗口是有限的对话不可能无限往里塞。这就引出了第一个核心问题短期记忆该怎么管理。03、短期记忆对话历史膨胀之后怎么办SHORT-TERM · 滑窗与摘要假设用户和智能体聊了一整个下午几百轮对话messages 列表已经长得吓人。这时候会出现两个实打实的问题1.成本爆炸每次调用都要把几百轮历史重新发一遍给模型Token 消耗蹭蹭涨你的 API 账单会很难看。2.“迷失在中间”问题学术界有研究发现当上下文特别长时模型对塞在中间部分的信息注意力和准确率会明显下降它更容易记住最近说的话和最开始说的话中间那一大坨反而容易被“模糊处理”掉。那怎么办业界常见的几种思路我按“简单粗暴”到“精细讲究”的顺序给你排一下方案一 滑动窗口Sliding Window最简单粗暴只保留最近 N 轮对话更早的直接砍掉。好处是实现简单、成本可控坏处是砍掉的内容彻底丢失。方案二 摘要压缩Summarization让模型自己把“要被挤出窗口”的旧对话浓缩成一段简短摘要替代掉那一大坨原始历史记录。坏处是压缩本身也要调用一次模型有额外开销。方案三 滑动窗口摘要混合实际项目里最常见的做法永远保留最近 K 轮原始对话K 轮之前的所有内容滚动压缩进一条摘要。既控制成本又不至于把关键信息彻底丢掉。我们直接手写一版第三种方案用 deepseek-v4-flash 来实现from openai import OpenAI client OpenAI( api_keysk-xxxx, base_urlhttps://api.deepseek.com, ) class ConversationMemory: 短期记忆管理保留最近 K 轮原始对话更早的滚动压缩成摘要 def __init__(self, keep_recent_turns: int 6): self.keep_recent_turns keep_recent_turns self.summary # 滚动摘要一直挂在最前面 self.recent_messages [] # 最近的原始对话保留细节 def add(self, role: str, content: str): self.recent_messages.append( { role: role, content: content, } ) # 超出保留轮数时把最老的一轮压缩进摘要 if len(self.recent_messages) self.keep_recent_turns * 2: self._compress_oldest() def _compress_oldest(self): # 把最老的 2 条消息一问一答算一轮拿出来准备压缩 old_turn self.recent_messages[:2] self.recent_messages self.recent_messages[2:] old_text \n.join( f{message[role]}: {message[content]} for message in old_turn ) prompt f已有的历史摘要{self.summary or 无} 新增的一轮对话 {old_text} 请把已有摘要和新增对话融合成一段新的、简洁的摘要 只保留对后续对话有用的关键事实比如用户偏好、已确认的结论 去掉寒暄和无关细节控制在 100 字以内。 response client.chat.completions.create( modeldeepseek-v4-flash, messages[ { role: user, content: prompt, } ], ) self.summary response.choices[0].message.content def build_messages(self, system_prompt: str ): 组装最终要发给模型的完整消息列表 messages [] if system_prompt: messages.append( { role: system, content: system_prompt, } ) if self.summary: messages.append( { role: system, content: f以下是本次对话此前的关键信息摘要{self.summary}, } ) messages.extend(self.recent_messages) return messages # ------- 使用示例 ------- memory ConversationMemory(keep_recent_turns3) memory.add( user, 我叫小林对海鲜过敏麻烦订餐都避开海鲜, ) memory.add( assistant, 好的小林我记住了会全程避开海鲜类菜品, ) # ……假设中间又聊了很多轮触发了自动压缩…… memory.add( user, 帮我加一份今晚的宵夜, ) messages memory.build_messages( system_prompt你是一个贴心的订餐助手, ) response client.chat.completions.create( modeldeepseek-v4-flash, messagesmessages, ) print(response.choices[0].message.content)有了这套机制就算原始对话被挤出了滑动窗口“用户叫小林对海鲜过敏”这个关键事实也会被沉淀在滚动摘要里一直挂在每次请求的最前面模型就不会闹出推荐虾粥这种笑话了。04、长期记忆跨越“这一次对话”的边界LONG-TERM · 极简检索式记忆短期记忆解决的是“这一次对话别遗忘”但还有一个更大的问题用户下次打开一个全新的对话窗口智能体还能记得他对海鲜过敏吗答案是如果你只做了上面那套短期记忆那不能因为一旦对话窗口关闭recent_messages 和 summary 全都灰飞烟灭了。要跨越“这一次对话”的边界你需要一套持久化的长期记忆把关键信息真正存到硬盘或数据库里供未来任意一次新对话调用。长期记忆最常见的实现思路是“存文本 存向量需要时按相似度检索”业界管这个叫 RAG检索增强生成的一种简化应用。别被“向量数据库”这种听起来很唬人的词吓到我们不依赖任何框架纯手写一个极简版本你就能彻底看懂它的原理import math from collections import Counter class LongTermMemory: 极简长期记忆手写 RAG 的核心——存文本向量检索时按相似度取回。 不依赖任何向量数据库/框架向量就是一个普通的词频字典 检索就是算余弦相似度后排序取 top_k。原理和真实系统一模一样 只是把 embedding 模型换成了最朴素的词频统计。 def __init__(self): self.records [] # 每条记忆{text: 原文, vector: 词频向量} def _vectorize(self, text: str) - Counter: 把文本变成向量。真实系统这里调用 embedding 模型 返回一个几百/上千维的浮点数组这里简化成每个字出现几次。 return Counter(text) def _cosine_similarity(self, vec_a: Counter, vec_b: Counter) - float: 两个向量的夹角余弦值衡量有多相似范围 [0, 1]。 common set(vec_a) set(vec_b) dot sum(vec_a[k] * vec_b[k] for k in common) norm_a math.sqrt(sum(v ** 2 for v in vec_a.values())) norm_b math.sqrt(sum(v ** 2 for v in vec_b.values())) if norm_a 0 or norm_b 0: return 0.0 return dot / (norm_a * norm_b) def store(self, text: str): 存文本 向量一起存进去。 self.records.append({text: text, vector: self._vectorize(text)}) def retrieve(self, query: str, top_k: int 2) - list: 检索把 query 也变成向量跟库里每条记忆算相似度 取分数最高的 top_k 条返回。 query_vec self._vectorize(query) scored [ (self._cosine_similarity(query_vec, r[vector]), r[text]) for r in self.records ] scored.sort(keylambda x: x[0], reverseTrue) return [text for score, text in scored[:top_k] if score 0] # ------- 使用示例 ------- if __name__ __main__: memory LongTermMemory() memory.store(用户小林对海鲜过敏) memory.store(用户小林喜欢清淡口味不吃辣) memory.store(用户小林的收货地址是望京SOHO) query 用户对什么食物过敏 print(检索结果, memory.retrieve(query))真实项目里这一步通常会换成正经的 embedding 模型比如把文本转换成一个几百维的语义向量检索效果会比这种朴素的“字频统计”精准得多。但核心思路完全一致把过去的关键信息存起来等新对话开始时用当前问题去检索最相关的几条塞进给模型的上下文里让它“回忆”起相关的往事。05、记忆不是越多越好有时候它是个负担PITFALLS · 三个反直觉的坑讲到这里你可能觉得“那我把所有对话都存进长期记忆不就万事大吉了”千万别这么干。记忆这东西用不好反而会拖累智能体有三个具体的坑坑一噪音干扰 如果把用户随口一提的闲聊、无关紧要的寒暄也一股脑存进长期记忆检索的时候大概率会捞出一堆不相关的垃圾信息反而让模型的回答变得答非所问。记忆系统应该有意识地只存“关键事实”用户偏好、已确认的结论、重要的约定而不是有闻必录。坑二幻觉放大 如果检索出来的历史记忆本身就是错的比如很久以前模型自己说错了一句话被当成“事实”存了下来后续对话会一直被这个错误信息误导越陷越深形成“错误的记忆→错误的回答→再次巩固错误记忆”的恶性循环。坑三成本与延迟 检索这个动作本身也需要时间和计算资源塞进上下文的每一条记忆都占用 Token 预算。不是记得越多就越“智能”很多时候克制地遗忘才是让智能体保持敏捷和聚焦的关键。人类大脑其实也是这样我们的大脑每天都在主动“删除”大量不重要的信息这不是缺陷而是一种进化出来的智慧。下一步光会记还不够SUMMARY · 写在最后这一篇我们解决了“记不住”的问题和短期靠滑动窗口摘要压缩长期靠检索式记忆存取。但你可能已经想到了如果任务本身特别复杂需要提前规划好几个步骤记忆再好也没用因为问题根本不在于“记不记得住”而在于“一开始就没想清楚该怎么拆解这个任务”。比如用户说“帮我调研一下今年新能源汽车电池技术的最新进展写一份两千字的报告。”这种任务光靠 ReAct 那种“走一步看一步”的循环很容易越走越偏缺乏一个全局的执行蓝图。学习资源推荐如果你想更深入地学习大模型以下是一些非常有价值的学习资源这些资源将帮助你从不同角度学习大模型提升你的实践能力。一、全套AGI大模型学习路线AI大模型时代的学习之旅从基础到前沿掌握人工智能的核心技能​因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获取二、640套AI大模型报告合集这套包含640份报告的合集涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师还是对AI大模型感兴趣的爱好者这套报告合集都将为您提供宝贵的信息和启示​因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获取三、AI大模型经典PDF籍随着人工智能技术的飞速发展AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型如GPT-3、BERT、XLNet等以其强大的语言理解和生成能力正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获取四、AI大模型商业化落地方案作为普通人入局大模型时代需要持续学习和实践不断提高自己的技能和认知水平同时也需要有责任感和伦理意识为人工智能的健康发展贡献力量。