agent面试必备39-AI Agent 核心架构:长期记忆(Long-term Memory)

📅 2026/7/18 5:43:33 👁️ 阅读次数 📝 编程学习
agent面试必备39-AI Agent 核心架构:长期记忆(Long-term Memory)

📚 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 里,让大模型参考着回答。

🎯 三、 高频面试 Q&A 实战演练

Q1:短期记忆和长期记忆在架构上最本质的区别是什么?

标准答案

  • 存储介质不同:短期记忆通常存在内存数据库(如 Redis)中,按会话(Session)隔离;长期记忆存在磁盘或分布式的向量数据库(Vector DB)中,持久化保存。
  • 读写机制不同:短期记忆是“无脑全量附加”或“滑动窗口裁剪”,直接塞给大模型;长期记忆必须经过“Embedding 向量化→\rightarrow相似度检索”的过滤过程,实现按需提取。

Q2:如果用户的喜好变了(记忆发生冲突),长期记忆系统该怎么处理?比如之前说喜欢吃辣,现在说得了胃溃疡不能吃辣了。

标准答案
这是 RAG 记忆系统的高级难题。通常有两种解决策略:

  1. 时间戳衰减(Time-weighted Retrieval):给每条存入的记忆打上时间戳。在检索打分时,不仅看“语义相似度”,还要看“时间新鲜度”。越新的记忆权重越高,从而覆盖旧记忆。
  2. 记忆反思与合并(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_name="BAAI/bge-small-zh-v1.5"):print("⏳ 正在加载记忆中枢 (Embedding 模型)...")# 加载轻量的文本转向量模型self.encoder=SentenceTransformer(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. 把自然语言翻译成高维向量vector=self.encoder.encode(text)# 2. 存入数据库self.memory_texts.append(text)self.memory_vectors.append(vector)print(f"💾 [记忆写入] 成功将事实存入大脑深处: '{text}'")defretrieve_memory(self,query:str,top_k:int=1)->str:""" 根据当前的问题,唤醒最相关的长期记忆 (检索层) """ifnotself.memory_texts:return"记忆库为空。"print(f"\n🔍 [记忆唤醒] 用户提问: '{query}' -> 正在记忆海中搜索相关线索...")# 1. 把当前问题也变成向量query_vector=self.encoder.encode(query)# 2. 遍历记忆库,计算当前问题和所有历史记忆的相似度best_score=-1.0best_memory=""fori,mem_vecinenumerate(self.memory_vectors):score=self._cosine_similarity(query_vector,mem_vec)# 记录得分最高的记忆ifscore>best_score:best_score=score best_memory=self.memory_texts[i]print(f"✅ [命中记忆] 相似度得分:{best_score:.4f}| 提取内容: '{best_memory}'")returnbest_memory# ==========================================# 模拟运行与面试讲解# ==========================================if__name__=="__main__":agent_memory=LongTermMemorySystem()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_1=agent_memory.retrieve_memory(user_prompt_1)user_prompt_2="帮我订一份明天的午餐外卖,想吃点泰国菜或者热带水果沙拉。"retrieved_info_2=agent_memory.retrieve_memory(user_prompt_2)# 💡 面试讲解要点:# "通过这段代码可以看到,长期记忆的本质就是一次 RAG(检索增强生成)过程。# 当用户提到'热带水果沙拉'时,底层模型将这句话映射到了高维空间,# 并发现它与'我对芒果过敏'这句话的坐标距离最近(因为芒果属于热带水果)。# 于是系统将过敏信息捞出来放入 Prompt 中,大模型看到后,就会在点餐时主动避开芒果。# 这就是 AI 助理能够显得‘极具人情味’且‘仿佛认识你很久’的底层技术秘密。"