Agent记忆系统:让AI不再失忆

一句话理解

Agent记忆系统 = AI的"海马体"。让Agent能够记住之前的对话、学习新知识、积累经验,而不是每次都从零开始。2026年,记忆系统已成为Agent从"工具"进化为"助手"的关键技术。


目录

  1. 什么是Agent记忆系统
  2. 记忆的分类
  3. 记忆架构设计
  4. 核心技术实现
  5. 2026年最新进展
  6. 实战代码
  7. 常见问题
  8. 延伸阅读
  9. 读者互动

1. 什么是Agent记忆系统

1.1 问题背景

传统LLM的局限性:

LLM的"金鱼记忆"问题

  • 对话1: “我叫张三”
  • 对话2: “我叫李四”
  • 对话3: “你叫什么名字?” → “我叫李四” ❌

LLM无法跨对话记住信息

原因:LLM的训练数据不含对话历史

1.2 记忆系统的定义

Agent记忆系统 是让Agent具备:

  • 持久化存储能力
  • 选择性检索能力
  • 经验积累能力
  • 知识更新能力

的完整解决方案。

1.3 为什么需要记忆系统

维度无记忆Agent有记忆Agent
上下文感知每次都需重新介绍自动记住偏好
学习能力无法学习新知识持续积累经验
个性化通用回答定制化服务
效率重复信息处理利用已有知识
实用性玩具级别可用级别

2. 记忆的分类

2.1 三大记忆类型

Agent记忆架构:

记忆类型说明特点
感觉记忆 (Sensory Memory)当前输入、实时感知信息入口,过滤无关内容
工作记忆 (Working Memory)当前对话、活跃信息、正在处理的任务受限于上下文窗口
长期记忆 (Long-Term Memory)历史对话、经验知识、用户偏好持久化存储,跨会话

2.2 记忆类型详解

(1)感觉记忆
特性说明
定义原始感知输入(视觉、听觉、文本)
持续时间毫秒~秒
容量
作用信息入口,过滤无关内容
实现当前输入、传感器数据
(2)工作记忆
特性说明
定义当前任务相关信息
持续时间当前会话
容量受限于上下文窗口
作用任务处理、推理
实现对话历史、上下文
# 工作记忆示例
working_memory = {
    "current_task": "帮用户写一封邮件",
    "task_history": [
        {"role": "user", "content": "帮我写邮件给老板请假"},
        {"role": "assistant", "content": "好的,请问您想请什么假?"},
        {"role": "user", "content": "明天发烧想请一天假"}
    ],
    "active_entities": {
        "recipient": "老板",
        "reason": "发烧",
        "duration": "1天",
        "date": "明天"
    }
}
(3)长期记忆
特性说明
定义持久化存储的知识和经验
持续时间永久/跨会话
容量无限
作用知识积累、经验复用
实现向量数据库、图数据库、文件

2.3 记忆的流转

记忆流转生命周期:

阶段流转触发条件
感觉记忆→ 工作记忆实时感知
工作记忆→ 长期记忆上下文窗口满 / 重要信息
长期记忆→ 工作记忆检索/回忆

关键决策点:

  1. 什么信息进入工作记忆?
  2. 什么信息从工作记忆写入长期记忆?
  3. 什么时候从长期记忆检索信息?

3. 记忆架构设计

3.1 经典架构:MemGPT

MemGPT(Memory GPT)是最具代表性的Agent记忆系统:

层级组件说明
LLM层大语言模型核心推理引擎
控制循环1.检查上下文窗口 2.触发内存管理 3.保留/检索/总结/遗忘
↓ ↑
外部存储层对话存档(RAG索引)历史对话存储
知识库(向量库)向量化知识
摘要存储(总结)压缩记忆

3.2 五大记忆范式对比

范式原理优点缺点代表
上下文窗口所有信息塞进context简单、无额外成本受窗口限制GPT-4
RAG检索检索相关记忆可处理无限记忆检索质量影响大RAG Memory
文件系统读写文件存储简单可靠检索慢OS-level
数据库结构化存储查询灵活复杂度高SQL Memory
图谱知识图谱存储关系推理强构建成本高KG Memory

3.3 混合记忆架构

层级组件说明
Agent核心-Agent核心处理单元
↓ ↑
记忆管理层写入策略什么时候存?存什么?
检索策略什么时候读?读什么?
遗忘策略什么时候删?删什么?
↓ ↑
存储层向量数据库语义记忆(语义相似检索)
图数据库关系记忆(实体关系)
缓存工作记忆(快速访问)

