agent中记忆系统总结Memory

agent中记忆系统总结Memory

1. 记忆系统的总体架构:统一接口 + 分层分发 + 类型化记忆

  • MemoryTool:对 Agent 提供统一入口execute(action, **kwargs)
    • action决定要做什么:add/search/summary/stats/update/remove/forget/consolidate/clear_all
    • kwargs让不同操作拥有不同参数,不强耦合
  • MemoryManager:真正的“路由+编排”
    • 根据配置启用哪些记忆类型(working / episodic / semantic / perceptual)
    • 持有store(存储后端)与retriever(检索策略)并组织它们工作
  • Memory Type(四类记忆):把知识按“认知属性/数据形态”拆开
    • Working:短期、临时、快、容量有限(TTL+容量)
    • Episodic:事件/经历、有时间线(SQLite结构化 + 向量检索)
    • Semantic:抽象知识、实体关系(图数据库 + 向量检索 + 推理/混合排序)
    • Perceptual:多模态感知(按模态分库/分向量空间,支持跨模态检索)

2. MemoryTool.execute:为什么要统一 execute?

  • 让 Agent 调用变简单:永远是execute("add", ...)这种形式
  • 逻辑集中在内部:Action -> 对应私有方法_add_memory/_search_memory/...
  • 便于扩展:以后新增 action 不破坏外部接口

3. add(写入)操作:核心是补齐上下文元数据 + 管理会话归属

关键思想:

  • session_id 自动生成:确保同一段对话/用户上下文能被追踪(后续 episodic/过滤检索很需要)
  • timestamp 自动加:为“时间相关检索/衰减”准备
  • importance(重要性):将“认知权重”显式化
    • 后续检索排序通常会用它做乘权(如0.8 + importance*0.4之类)
  • perceptual 的多模态元数据
    • modality推断、保存原始路径raw_data=file_path

4. search(检索)操作:核心是相似度 + 过滤 + 融合排序

你贴的代码里都在反复强调:

  • 参数支持:
    • memory_type(单类型)
    • memory_types(多类型)
    • min_importance(过滤低价值记忆)
  • 输出不是原始结果,而是人类可读格式(memory_type_label、content_preview、importance)

在“每种记忆类型内部”,检索进一步体现差异:

WorkingMemory:混合检索 + 时间衰减 + 重要性权重
  • 思路:快且稳定
  • 混合:
    • TF-IDF / 关键词作为关键词覆盖
    • 向量相似作为语义覆盖
  • 排序:
    • 基础相关度(向量70%/关键词30%)
    • 再乘以时间衰减time_decay
    • 再乘以重要性权重importance_weight

学习点:Working 更像“会话内记忆缓存”,目标是响应速度与鲁棒召回。

EpisodicMemory:结构化预过滤 + 向量召回 + 时间/重要性融合
  • 结构化过滤(session/time/importance 等)先缩小候选集
  • 再做向量召回
  • 综合评分用:
    • 向量相似(主要)
    • recency(时间近因性)
    • importance(重要性)

Episodic 的优势是“知道它发生在什么时候、属于哪个会话/事件”,所以能更准。

SemanticMemory:向量 + 图结构 + 混合排序
  • 添加时:
    • embedding(语义表示)
    • 抽取实体/关系
    • 存入 Neo4j 图
    • embedding 写入向量库(Qdrant)
  • 检索时:
    • 向量检索(相似语义)
    • 图检索(关系/邻域推理)
    • 再融合排序:
      • 0.7 * vector_score + 0.3 * graph_score后再乘 importance 权重

Semantic 强在“关系推理/概念网络”,不是只看相似度。

PerceptualMemory:模态分离存储 + 跨模态检索 + 指数衰减
  • 设计:为不同模态(text/image/audio)维护不同向量集合,避免向量空间不匹配
  • 支持:
    • 同模态检索
    • 跨模态检索(通过统一语义对齐编码)
  • 评分同样是:
    • 向量相似(主)
    • 时间近因性(次)
    • importance(权重)

时间衰减思想非常关键:

  • 用指数衰减模拟遗忘曲线,保证“更新更近的记忆更可能被拿到”。

5. forget(遗忘)机制:为什么要“遗忘”?

遗忘不是 bug,是为了:

  • 控制存储成本(容量)
  • 避免噪声累积(低重要性删)
  • 强化时效性(过期删)

三类策略:

  1. importance_based:按重要性阈值删除
  2. time_based:超过 max_age_days 删除
  3. capacity_based:超出上限则删最不重要

Memory 系统不是“无限增长的日志”,而是“可控的认知模型”。


6. consolidate(整合)机制:从短期到长期

  • from_type -> to_type(默认 working -> episodic)
  • importance_threshold决定哪些短期记忆值得“固化”
  • 思想:模仿“重要事件被巩固成长期记忆”

这是“记忆生命周期管理”的核心闭环之一。


拓展:

  1. 把记忆按“用途/数据形态/认知层级”拆分,每类用最合适的检索与存储组合。
  2. 所有检索排序都围绕三件事融合
    • 语义相似度(向量/文本)
    • 时间因子(recency、衰减)
    • 重要性权重(importance)
  3. 写入时补齐元数据(session、timestamp、modality、importance),否则后面很难做高质量检索。
  4. 提供统一入口给 Agent(execute + action),降低 Agent 调用复杂度、提升可扩展性。
  5. 用遗忘与整合构建闭环:避免记忆膨胀,让系统越来越“像人”。

