尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

AI代理三层记忆系统:从瞬时到长期,打造有记忆的智能助手

AI代理三层记忆系统:从瞬时到长期,打造有记忆的智能助手 1. 项目概述为什么AI代理需要“记忆”最近在折腾AI代理Agent开发的朋友可能都遇到过同一个让人头疼的问题你精心设计的智能助手在每次对话时都表现得像个“金鱼”——只有七秒记忆。你告诉它你的名字、职业偏好、项目背景它当时回应得头头是道。可一旦对话轮次稍长或者你隔天再打开它又变回了一张白纸一切都要从头再来。这种体验就像和一个永远记不住你喜好的客服聊天效率低下体验割裂。这正是“OpenClaw 三层记忆系统”要解决的核心痛点。这个项目不是一个全新的底层框架而是一套构建在现有大语言模型LLM和向量数据库技术之上的、高度结构化的记忆工程实践方案。它借鉴了人类记忆的“感觉记忆-短时记忆-长时记忆”模型为AI代理设计了一套分层的、可检索、可演化的记忆机制。简单来说它的目标就是让AI代理能真正“记住”与用户的每一次互动形成持续、连贯的个性化服务能力。想象一下一个帮你管理日程的AI代理不仅能记住你下周二的会议还能记住你“讨厌在早上九点前开会”的偏好并在下次安排时主动避开。或者一个学习助手能记住你上周在哪个知识点上卡了壳这次直接提供针对性的练习。这就是“记忆”带来的质变从一次性的问答工具进化为真正理解你、伴随你成长的数字伙伴。这套系统之所以叫“三层”是因为它将记忆分为了瞬时记忆Working Memory、短期记忆Short-term Memory和长期记忆Long-term Memory。每一层都有不同的存储介质、刷新机制和检索策略共同协作确保关键信息不被遗忘同时避免内存被无关的细节塞满。接下来我们就深入这套系统的内部看看每一层是如何工作的以及如何亲手将它搭建起来。2. 三层记忆系统的核心架构与设计哲学2.1 记忆分层从“闪存”到“硬盘”的智能调度理解三层记忆系统最好的类比就是计算机的存储体系。我们的目标是以最低的“算力成本”和“存储成本”实现最高效的“信息可用性”。第一层瞬时记忆Working Memory这相当于计算机的CPU寄存器或高速缓存L1/L2 Cache。它的容量极小但速度极快存放的是当前对话轮次中直接相关的上下文。在技术实现上它通常就是大语言模型如GPT-4、Claude-3的上下文窗口Context Window。这一层记忆是“易失性”的随着对话的推进旧的信息会被新的信息挤出窗口。它的设计关键是精准的上下文管理如何把最相关、最重要的历史对话片段以最精炼的形式保留在有限的窗口内。常见的策略包括对话总结Summarization、关键信息提取Key Info Extraction和最近优先Recency Bias等。第二层短期记忆Short-term Memory这相当于计算机的内存RAM。容量比瞬时记忆大得多可以存储过去几个小时甚至几天的交互细节但访问速度稍慢。在OpenClaw的实践中短期记忆通常由一个快速的向量数据库如Chroma, Pinecone, Weaviate或高性能键值对存储如Redis来承担。所有未被总结或提炼的原始对话片段、用户临时偏好、会话状态等都会先进入这里。短期记忆的核心功能是快速检索与关联。当用户提到“我昨天说的那个项目”系统能立刻从短期记忆中找出相关的对话记录并注入到当前的瞬时记忆上下文中。第三层长期记忆Long-term Memory这相当于计算机的硬盘HDD/SSD或归档存储。容量近乎无限用于存储经过高度提炼、压缩的“核心知识”和“用户画像”。例如用户的职业、长期偏好、重要的人生事件、学习过的核心概念等。这些信息不会频繁变动但需要在关键时刻被唤醒。技术实现上长期记忆可能使用另一个专门的向量数据库或者直接写入关系型数据库如PostgreSQL的结构化表中。它的核心挑战在于信息的压缩、索引与定期复盘。如何将海量的短期记忆通过AI总结、去重、归因变成有价值的长期知识是这一层设计的精髓。注意这三层并非完全隔离而是一个动态的、有流动性的系统。重要的短期记忆经过评估后会被“固化”到长期记忆而长期记忆中的关键条目在相关对话触发时会被“激活”并加载到短期甚至瞬时记忆中。这个流动过程模仿了人类记忆的“巩固Consolidation”机制。2.2 设计背后的核心考量效率、成本与隐私为什么非要搞这么复杂的三层结构一个巨大的向量数据库存下所有对话不行吗这里涉及到几个工程上的现实约束成本与延迟将用户所有的历史对话可能成千上万条都转换成向量并在每次对话时进行全量相似度搜索其计算成本和响应延迟是不可接受的。分层设计允许我们只在最合适的层级进行检索大部分时间只需与高速的瞬时/短期记忆交互。信息过载与噪声并非所有对话都有长期价值。“中午吃什么”这类信息如果混入长期记忆会严重污染检索质量。分层系统通过不同的存储策略和淘汰机制自动筛选出高价值信息。记忆的时效性与关联性人类记忆天然具有“近因效应”更关注最近的事和“情境关联性”在特定场景下更容易想起相关的事。三层结构能更好地模拟这一点。短期记忆强调时间序列和会话关联长期记忆则强调语义关联和概念抽象。用户隐私与数据管理清晰的记忆分层有助于实现精细化的数据治理。例如瞬时记忆可以完全在内存中处理不留存短期记忆可以设置自动过期时间如7天而长期记忆则需用户明确授权才能存储并支持查看、修改和删除。这符合日益严格的数据保护要求。理解了这些设计哲学我们就能明白OpenClaw三层记忆系统本质上是一套为AI代理量身定制的数据生命周期管理方案。接下来我们进入实战环节看看每一层具体如何实现。3. 各层记忆的实战实现与核心代码解析3.1 瞬时记忆层上下文管理的艺术瞬时记忆层不涉及额外的存储组件它的核心任务是如何高效利用LLM有限的上下文窗口。我们假设使用一个128K上下文窗口的模型。策略一动态上下文窗口管理不要简单地把所有历史记录堆进去。我们需要一个“上下文管理器”它负责维护一个动态的对话历史列表。一个基础的实现逻辑如下class ContextManager: def __init__(self, max_tokens120000, reserve_for_completion8000): self.max_tokens max_tokens self.reserve_for_completion reserve_for_completion self.conversation_history [] # 列表元素为 {role: user/assistant, content: str, tokens: int} def add_interaction(self, role, content, token_count): 添加一次交互到历史 self.conversation_history.append({role: role, content: content, tokens: token_count}) self._trim_context() def _trim_context(self): 修剪上下文确保不超过token限制 current_tokens sum(item[tokens] for item in self.conversation_history) # 预留生成空间 available_tokens self.max_tokens - self.reserve_for_completion while current_tokens available_tokens and len(self.conversation_history) 1: # 策略优先移除最早的非系统消息假设第一条是系统指令需保留 removed self.conversation_history.pop(1) # 移除第一条用户/助理消息 current_tokens - removed[tokens]策略二关键信息总结与注入当对话历史过长时简单的“掐头”会丢失重要信息。更好的方法是让AI自己总结。我们可以在上下文即将满时触发一个总结动作def summarize_old_messages(self, llm_client): 总结早期的对话内容 if len(self.conversation_history) 10: # 只有历史足够长时才总结 return # 取出需要总结的旧消息例如最早的一半 to_summarize self.conversation_history[:len(self.conversation_history)//2] summary_prompt f 请将以下对话历史浓缩成一个简洁的段落保留所有关于用户偏好、重要事实和决策的关键信息。 对话历史 {chr(10).join([f{msg[role]}: {msg[content]} for msg in to_summarize])} 总结 # 调用LLM生成总结 summary_response llm_client.chat.completions.create( modelgpt-4, messages[{role: user, content: summary_prompt}] ) summary summary_response.choices[0].message.content summary_token_count estimate_tokens(summary) # 需要一个估算token的函数 # 用总结替换掉旧消息 self.conversation_history [{role: system, content: f历史对话总结{summary}, tokens: summary_token_count}] self.conversation_history[len(self.conversation_history)//2:]这样我们既保留了信息的精髓又极大地节约了上下文空间。这个总结后的段落本身就是一种高度压缩的“短期记忆”。3.2 短期记忆层向量数据库的快速检索实战短期记忆层是承上启下的关键。这里我们选择轻量级的ChromaDB作为向量数据库示例。第一步对话片段的向量化与存储每次对话结束后我们不是存储整个对话而是将其中有潜在价值的“信息单元”提取并向量化。import chromadb from chromadb.config import Settings from sentence_transformers import SentenceTransformer import uuid from datetime import datetime, timedelta class ShortTermMemory: def __init__(self, persist_directory./chroma_short_term): # 初始化嵌入模型 self.embed_model SentenceTransformer(all-MiniLM-L6-v2) # 轻量且效果不错的模型 # 初始化Chroma客户端 self.client chromadb.PersistentClient(pathpersist_directory) # 获取或创建集合Collection每个用户或会话可以有一个独立的集合 self.collection self.client.get_or_create_collection( nameuser_session_memory, metadata{hnsw:space: cosine} # 使用余弦相似度 ) def store_interaction(self, user_id, session_id, query, response, metadataNone): 存储一次交互的关键信息 # 1. 构建记忆文本。这里简单拼接更复杂的可以提取实体、意图等。 memory_text fUser: {query}\nAssistant: {response} # 2. 生成向量 embedding self.embed_model.encode(memory_text).tolist() # 3. 生成唯一ID doc_id str(uuid.uuid4()) # 4. 准备元数据 if metadata is None: metadata {} metadata.update({ user_id: user_id, session_id: session_id, timestamp: datetime.now().isoformat(), type: interaction }) # 5. 存入Chroma self.collection.add( documents[memory_text], embeddings[embedding], metadatas[metadata], ids[doc_id] ) print(f已存储短期记忆ID: {doc_id}) def retrieve_relevant_memories(self, query, user_idNone, top_k5, recency_hours24): 检索与当前查询相关的短期记忆 # 1. 生成查询向量 query_embedding self.embed_model.encode(query).tolist() # 2. 构建过滤条件可以按用户、时间过滤 where_filter {} if user_id: where_filter[user_id] user_id # 如果启用时间过滤例如只查24小时内的 if recency_hours: cutoff_time (datetime.now() - timedelta(hoursrecency_hours)).isoformat() where_filter[timestamp] {$gte: cutoff_time} # 3. 执行查询 results self.collection.query( query_embeddings[query_embedding], n_resultstop_k, wherewhere_filter # 应用过滤器 ) # results 包含 ids, distances, documents, metadatas return results第二步记忆的检索与上下文注入当用户发起新查询时我们先从短期记忆中搜索相关记录然后将这些记录作为背景信息插入到LLM的上下文瞬时记忆中。def augment_context_with_memories(user_query, context_manager, short_term_memory, user_id): 用短期记忆增强上下文 # 1. 检索相关记忆 memories short_term_memory.retrieve_relevant_memories(user_query, user_iduser_id, top_k3) if memories and memories[documents]: # 2. 格式化记忆文本 memory_context 相关的过往对话记录\n for i, doc in enumerate(memories[documents][0]): memory_context f{i1}. {doc}\n # 3. 将记忆作为系统消息或特殊用户消息添加到上下文管理器的最前面 context_manager.add_interaction( rolesystem, contentf[系统提示以下是可能相关的历史信息请参考]\n{memory_context}, token_countestimate_tokens(memory_context) ) # 4. 再将用户当前查询加入上下文 context_manager.add_interaction(roleuser, contentuser_query, token_countestimate_tokens(user_query))这样AI在回答时就能“想起”不久前的相关对话从而实现连贯性。例如用户问“我昨天提到的那个设计稿修改好了吗”系统能从短期记忆中检索到昨天关于“设计稿”的讨论并给出针对性回答。3.3 长期记忆层核心知识的提炼与固化长期记忆存储的是经过“消化”后的精华。它的更新频率低但每次更新都应是深思熟虑的。核心机制从短期到长期的记忆固化Consolidation这个过程可以定期如每天深夜或由事件触发如对话结束时判断为重要话题。一个简化的固化流程如下信息收集从短期记忆中检索出过去一段时间内如一天某个用户的所有交互。重要性评估使用LLM对每条交互或一组相关交互进行打分判断其是否具有长期价值。评估标准可包括是否包含用户明确偏好“我不喜欢咖啡”、重要事实“我是前端工程师”、重大决策或承诺等。信息聚合与去重将高价值的短期记忆进行聚类和总结。例如将多次提到的“喜欢用React”合并为一条“技术偏好前端框架倾向React”的长期记忆。结构化存储将提炼后的信息以结构化的方式存入长期记忆库。这里可以用向量数据库但更推荐用关系型数据库存储结构化字段同时用向量存储语义索引。# 伪代码示例记忆固化任务 def consolidate_memories(user_id): # 1. 从短期记忆库拉取该用户最近24小时的所有记忆 recent_memories short_term_memory.fetch_all_by_user(user_id, hours24) if not recent_memories: return # 2. 让LLM评估并总结 consolidation_prompt f 你是一个记忆整理助手。请分析以下用户与AI的对话片段提取出值得长期记住的关于用户的**核心事实、稳定偏好和重要承诺**。 要求 1. 用简洁的陈述句列出。 2. 每个条目必须是普适的、非临时性的例如“喜欢蓝色”是偏好“今天穿了蓝衣服”是临时事实不记录。 3. 如果新旧信息冲突以最新的为准。 4. 输出格式为JSON列表[{{fact: 事实或偏好描述, category: 类别如职业、偏好、技能}}] 对话片段 {recent_memories_text} # 调用LLM... long_term_facts llm_client.parse_json_response(consolidation_prompt) # 3. 与现有长期记忆合并、去重、更新 for fact in long_term_facts: existing long_term_memory_db.query_similar_fact(fact[fact], user_id) if existing: # 如果已存在可以更新置信度或时间戳 long_term_memory_db.update_fact(existing.id, fact) else: # 新事实插入 long_term_memory_db.insert_fact(user_id, fact[fact], fact[category]) # 4. 可选清理已固化的短期记忆 short_term_memory.mark_as_consolidated(recent_memory_ids)长期记忆的检索主动与被动长期记忆的检索通常不是针对每个查询都进行而是在特定场景下触发被动触发当用户查询明显涉及个人长期信息时如“我的职业是什么”直接从长期记忆的结构化库中查询。主动注入在对话开始时根据会话主题可通过短期记忆或用户输入预测从长期记忆中加载相关的用户画像信息作为系统提示词的一部分让AI从一开始就“认识”用户。4. 系统集成与工作流编排三层记忆系统不是三个独立的模块而是一个需要精密协作的整体。一个完整的工作流如下用户输入收到用户的新消息。记忆检索长期记忆根据用户ID和当前会话的初始主题如果有加载相关的长期画像如“用户是设计师偏好简洁风格”作为基础系统提示。短期记忆将用户当前查询向量化在短期记忆库中检索最相关的几条近期对话。瞬时记忆上下文管理器维护着当前的对话线程。上下文组装将长期记忆作为系统角色、检索到的短期记忆作为系统或用户角色、以及当前的瞬时记忆对话历史按顺序组装成最终的LLM调用提示Prompt。LLM调用与响应生成LLM基于这个富含记忆的上下文生成回答。记忆存储瞬时记忆将本次的用户查询和AI回答加入上下文管理器。短期记忆将本次完整的交互或从中提取的关键信息单元存入向量数据库。记忆固化异步定期运行后台任务评估短期记忆的重要性将高价值信息提炼后存入长期记忆。这个工作流确保了信息在三个层级间有序流动既保证了对话的即时响应和连贯性又逐步构建了丰富的用户长期画像。5. 实战中的挑战、优化与避坑指南在实际搭建和运行这套系统时你会遇到一系列教科书上不会写的挑战。以下是我踩过坑后总结的经验5.1 挑战一向量检索的“幻觉”与精度问题问题单纯依靠向量相似度检索短期记忆可能会找到语义相关但实际无关的内容。比如用户问“项目进度”可能检索到之前聊“项目风险”的记录虽然都有“项目”这个词但焦点不同。解决方案混合检索Hybrid Search结合关键词搜索稀疏向量和语义搜索稠密向量。例如使用BM25算法进行关键词匹配再用向量做语义排序两者分数加权。许多现代向量数据库如Weaviate, Qdrant已原生支持。元数据过滤Metadata Filtering为每条记忆打上丰富的标签如topic: project_management,intent: query_status,entity: project_A。检索时先通过元数据圈定范围再进行向量相似度计算能大幅提升准确率。重排序Re-ranking先用向量数据库召回Top K个结果比如20个再用一个更小、更快的交叉编码器Cross-Encoder模型对它们与查询的相关性进行精确打分和重排虽然多了一步但精度提升显著。5.2 挑战二记忆的冲突与一致性维护问题用户可能今天说“我喜欢喝茶”明天又说“咖啡是我的最爱”。系统如何更新记忆如果两条矛盾记忆同时被检索到AI该如何应对解决方案记忆版本与置信度为每条长期记忆增加置信度confidence和最后更新时间last_updated字段。当新信息与旧信息冲突时如果新信息的置信度更高例如来自用户非常肯定的陈述则覆盖旧信息或者采用加权平均。同时可以保留旧记忆的历史版本以供审计。在上下文中让AI裁决当检索到矛盾记忆时不要偷偷处理而是将矛盾点明确提供给LLM。例如在系统提示中写明“注意关于用户的饮品偏好历史记录中存在不同说法。记录A3天前‘我喜欢喝茶’。记录B刚刚‘咖啡是我的最爱’。请根据当前对话谨慎判断或询问用户以澄清。”设计遗忘机制记忆不是只增不减。为记忆设置有效期TTL或衰减因子。对于短期记忆可以自动过期。对于长期记忆如果一条信息很久未被提及或使用其置信度可以随时间缓慢降低。5.3 挑战三系统性能与成本控制问题每次对话都进行多次向量编码和数据库查询延迟和API成本可能飙升。优化策略分层缓存对频繁检索的长期记忆如用户基本信息进行内存缓存。对相同的查询向量化结果进行缓存。异步与非阻塞写入短期记忆的存储操作可以放入消息队列如Redis Streams, RabbitMQ异步执行不阻塞主响应流程。量化与轻量化模型短期记忆的检索嵌入模型可以使用量化后的轻量模型如all-MiniLM-L6-v2已足够轻量甚至针对特定领域微调的小模型以减少计算开销。批量处理记忆固化记忆固化从短期到长期是计算密集型任务务必放在后台低频执行如每小时或每天一次并使用批量处理API来降低LLM调用成本。5.4 一个必须警惕的“坑”记忆的隐私与安全这不仅是技术问题更是伦理和法律问题。你的系统在记住用户的同时也记住了他们的习惯、弱点甚至秘密。加密存储所有记忆尤其是长期记忆中的个人信息在落盘前必须加密。用户控制权必须提供清晰的界面让用户查看、编辑、导出和删除AI关于他们的所有记忆。这是建立信任的基础。数据隔离确保不同用户之间的记忆绝对隔离防止数据泄露。合规性考量根据业务所在地的法律如GDPR, CCPA设计数据保留和删除策略。6. 效果评估与迭代方向搭建完成后如何判断你的AI代理是不是真的“更聪明”了不能只凭感觉需要设计评估指标连贯性评分人工或自动化评估多轮对话中AI对之前提及信息的引用是否准确、自然。个性化程度统计AI主动使用用户特定偏好或信息来定制化回答的比例。用户满意度通过调查或对话结束后的评分直接收集反馈。系统性能指标平均响应延迟、记忆检索准确率、LLM Token使用效率等。基于这些指标你可以持续迭代你的记忆系统。一些高级的迭代方向包括记忆链Memory Chains将相关的记忆通过逻辑链接起来形成事件脉络或知识图谱而不仅仅是孤立的片段。情感记忆尝试识别和记录用户在对话中的情绪状态让AI的回应更具同理心。主动记忆让AI在识别到重要但用户未明确要求记忆的信息时主动询问“这个信息需要我帮你记住吗”实现OpenClaw这样的三层记忆系统确实比调用一个简单的Chat API复杂得多。它要求开发者深入思考数据流、状态管理和AI的行为设计。但带来的回报是巨大的你将得到一个真正“认识”用户、对话体验流畅自然、能够建立长期关系的智能体。这不再是简单的问答而是迈向通用人工智能助手AGI Assistant的关键一步。开始动手吧从为一个简单的任务型代理添加短期记忆开始逐步构建属于你自己的、有记忆的AI伙伴。
返回列表