AI Agent 核心架构长期记忆Long-term Memory全解析与面试通关指南在前面的文章中我们聊过了“短期记忆滑动窗口”它能让大模型记住刚刚聊过的几句话。但是如果你的 AI 助理需要记住你一个月前提出的偏好或者需要记住公司那厚达 500 页的规章制度短期记忆就完全不够用了。这时候大模型的“办公桌”放不下那么多文件了我们需要给它建一个**“档案馆”**——这就是长期记忆Long-term Memory。在企业级 AI 面试中涉及到“知识库”、“RAG检索增强生成”和“个人助理”的项目100% 会考到长期记忆系统。这篇文章将用大白话带你彻底搞懂长期记忆的底层机制并附带手写向量数据库的面试加分代码 一、 什么是长期记忆大白话秒懂通俗概念长期记忆是 Agent 用来存储海量、非结构化历史信息的仓库。当你告诉 Agent “我叫张三我对海鲜过敏”时Agent 不会把这句话永远放在每次聊天的 Prompt 里那太贵了而是把它翻译成一串数字向量存进它的大脑深处向量数据库。过了几个月当你问它“今晚去吃海鲜大排档怎么样”时Agent 会瞬间在茫茫记忆海中把“张三对海鲜过敏”这条记忆捞出来并拒绝你的提议。核心痛点与解法痛点硬盘容量是无限的但大模型的脑容量Token 窗口是极其有限且昂贵的。解法按需提取RAG。平时把所有记忆存在外部数据库里只有当用户当前的问题和某段记忆“高度相关”时才把那段记忆提取出来临时放到大模型的“办公桌”上。⚙️ 二、 长期记忆的核心运转流程面试必背工业界实现长期记忆标准的流水线通常包含以下两步1. 记忆写入Storage当有新的事实需要记忆时比如用户说了一句重要的自我介绍或者录入了一份新文档Embedding (向量化)把这段自然语言文本扔给一个专门的 Embedding 模型把它变成一个高维度的数学坐标比如 512 维的浮点数数组。入库把这段原始文本和它对应的数学坐标一起存入向量数据库Vector DB如 Milvus, Qdrant, Chroma中。2. 记忆提取Retrieval当用户提出新问题时问题向量化把用户当前的问题也用同一个 Embedding 模型变成数学坐标。相似度计算在向量数据库里寻找看看哪个历史记忆的坐标离当前问题的坐标距离最近通常计算余弦相似度。生成回答把距离最近的那条记忆提取出来拼接到 Prompt 里让大模型参考着回答。 三、 高频面试 QA 实战演练Q1短期记忆和长期记忆在架构上最本质的区别是什么标准答案存储介质不同短期记忆通常存在内存数据库如 Redis中按会话Session隔离长期记忆存在磁盘或分布式的向量数据库Vector DB中持久化保存。读写机制不同短期记忆是“无脑全量附加”或“滑动窗口裁剪”直接塞给大模型长期记忆必须经过“Embedding 向量化→\rightarrow→相似度检索”的过滤过程实现按需提取。Q2如果用户的喜好变了记忆发生冲突长期记忆系统该怎么处理比如之前说喜欢吃辣现在说得了胃溃疡不能吃辣了。标准答案这是 RAG 记忆系统的高级难题。通常有两种解决策略时间戳衰减Time-weighted Retrieval给每条存入的记忆打上时间戳。在检索打分时不仅看“语义相似度”还要看“时间新鲜度”。越新的记忆权重越高从而覆盖旧记忆。记忆反思与合并Memory Reflection在后台跑一个定时任务让大模型定期去巡检向量库里的记忆。如果发现同一个实体如“用户的口味”出现了两条矛盾的记录让大模型自己做一次总结生成一条新的记忆“用户以前喜欢吃辣但现在因为胃溃疡不能吃了”然后对旧记忆进行软删除。Q3除了向量检索现在的长期记忆还有别的实现方式吗标准答案有知识图谱Knowledge Graph Memory / GraphRAG。向量检索擅长“模糊匹配”但对实体之间的复杂关联比较弱。现在很多大厂在个人助理 Agent 中会在后台让 LLM 把对话抽取成三元组如[用户] - [拥有宠物] - [哈士奇]存入图数据库。当遇到“多跳逻辑推理”的问题时图谱记忆的准确率远高于向量记忆。真实生产中通常是Vector Graph 混合检索。 四、 面试加分代码手写一个极简的“长期记忆向量检索库”在面试中如果你能用纯 Python 和numpy演示出 Embedding 和余弦相似度检索的过程面试官会认为你彻底吃透了底层原理# 运行前需安装依赖: pip install sentence-transformers numpyimportnumpyasnpfromsentence_transformersimportSentenceTransformerclassLongTermMemorySystem: 工业级 Agent 长期记忆系统 (概念演示版) 利用 Embedding 模型将文本转化为向量并利用余弦相似度进行检索。 def__init__(self,model_nameBAAI/bge-small-zh-v1.5):print(⏳ 正在加载记忆中枢 (Embedding 模型)...)# 加载轻量的文本转向量模型self.encoderSentenceTransformer(model_name)# 记忆仓库存放原始文本self.memory_texts[]# 向量仓库存放对应的数学坐标self.memory_vectors[]def_cosine_similarity(self,vec1:np.ndarray,vec2:np.ndarray)-float: 核心数学原理计算两个向量的余弦相似度 值越接近 1说明两句话的意思越相近。 # 公式: A·B / (|A| * |B|)returnnp.dot(vec1,vec2)/(np.linalg.norm(vec1)*np.linalg.norm(vec2))defsave_memory(self,text:str): 把新的事实写入长期记忆 (存储层) # 1. 把自然语言翻译成高维向量vectorself.encoder.encode(text)# 2. 存入数据库self.memory_texts.append(text)self.memory_vectors.append(vector)print(f [记忆写入] 成功将事实存入大脑深处: {text})defretrieve_memory(self,query:str,top_k:int1)-str: 根据当前的问题唤醒最相关的长期记忆 (检索层) ifnotself.memory_texts:return记忆库为空。print(f\n [记忆唤醒] 用户提问: {query} - 正在记忆海中搜索相关线索...)# 1. 把当前问题也变成向量query_vectorself.encoder.encode(query)# 2. 遍历记忆库计算当前问题和所有历史记忆的相似度best_score-1.0best_memoryfori,mem_vecinenumerate(self.memory_vectors):scoreself._cosine_similarity(query_vector,mem_vec)# 记录得分最高的记忆ifscorebest_score:best_scorescore best_memoryself.memory_texts[i]print(f✅ [命中记忆] 相似度得分:{best_score:.4f}| 提取内容: {best_memory})returnbest_memory# # 模拟运行与面试讲解# if__name____main__:agent_memoryLongTermMemorySystem()print(-*40)# 场景几个月前用户和 Agent 闲聊时留下了一些零散的信息agent_memory.save_memory(我的老板叫李建国他非常严厉。)agent_memory.save_memory(我经常去的咖啡店是楼下的星巴克。)agent_memory.save_memory(我对芒果和花生过敏千万不能碰。)agent_memory.save_memory(公司大门的密码是 882255。)print(-*40)# 场景几个月后用户向 Agent 提出需求user_prompt_1我想点一杯下午茶送到公司大门门禁密码是多少来着# Agent 触发长期记忆检索retrieved_info_1agent_memory.retrieve_memory(user_prompt_1)user_prompt_2帮我订一份明天的午餐外卖想吃点泰国菜或者热带水果沙拉。retrieved_info_2agent_memory.retrieve_memory(user_prompt_2)# 面试讲解要点# 通过这段代码可以看到长期记忆的本质就是一次 RAG检索增强生成过程。# 当用户提到热带水果沙拉时底层模型将这句话映射到了高维空间# 并发现它与我对芒果过敏这句话的坐标距离最近因为芒果属于热带水果。# 于是系统将过敏信息捞出来放入 Prompt 中大模型看到后就会在点餐时主动避开芒果。# 这就是 AI 助理能够显得‘极具人情味’且‘仿佛认识你很久’的底层技术秘密。