4. 核心技术实现

4.1 记忆写入策略

什么时候存?

策略触发条件实现
阈值触发重要性评分 > 阈值importance_score > 0.8
定期存档每N轮对话后session.turns % N == 0
显式请求用户/Agent要求记住user_says(“记住…”)
事件触发特定事件发生event == “task_completed”
# 记忆写入决策
class MemoryWriter:
    def should_remember(self, content: str, context: dict) -> bool:
        """判断是否应该记住"""
        
        # 1. 重要性评估
        importance = self.evaluate_importance(content, context)
        if importance > 0.8:
            return True
        
        # 2. 新颖性检查
        novelty = self.check_novelty(content)
        if novelty > 0.6:
            return True
        
        # 3. 重复检查
        is_duplicate = self.check_duplicate(content)
        if is_duplicate:
            return False
        
        # 4. 用户偏好
        if context.get("user_explicit_request"):
            return True
        
        return False
    
    def evaluate_importance(self, content: str, context: dict) -> float:
        """评估内容重要性"""
        score = 0.5  # 基础分
        
        # 用户明确提到
        if context.get("is_user_statement"):
            score += 0.2
        
        # 涉及实体(人名、地点、日期)
        if self.extract_entities(content):
            score += 0.1
        
        # 任务关键信息
        if context.get("task_critical"):
            score += 0.2
        
        # 时效性信息
        if context.get("is_time_sensitive"):
            score += 0.1
        
        return min(score, 1.0)

4.2 记忆检索策略

什么时候读?读什么?

# 记忆检索
class MemoryRetriever:
    def retrieve(self, query: str, context: dict, limit: int = 5):
        """检索相关记忆"""
        
        # 1. 生成查询向量
        query_vector = self.embed(query)
        
        # 2. 多路召回
        results = {
            "semantic": self.vector_search(query_vector, limit=limit),
            "keyword": self.keyword_search(query, limit=limit),
            "recent": self.get_recent_memories(limit=3),
            "contextual": self.get_contextual_memories(context)
        }
        
        # 3. 融合排序
        fused_results = self.rerank(results, query, context)
        
        # 4. 后处理
        deduplicated = self.deduplicate(fused_results)
        
        return deduplicated[:limit]
    
    def vector_search(self, query_vector, limit):
        """向量相似度搜索"""
        return milvus.search(
            collection_name="memory",
            query_vector=query_vector,
            limit=limit,
            metric_type="COSINE"
        )
    
    def keyword_search(self, query, limit):
        """关键词搜索"""
        return pgvector.search(
            query=query,
            limit=limit,
            match_type="bm25"
        )
    
    def rerank(self, results, query, context):
        """多路结果融合"""
        # RRF (Reciprocal Rank Fusion)
        fusion_scores = {}
        
        for source, items in results.items():
            for i, item in enumerate(items):
                item_id = item["id"]
                rank = i + 1
                weight = self.get_source_weight(source)
                score = weight / (60 + rank)
                fusion_scores[item_id] = fusion_scores.get(item_id, 0) + score
        
        sorted_ids = sorted(fusion_scores, key=fusion_scores.get, reverse=True)
        return [self.get_memory_by_id(id) for id in sorted_ids]

4.3 记忆遗忘策略

什么时候删?删什么?

策略说明
1. 基于时间最近最少使用 (LRU):超过一定时间未访问 → 标记为"冷"
2. 基于重要性低重要性 + 低访问频率 → 可删除;高重要性 → 永久保留
3. 基于容量存储容量达到上限 → 触发淘汰;优先级:近期 > 重要 > 一般

5. 2026年最新进展

5.1 Hindsight:生物启发记忆

Hindsight 是2026年提出的新一代记忆架构:

特性说明
灵感来源人类记忆系统
核心思想事件驱动 + 情感标记
三阶段处理编码 → 巩固 → 检索

Hindsight记忆处理流程:

阶段处理内容说明
阶段1:编码感知输入 → 事件片段将输入转换为可存储的事件
情感标记(正面/负面/中性)情感关联
关联链接(新记忆与旧记忆)建立记忆网络
阶段2:巩固短期 → 长期的转换信息整合
睡眠期间的信息整合记忆巩固
重要性重评估动态调整
阶段3:检索线索驱动检索按线索回忆
情感状态调节检索情感辅助记忆
情境相似度匹配情境关联

5.2 A-MEM:主动记忆系统

A-MEM(Active Memory)提出五大范式:

