Agent 记忆系统深度解析:从失忆到长记性的工程之路

Agent 记忆系统深度解析:从失忆到长记性的工程之路
Agent 记忆系统深度解析从失忆到长记性的工程之路没有记忆的 Agent每轮对话都是一次初次见面。有记忆的 Agent才能从工具进化为伙伴。前言记忆是 Agent 从工具到伙伴的分水岭没有记忆的 Agent用户我叫张三 Agent你好张三 用户我叫什么名字 Agent抱歉我不记得你刚才说了什么。请问你叫什么名字有记忆的 Agent用户我叫张三喜欢简洁的回复 Agent好的张三 用户帮我查一下今天的新闻 Agent张三以下是今天的新闻摘要... 记得用户的名字回复更简洁记忆就是 Agent 的持续性——让 Agent 不仅知道现在还知道过去。一、Agent 记忆的三层架构1.1 三层记忆模型┌─────────────────────────────────────┐ │ L1工作记忆上下文窗口 │ │ 当前对话内容、临时信息 │ │ 容量模型上下文窗口大小4K-200K │ │ 持久性一次推理 │ ├─────────────────────────────────────┤ │ L2短期记忆会话记忆 │ │ 当前会话的历史、状态 │ │ 容量不限但需要管理 │ │ 持久性一次会话 │ ├─────────────────────────────────────┤ │ L3长期记忆持久记忆 │ │ 用户偏好、知识、经验 │ │ 容量不限外部存储 │ │ 持久性永久 │ └─────────────────────────────────────┘1.2 各层的关系工作记忆L1正在处理的信息 ↓ 超出上下文窗口 → 压缩到短期记忆 短期记忆L2本次会话的信息 ↓ 会话结束 → 重要信息提升到长期记忆 长期记忆L3跨会话的信息 ↑ 需要时 → 检索到工作记忆二、工作记忆L1上下文窗口管理2.1 工作记忆的特点工作记忆就是模型的上下文窗口。它有两个硬约束容量有限4K-200K token2026年主流模型已支持128K-200K注意力不均匀中间信息容易被忽略Lost in the Middle现象2.2 工作记忆的内容管理classWorkingMemory:工作记忆管理def__init__(self,max_tokens128000):# 2026-07 更新默认值从32K调整为128Kself.max_tokensmax_tokens self.content[]defadd(self,item,prioritynormal):添加内容到工作记忆item_tokenscount_tokens(item)ifself.total_tokens()item_tokensself.max_tokens:self._evict(priority)self.content.append(item)def_evict(self,current_priority):淘汰低优先级内容# 优先级system tools memory history resultspriority_order[results,history,memory,tools,system]forpinpriority_order:ifpcurrent_priority:continuewhileself._has_priority(p):self._remove_oldest(p)ifself.total_tokens()self.max_tokens*0.8:returndefsummarize(self):压缩工作记忆为摘要promptf请将以下对话压缩为 200 token 以内的摘要\n{self.content}returnllm(prompt)三、短期记忆L2会话记忆3.1 短期记忆的实现classShortTermMemory:短期记忆会话级别的记忆def__init__(self):self.messages[]self.extracted_info{}# 从对话中提取的关键信息self.compressed[]# 压缩后的历史defadd_message(self,role,content):self.messages.append({role:role,content:content,timestamp:time.time(),})self._extract_info(role,content)def_extract_info(self,role,content):从对话中提取关键信息promptf 从以下对话中提取关键信息以 JSON 格式返回 角色{role}内容{content}提取的信息 - 用户偏好 - 提到的实体人名、地名、产品名 - 任务状态 - 重要决策 infollm(prompt)self.extracted_info.update(info)defget_context(self,max_tokens4000):获取用于 Agent 推理的短期记忆上下文# 1. 提取的关键信息info_contextformat_info(self.extracted_info)# 2. 最近的对话保留最近 3 轮recentself.messages[-6:]# 3 轮 6 条消息# 3. 压缩后的历史compressedself.compressed[-3:]returninfo_contextrecentcompressed3.2 记忆压缩classMemoryCompressor:记忆压缩策略defcompress(self,messages,max_tokens2000):压缩对话历史# 策略 1摘要压缩iflen(messages)10:summaryself._summarize(messages[:-5])returnsummarymessages[-5:]# 策略 2关键信息提取key_infoself._extract_key_info(messages)returnkey_infomessages[-3:]def_summarize(self,messages):promptf请用 100 字以内总结以下对话\n{messages}returnllm(prompt)def_extract_key_info(self,messages):promptf 从以下对话中提取关键信息{messages}输出格式JSON {{ user_preferences: [], completed_tasks: [], key_decisions: [], open_questions: [] }} returnllm(prompt)四、长期记忆L3持久记忆4.1 长期记忆的结构classLongTermMemory:长期记忆跨会话的持久记忆def__init__(self,vector_db,llm):self.vector_dbvector_db self.llmllmdefstore(self,session_id,memory_item):存储记忆# 1. 生成记忆摘要summaryself._summarize_memory(memory_item)# 2. 生成嵌入embeddingembed(summary)# 3. 存储到向量数据库self.vector_db.insert({id:fmem_{session_id}_{time.time()},type:memory_item[type],content:memory_item,summary:summary,embedding:embedding,timestamp:time.time(),importance:memory_item.get(importance,0.5),})defretrieve(self,query,k5,min_importance0.3):检索相关记忆query_embeddingembed(query)resultsself.vector_db.search(query_embedding,kk*2)# 按重要性过滤和排序results[rforrinresultsifr[importance]min_importance]results.sort(keylambdar:r[importance]*r[score],reverseTrue)returnresults[:k]defforget(self,older_than_days30):遗忘删除过期的低重要性记忆 2026-07 更新现代遗忘策略使用衰减地板模型 模拟艾宾浩斯遗忘曲线每次记忆被访问时强度提升 随时间推移按指数衰减当前强度 初始强度 × e^(-时间/半衰期) cutofftime.time()-older_than_days*86400self.vector_db.delete(filter{timestamp:{lt:cutoff},importance:{lt:0.5}})4.2 记忆的重要性评分classMemoryImportanceScorer:记忆重要性评分defscore(self,memory_item):promptf 评估以下记忆的重要性0-1{memory_item}评分维度 1. 情感强度是否涉及强烈情感 2. 事实性是否是重要事实 3. 时效性是否长期有效 4. 关联性是否与其他记忆相关 5. 使用频率是否被反复提及 returnllm(prompt)# 0-1 之间的分数五、记忆的检索与使用5.1 记忆检索策略classMemoryRetriever:综合记忆检索def__init__(self,working_mem,short_term,long_term):self.wmworking_mem self.stmshort_term self.ltmlong_termdefretrieve(self,query,context):检索所有层次的记忆memories[]# 1. 工作记忆当前上下文wm_itemsself.wm.get_relevant_items(query)memories.extend(wm_items)# 2. 短期记忆会话历史stm_itemsself.stm.get_context(query)memories.extend(stm_items)# 3. 长期记忆持久记忆ltm_itemsself.ltm.retrieve(query,k5)memories.extend(ltm_items)# 4. 排序和去重memoriesself._deduplicate(memories)memories.sort(keylambdam:m.get(relevance,0),reverseTrue)# 5. 限制上下文预算returnself._limit_context(memories,max_tokens2000)5.2 记忆的自动触发classMemoryTrigger:自动记忆触发def__init__(self,memory_system):self.memorymemory_systemdefon_user_input(self,user_input):用户输入时触发# 检查是否需要检索长期记忆ifself._needs_memory_retrieval(user_input):memoriesself.memory.retrieve(user_input)returnmemoriesreturn[]defon_task_complete(self,task,result):任务完成时触发# 判断是否值得记住ifself._is_worth_remembering(task,result):self.memory.store({type:task_result,task:task,result:result,importance:self._calculate_importance(task,result),})defon_error(self,error):错误发生时触发self.memory.store({type:error,error:str(error),importance:0.8,# 错误通常很重要})六、2026 年记忆系统趋势6.1 分层记忆融合不再把 L1、L2、L3 分开管理而是统一检索统一记忆 API query → 在所有层次中检索 结果按相关性和重要性排序 自动决定哪些记忆提升/降级6.2 记忆的自我进化Agent 可以自己管理自己的记忆Agent 自动做 - 判断什么信息值得记住 - 决定什么时候忘记 - 对记忆进行重组和关联 - 从记忆中提取模式6.3 记忆共享多 Agent 之间共享记忆Agent A 学会的知识 → 存入共享记忆库 Agent B 做类似任务 → 从共享记忆库检索6.4 记忆即基础设施Memory as Infrastructure2026年记忆系统正从应用层组件演进为基础设施层服务第三代记忆架构2026 Mem0 Cloud / Letta Cloud → 记忆即服务 Agent 只需调用 memory.store() / memory.retrieve() 底层的向量检索、重要性评分、遗忘策略全部由基础设施处理 支持跨Agent、跨平台的记忆共享代表项目LettaMemGPT22,000 Stars提供完整的Agent记忆管理框架Graphiti24,700 Stars基于时序知识图谱的记忆管理Mem0第三代记忆云服务支持多模态记忆存储OpenClaw LCM无损上下文管理通过摘要DAG实现压缩完整召回总结记忆层次存储位置容量持久性管理方式工作记忆L1上下文窗口有限128K-200K一次推理内容管理短期记忆L2内存/会话较大一次会话压缩管理长期记忆L3外部存储无限永久检索遗忘重要性记忆权重--评分筛选好的记忆系统让 Agent 从每次都重新开始变成越来越了解你。下一篇文章我们将深入工具系统与 MCP 协议。思考题你的 Agent 现在有长期记忆吗如果有是怎么实现的记忆的重要性评分应该由模型决定还是由规则决定为什么如果 Agent 的记忆太多了检索结果中大部分都不相关你怎么办上一篇[30] 从 Agent 到 Agentic Workflow下一篇[32] 工具系统与 MCP 协议

最新新闻

日新闻

周新闻

月新闻