速记

  • Tool:execute(action, **kwargs)统一入口
  • Manager:分发/编排,持有 store + retriever
  • Four memories:
    • Working:快 + TTL + 容量 + (向量70%/关键词30%)×时间×重要性
    • Episodic:结构化预过滤 + 向量召回 + recency×importance
    • Semantic:图+向量混合(0.7/0.3)×importance
    • Perceptual:模态分库 + 同/跨模态检索 + 指数衰减×importance
  • forget:按重要性/时间/容量删
  • consolidate:工作记忆中重要的迁移到长期(episodic/semantic)

1) 主流 Memory(记忆)系统的典型流程:

主流系统大多遵循这一流水线:

A. 写入阶段(add / ingest)

  1. 文本/多模态数据进入
    • 对话轮次、用户画像、文档片段、事件日志、图片/音频等
  2. 预处理与分块
    • 文本清洗、切 chunk(按段落/句子/窗口)
    • 给每条 chunk 生成元数据:user_id/session_id/timestamp/source/importance/tags
  3. 嵌入表示(Embedding)
    • 把 chunk(或多模态编码结果)转成向量
  4. 写入存储(多存储协同)
    • 向量数据库:存embedding + metadata + id
    • 关系/图数据库(可选):存entity/relationship + memory_id
    • 原文/结构化存储(常见)
      • 原文通常仍保存在对象存储/SQL/文档库中(便于可读、审计、回放)
  5. 可选的“摘要/索引层”
    • 为节省检索成本:做摘要、关键词索引、层级聚合(short-term -> long-term)

B. 读取阶段(search / retrieve for RAG)

  1. 把用户查询转成向量(Query embedding)
  2. 向量召回(TopK)
  3. 可选的结构化过滤
    • 按 user/session/time/memory_type/权限过滤
  4. 可选的图增强
    • 通过实体召回/关系扩展找到额外相关片段
  5. 重排(rerank)与融合
    • 用 cross-encoder / 评分模型把向量召回重排
    • 融合多源(向量+BM25+图)
  6. 把检索到的“证据片段”喂给 LLM
    • 生成最终回答(RAG)

2) 最终存储到哪里?(最常见的三类存储)

主流架构通常至少包含:

① 向量数据库(Vector DB)

  • 存:embedding(向量) + metadata + id
  • 用途:相似度检索 / 召回 TopK

② 原文与结构化数据存储(Content Store)

常见是:

  • SQL(PostgreSQL/MySQL)存结构化字段(用户、权限、事件表)
  • 文档库(如 MongoDB)存文档与索引信息
  • 对象存储/文件系统存原文(可回溯)

虽然向量库里也能存 payload,但工程上通常还是会保留一个“权威原文仓库”。

③ 图数据库(Graph DB,可选但越来越常见)

  • 存:实体(人物/概念/技能/产品)与关系(“使用/属于/因果/相互关联”)
  • 用途:
    • 实体级召回
    • 关系扩展(邻居节点扩展)
    • 更解释性的检索与路径推理

3) 嵌入表示转换(Embedding)通常用什么技术?

常见技术栈

  1. Sentence Embedding / Text Embedding 模型
    • 例如(泛称):text-embedding-*、Sentence-BERT 系列、bge 系列、e5 系列等
  2. 为检索优化的模型
    • 双塔(bi-encoder)结构:query encoder + doc encoder
    • 通常用于向量检索召回
  3. 多模态嵌入(如果有图像/音频)
    • CLIP(图像-文本对齐)
    • Whisper / CLAP(音频-文本对齐)等
  4. 可选:BM25 / TF-IDF
    • 一些系统用“稀疏检索 + 向量检索”混合
    • 或用于兜底召回(尤其短问题、专有名词)

Embedding 的输入输出

  • 输入:chunk 文本(或 query 文本)
  • 输出:固定维度的浮点向量(例如 384/768/1024…)

4) 向量数据库用本地还是云端?常见选择是什么?

部署方式(主流趋势)

  • 本地/自建:对隐私、延迟、成本可控更友好
  • 云端/托管:省运维、快速上线

常见向量库/平台(按流行度)

  • 开源自建/可部署
    • Qdrant
    • Milvus
    • Weaviate
    • Elasticsearch/OpenSearch(也能做向量)
  • 托管云服务(典型思路是“直接调用 API”):
    • Pinecone
    • Zilliz Cloud(Milvus 托管)
    • 以及一些云厂商提供的向量检索能力

5) 图数据库主流:

图数据库角色

图数据库通常不替代向量检索,而是“补强关系推理”和“实体级召回”。

常见用途:

  • 从问题抽取实体(例如“Python / 张三 / 项目A”)
  • 在图里找相关实体邻居
  • 把相关节点的记忆片段扩展进候选集合
  • 再用向量重排(或直接融合评分)

Neo4j

Neo4j 很常见(尤其在中文教程/开源示例里更常被提到),原因:

  • Cypher 查询方便
  • 生态成熟
  • 很适合做 entity-relation 模型

但也有其它选择:

  • TigerGraph(大规模图)
  • Amazon Neptune(托管图数据库)
  • NebulaGraph(图数据库)
  • 甚至某些系统用 RDF/三元组存储(语义网风格)

6) 总结:

先嵌入(embedding) -> 存向量数据库(embedding + 原文/metadata) ->(可选)存图数据库(实体/关系) -> RAG 检索时用向量召回 + 图扩展 + 重排 -> 喂给 LLM。

而嵌入一般用:

  • 文本嵌入模型(双塔/检索向量模型)
  • 多模态用对应对齐模型(CLIP/CLAP 等)
    向量库一般:
  • 自建(Qdrant/Milvus/Weaviate)或托管(Pinecone 等)
    图数据库:
  • Neo4j 常见,也有其它图系统。