范式特点适用场景
上下文窗口直接塞入context短期任务
RAG-based向量检索增强知识问答
文件系统读写本地文件持久化需求
数据库结构化存储企业应用
多模态支持图片/音视频复杂感知

5.3 Agentic RAG Memory

2026年,RAG进化为Agent的记忆层:

# Agentic RAG Memory架构
class AgenticRAGMemory:
    """Agent记忆的RAG增强"""
    
    def __init__(self):
        # 向量记忆库
        self.vector_memory = MilvusCollection("agent_memory")
        
        # 图记忆库(关系)
        self.graph_memory = Neo4jGraph("agent_relations")
        
        # 缓存(快速访问)
        self.cache = RedisCache()
    
    def remember(self, experience):
        """记忆存储"""
        # 1. 向量化存储
        vector = embed(experience.content)
        self.vector_memory.insert(vector, experience)
        
        # 2. 关系存储(图数据库)
        for entity in extract_entities(experience):
            self.graph_memory.add_entity(entity)
        for relation in extract_relations(experience):
            self.graph_memory.add_relation(relation)
        
        # 3. 缓存更新
        self.cache.set(experience.key, experience)
    
    def recall(self, query):
        """记忆检索"""
        # 1. 缓存优先
        cached = self.cache.get(query)
        if cached:
            return cached
        
        # 2. 混合检索
        vector_results = self.vector_memory.search(query, top_k=5)
        graph_results = self.graph_memory.traverse(query)
        
        # 3. 结果融合
        return self.fuse_results(vector_results, graph_results)

6. 实战代码

6.1 基础记忆Agent实现

# 简单的Agent记忆系统
import json
from datetime import datetime
from typing import List, Dict

class SimpleAgentMemory:
    """轻量级Agent记忆系统"""
    
    def __init__(self):
        self.short_term = []  # 工作记忆
        self.long_term = []   # 长期记忆
        self.max_short_term = 10  # 工作记忆上限
    
    def add_interaction(self, role: str, content: str):
        """添加对话"""
        memory = {
            "role": role,
            "content": content,
            "timestamp": datetime.now().isoformat()
        }
        self.short_term.append(memory)
        
        # 如果工作记忆满了,转移到长期记忆
        if len(self.short_term) > self.max_short_term:
            self._archive_to_long_term()
    
    def _archive_to_long_term(self):
        """归档到长期记忆"""
        if self.short_term:
            # 简单策略:保留摘要
            summary = self._summarize(self.short_term)
            self.long_term.append({
                "type": "session_archive",
                "summary": summary,
                "timestamp": datetime.now().isoformat()
            })
            self.short_term = []
    
    def _summarize(self, memories: List[Dict]) -> str:
        """生成摘要"""
        # 简化版:提取关键信息
        return f"对话记录,共{len(memories)}轮"
    
    def get_context(self) -> str:
        """获取当前上下文"""
        context_parts = []
        
        # 添加长期记忆
        if self.long_term:
            context_parts.append("【历史摘要】")
            for mem in self.long_term[-3:]:
                context_parts.append(mem.get("summary", ""))
        
        # 添加近期对话
        if self.short_term:
            context_parts.append("【当前对话】")
            for mem in self.short_term[-5:]:
                context_parts.append(f"{mem['role']}: {mem['content']}")
        
        return "\n".join(context_parts)

6.2 RAG增强记忆实现

# RAG增强的Agent记忆
from sentence_transformers import SentenceTransformer
import numpy as np

class RAGMemory:
    """基于RAG的Agent记忆系统"""
    
    def __init__(self, embedding_model: str = "all-MiniLM-L6-v2"):
        self.model = SentenceTransformer(embedding_model)
        self.memories = []  # List of (vector, memory_dict)
    
    def add(self, content: str, metadata: dict = None):
        """添加记忆"""
        vector = self.model.encode(content)
        memory = {
            "content": content,
            "metadata": metadata or {},
            "importance": self._assess_importance(content)
        }
        self.memories.append((vector, memory))
    
    def _assess_importance(self, content: str) -> float:
        """评估重要性"""
        # 简化版:基于关键词
        important_keywords = ["记住", "重要", "偏好", "计划"]
        return 1.0 if any(kw in content for kw in important_keywords) else 0.5
    
    def retrieve(self, query: str, top_k: int = 5) -> List[dict]:
        """检索相关记忆"""
        query_vector = self.model.encode(query)
        
        # 计算相似度
        scores = []
        for vec, mem in self.memories:
            sim = np.dot(query_vector, vec) / (np.linalg.norm(query_vector) * np.linalg.norm(vec))
            scores.append((sim, mem))
        
        # 排序返回
        scores.sort(key=lambda x: x[0], reverse=True)
        return [mem for _, mem in scores[:top_k]]
    
    def build_prompt(self, query: str) -> str:
        """构建带记忆的prompt"""
        relevant = self.retrieve(query)
        
        if not relevant:
            return ""
        
        memory_text = "【相关记忆】\n"
        for mem in relevant:
            memory_text += f"- {mem['content']}\n"
        
        return memory_text

6.3 完整的记忆Agent

# 完整记忆Agent示例
from openai import OpenAI

class MemoryAgent:
    """带记忆系统的Agent"""
    
    def __init__(self, model: str = "gpt-4"):
        self.client = OpenAI()
        self.memory = RAGMemory()
        self.conversation_history = []
    
    def chat(self, user_input: str) -> str:
        """对话"""
        # 1. 检索相关记忆
        memory_context = self.memory.build_prompt(user_input)
        
        # 2. 构建消息
        messages = [
            {"role": "system", "content": "你是一个有帮助的AI助手。"}
        ]
        
        # 3. 添加记忆上下文
        if memory_context:
            messages.append({
                "role": "system",
                "content": f"参考以下记忆信息来回答:\n{memory_context}"
            })
        
        # 4. 添加对话历史
        messages.extend(self.conversation_history[-10:])
        
        # 5. 添加当前输入
        messages.append({"role": "user", "content": user_input})
        
        # 6. 生成回复
        response = self.client.chat.completions.create(
            model=model,
            messages=messages
        )
        
        assistant_reply = response.choices[0].message.content
        
        # 7. 存储对话
        self.conversation_history.append({"role": "user", "content": user_input})
        self.conversation_history.append({"role": "assistant", "content": assistant_reply})
        
        # 8. 判断是否需要记忆
        self._maybe_remember(user_input, assistant_reply)
        
        return assistant_reply
    
    def _maybe_remember(self, user_input: str, assistant_reply: str):
        """决定是否记住"""
        # 检查用户是否明确要求记住
        if "记住" in user_input or "remember" in user_input.lower():
            self.memory.add(user_input, {"type": "explicit_request"})
        
        # 检查是否是重要信息
        important_keywords = ["我叫", "我叫", "我的名字", "我喜欢"]
        for keyword in important_keywords:
            if keyword in user_input:
                self.memory.add(user_input, {"type": "personal_info"})
                break

7. 常见问题

Q1:记忆系统和向量数据库有什么区别?

:向量数据库是记忆系统的存储层之一。

组件作用关系
向量数据库存储和检索向量记忆系统的子组件
记忆系统完整的信息管理方案包含向量库 + 策略 + 管理

Q2:上下文窗口够用吗?还需要外部记忆吗?

:取决于场景。

场景推荐
简单问答上下文窗口足够
长期助手需要外部记忆
多会话学习必须外部记忆
个性化服务必须外部记忆

Q3:如何平衡记忆的"全"和"精"?

:采用分层记忆策略。

记忆层级内容精度容量说明
短期记忆最近N次对话高精度上下文窗口限制当前会话活跃信息
中期记忆本周重要信息中等精度向量库限制跨会话重要信息
长期记忆用户偏好、关键事实高价值可按需扩展持久化核心信息

8. 延伸阅读

相关词汇关联度推荐理由
W03 RAG⭐⭐⭐⭐RAG是记忆系统的检索基础
W27 向量数据库⭐⭐⭐⭐记忆系统的重要存储层
W04 Agent⭐⭐⭐Agent是记忆系统的载体
W12 嵌入⭐⭐⭐向量化是记忆检索的基础

🤔 批判性思考

1. 记忆系统是否侵犯隐私?

  • 存储用户的对话和个人信息,安全如何保证?
  • 用户是否有权删除自己的记忆?

2. 记忆的"真实性"问题

  • Agent记忆的信息是否准确?
  • 如何处理记忆冲突?

3. 成本问题

  • 向量数据库等外部存储的成本
  • 检索和管理的计算成本

4. 技术过度复杂

  • 真的需要这么复杂的记忆系统吗?
  • 简单方案是否足够?

本文收录于「AI词汇专栏」,作者:孤岛站岗

本文参考资料(2026年4月):

  • 《Agent Memory全景》AI Insight 2026.3
  • 《AI Agent记忆系统全解析》heyuan110.com 2026.2
  • 《Hindsight生物启发记忆系统》技术报告 2026.3
  • 《RAG技术最新进展》SegmentFault 2026.2
Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