祖龙记忆系统:从代码视角拆解一个「会联想、能遗忘」的图式记忆引擎

55 阅读14分钟

摘要:在 LongMemEval 等基准测试中,当前大模型在长程记忆任务上的性能下降达 30-60%。问题不在于模型不够大,而在于架构没有真正的“记忆”。祖龙(ZULONG)提出并落地了一套基于异构记忆图谱(Heterogeneous MemoryGraph)的记忆系统——将神经科学中的海马体工作机制工程化为可运行的代码。本文从技术实现角度,拆解五大核心模块:MemoryGraph 异构图谱、自主动态注意力、上下文压力监控、BFS 扩散激活与艾宾浩斯自然遗忘。

GitHub 开源地址:github.com/beautistart…


一、为什么传统的 Agent 记忆方案不够用?

传统 Agent 记忆方案存在三层结构性缺陷:

  1. 时间维度:窗口式的“最近 N 轮”机制,关键信息在第 N+1 轮就会被一句“嗯嗯”挤出上下文。
  2. 空间维度:对话记忆、知识库、用户画像各自孤立存储,跨类型关联无法自动建立。
  3. 检索维度:纯向量检索能匹配语义相似性,但无法理解“那个处理器”中的“那个”指向的是一万轮之前的指代对象。

这三个问题的本质是:传统方案缺乏一个统一的、支持联想的内存模型

祖龙的回答是把一切信息——对话、任务、知识、人物、文件——全部装入一张异构有向图,并在这张图上运行生物启发的记忆算法。

系统定义:祖龙记忆系统是一个以异构记忆图谱为认知骨架、以自主动态注意力为信息聚焦机制、以上下文压力监控为稳态保障、以 BFS 扩散为联想激活路径、以艾宾浩斯自然遗忘为记忆代谢引擎的类人长程记忆架构。


二、核心模块一:异构记忆图谱(MemoryGraph)

MemoryGraph 是祖龙的统一记忆中枢。它的核心数据模型非常简单,但组合起来极具表达力。

2.1 数据模型:9 种节点 + 7 种边

# 节点定义(简化自源码 memory_graph.py)
@dataclass
class GraphNode:
    node_id: str             # 全局唯一,带类型前缀
    node_type: NodeType      # 9 种类型之一
    label: str               # 人类可读标签
    activation: float        # 当前激活水平 (0.0-1.0)
    created_at: float
    last_accessed: float
    access_count: int
    backend_ref: str         # 后端来源指针
    metadata: Dict[str, Any] # 包含多维标签与全文内容

9 种节点类型:TASK(任务)、DIALOGUE(对话)、KNOWLEDGE(知识实体)、EXPERIENCE(经验文档)、EPISODE(情景摘要)、FILE(文件引用)、CONCEPT(概念)、PERSON(人物信息)、DOCUMENT(文档)

7 种边类型

边类型语义保护策略
HIERARCHY父子层级关系(任务拆解)结构性,永不修剪
DEPENDENCY数据/执行依赖结构性,永不修剪
REFERENCE跨类型显式引用可衰减
TEMPORAL时间序列关系结构性,永不修剪
SEMANTIC语义相似(embedding cosine > 0.7)可衰减
CAUSAL因果关系可衰减
ASSOCIATION赫布学习自动产生可衰减

结构边(HIERARCHY / DEPENDENCY / TEMPORAL)标记 protected=True,在突触修剪时永不移除;学习/语义边(SEMANTIC / CAUSAL / REFERENCE / ASSOCIATION)参与赫布增强与艾宾浩斯衰减,随时间和交互动态演化。

2.2 多维标签体系

MemoryGraph 的核心设计之一是三组正交标签,让每个记忆节点在图空间中拥有唯一的“活性坐标”:

标签维度可选值计算方式用途
温度(Temperature)HOT / WARM / COLD基于 last_accessed 实时计算检索路由
重要度(Importance)TRIVIAL → MUST_REMEMBER(6 级)写入时规则检测 + 动态提升差异化衰减速率控制
时间跨度(TimeScope)RECENT / NON_RECENT查询时动态计算(默认 30 分钟窗口)并行检索互斥过滤

2.3 赫布学习:自动建边

赫布学习引擎是 MemoryGraph 最具创新性的模块之一。引用神经科学中 Donald Hebb 在 1949 年提出的“神经元 A 反复参与神经元 B 的激活,则 A 到 B 的连接会增强”原理,祖龙将其实现为自动边创建机制:

if 两个节点的共激活计数 >= 3:
    自动创建 ASSOCIATION 边
    权重递增公式: new_weight = old_weight + 0.1 × (1 - old_weight)
    # 渐近趋向 1.0,符合赫布学习强化效应

同时,后台异步计算节点摘要向量的余弦相似度,超过 0.7 阈值自动创建 SEMANTIC 边。这意味着 MemoryGraph 不是静态数据库,而是一张不断自我重新布线的有机记忆网络


三、核心模块二:自主动态注意力(记忆图谱上的动态激活博弈)

范围澄清:祖龙在硬件感知层另有一套三层注意力调度(L0 感知层 → L1 过滤层 → L2 推理层),用于多模态事件过滤。记忆板块的“自主动态注意力”特指在 MemoryGraph 图上运行的动态激活计算机制——它决定哪些记忆节点被唤醒并注入 LLM 的上下文窗口。

3.1 一维线性注意力的结构性缺陷

传统 Agent 的注意力只考虑“时间远近”这一维:

# 传统实现
weight = base × 0.5^(turn_diff / 20) × mode_multiplier

在第 11 轮问到“它多少钱?”时,dialogue:10(时间近但无关)权重为 0.97,dialogue:1(时间远但定义了指代对象)权重仅为 0.35——结果无关信息被注入,关键信息被遗漏。

3.2 图注意力:graph_boost 补偿时间衰减

祖龙在时间衰减公式的基础上,引入 graph_boost 因子,实现结构信息对时间衰减的补偿:

# 祖龙的实现
dialogue:1 的新权重 = 1.0 × 0.35 × 2.0 = 0.70
dialogue:10 的新权重 = 1.0 × 0.97 × 1.0 = 0.97

两者权重差从 2.77 倍缩小到 1.39 倍,dialogue:1 因结构关联被有效“唤醒”并注入上下文。

核心思想:时间衰减是“遗忘”的模拟,graph_boost 是“联想”的模拟——二者博弈的结果构成了动态注意力机制,实时决定哪些记忆进入 LLM 的注意力窗口。这是注意力从一维线性序列向图结构扩散的范式转移。

3.3 注意力模式切换

在注意力窗口构建阶段,LLM 还可以根据任务进度和上下文压力,自主选择两种注意力模式:

  • 全局注意(Global Attention):用于回顾整体目标与高层图结构,防止在长链任务中迷失方向。
  • 局部注意(Local Attention):聚焦当前执行步骤的细节,保证专注度。

这种模式切换由上下文压力监控驱动(详见第五节),与动态注意力机制协同,共同实现最小充分上下文的构建。


四、核心模块三:上下文压力监控(CircuitBreaker 熔断)

4.1 为什么需要熔断?

长时间运行的 Agent 面临上下文膨胀、信息增益递减的严重风险。传统方案(如 LangChain / CrewAI / OpenDevin)普遍采用 max_iterations 的硬限制,本质上是“到点了就停”,对任务语义质量无感知。

祖龙的 CircuitBreaker 实现了 6 信号综合检测

信号检测方式触发条件
重复调用记录最近 20 次 function call 签名相同调用连续出现 ≥ 3 次
模式循环滑动窗口模式匹配3-5 步循环出现 ≥ 2 周期
信息增益递减连续两个上下文的 KL 散度< 阈值
上下文压力上下文窗口利用率> 85%
时间流逝任务执行时长> 可配置上限
无进度空转最近 N 步无文件写入/工具调用> 可配置步数

4.2 三级响应状态机

GREEN → YELLOW(注入警告 prompt,提示 LLM 调整行为)
     → RED(强制停止,序列化当前状态,优雅退出)

与 LangChain 等方案的对比:

方案检测方式
祖龙6 信号综合熔断 + 信息增益检测
LangChainmax_iterations 硬限制
CrewAImax_iterations 硬限制
OpenDevin时间/步数限制

4.3 上下文压力触发注意力切换

上下文压力信号直接监测 LLM 的令牌使用率。当利用率突破 85% 阈值时,系统触发注意力切换流程:

  • 丢弃:当前任务已完成的无关细节和不再需要的临时关联。
  • 重载:从 MemoryGraph 中按需检索下一步相关的节点(通过 BFS 扩散激活),以摘要或详情的分级形式加载。
  • 模式选择:LLM 可根据任务进度自主选择全局注意或局部注意。

这个流程正是“无限上下文”在系统层面的实现路径——通过持续、智能的上下文替换,在逻辑上维系跨越数万轮对话的宏观连续上下文。


五、核心模块四:BFS 扩散激活(联想式检索)

5.1 双路径并行架构

路径数据范围检索方式延迟
热路径(Hot)热窗口内节点(最近约 30 分钟)BFS 广度优先遍历 + 关键词匹配< 50ms
冷路径(Cold)全量历史节点FAISS IVF 索引 + BGE 嵌入< 200ms

两条路径通过 asyncio.gather 并行执行,结果按激活度降序合并,取 Top-K 注入上下文。

5.2 BFS 扩散激活的核心算法

BFS 的实现逻辑:

# 核心思想(简化自源码)
def compute_activations(seed_nodes, max_depth=3):
    # 从种子节点出发,加权 BFS 逐层扩散
    # activation = current_activation × edge_weight × decay(0.5)
    # 双向传播,max_depth=3

为什么用 BFS 而非 DFS? 在记忆图谱中,BFS 逐层扩散的特性恰好模拟人脑的“联想式回忆”——从一个概念出发,先激活最近关联节点,再逐层延伸到更远的关联网络。max_depth=3 的设置在百毫秒级延迟下可遍历 200-500 个关联节点,覆盖绝大多数语义关联路径。

5.3 分级读取策略

为避免上下文窗口膨胀,检索结果采用先摘要后详情的分级读取:

  1. 第一次检索返回节点的 summary 字段(50-150 字)。
  2. LLM 判断哪些节点需要更多上下文。
  3. 按需读取完整 content 字段。

5.4 FC 工具暴露设计

MemoryGraph 内部维护 53 个公开方法,但仅通过 7 个 FC(Function Calling)工具暴露给模型:

FC 工具用途
recall_memory记忆检索
read_memory_node节点详情读取
save_memory_note保存记忆
discover_related关联发现
focus_on_chain聚焦推理链
zulong_memory_searchMCP 项目级记忆搜索
zulong_graph_queryMCP 图谱查询

这种“宽接口、窄暴露”的设计有效降低了 LLM 的自由度,避免模型操作底层图结构时的不可控风险。


六、核心模块五:自然遗忘(艾宾浩斯衰减 + 突触修剪)

6.1 6 级重要度半衰期

祖龙将艾宾浩斯遗忘曲线精确映射为 6 级记忆半衰期:

重要度半衰期说明
TRIVIAL6 小时闲聊寒暄
NORMAL24 小时一般对话
IDENTITY720 小时(30 天)用户姓名等身份信息
FACT360 小时(15 天)知识性事实
IMPORTANT168 小时(7 天)重要决策/偏好
MUST_REMEMBER∞(无穷大)核心约定/使命

重要度采用只升不降策略——即使记忆因长时间未访问而衰减,其重要度标签不会自动降级,但支持用户或系统主动提升。

6.2 衰减算法

# 核心衰减公式
def decay_and_prune(node):
    weight = node.weight × exp(-elapsed_hours × ln(2) / half_life)
    # half_life 取决于节点的重要度级别
    # elapsed_hours 自上次访问以来经过的小时数

这是对艾宾浩斯遗忘曲线的直接工程化,符合 R = R₀ × e^(-t/S) 的标准指数衰减模型。

6.3 突触修剪:二级机制

单纯的衰减并不等于遗忘。祖龙实现了二级修剪:

  1. 软遗忘:节点的 activation 降至阈值以下时,不再参与热路径检索(BFS 遍历),但仍保留在 FAISS 向量索引中,冷路径可重新激活。
  2. 硬修剪:后台异步任务(每 30 分钟)检查总节点数是否超过容量上限(可配置,默认 100,000),按 activation × importance_boost 综合评分排序,移除最低分节点——但 protected=True 的结构边所连接的核心节点不会被移除。

这个设计确保了 MemoryGraph 的容量可控——如同人脑的突触修剪,不重要的记忆被逐渐淡忘,为新的学习腾出空间。


七、系统层面:宏观无限上下文的实现路径

7.1 不是扩大窗口,而是智能替换

祖龙实现“无限上下文”的关键,并非无限制地扩展 LLM 的物理窗口,而是通过上下文压力监控 + 动态注意力切换,始终向模型注入当前任务所必需的最小充分上下文(Minimum Sufficient Context)

三级存储架构为这种快速替换提供了毫秒级的数据获取能力:

层级数据位置访问延迟覆盖范围
热记忆(Hot)Python 内存(NetworkX DiGraph)< 1ms最近 1 小时内访问的节点
温记忆(Warm)LMDB 内存映射文件1-10ms1 小时 - 24 小时访问的节点
冷记忆(Cold)FAISS IVF 索引 + JSON 存储10-200ms全量历史

7.2 跨天级任务挂起/恢复

祖龙支持完整的“暂停 → 关机 → 第二天开机 → 恢复执行”序列化流程:

  • TaskGraph(任务状态树)序列化为 JSON
  • MemoryGraph 激活状态序列化为 GraphML
  • 恢复时重建 NetworkX DiGraph 并重放最近上下文

这使得**跨年级的长期项目(软件开发、学术研究、装修工程等)**可以在没有上下文损失的条件下持续演进。


八、与主流方案的全维对比

能力维度祖龙 (ZULONG)MemGPTLangChain MemoryAutoGPTMem0
记忆结构异构有向图(9 节点 + 7 边)分层 KV 存储消息列表 + 摘要向量存储事实图谱
检索方式BFS 热路径 + FAISS 冷路径LLM 自主管理线性扫描纯向量检索向量 + 图谱
联想能力✅ 7 种边类型自动关联有限三元组
赫布学习✅ 共激活自动建边
艾宾浩斯衰减✅ 6 级半衰期 + 突触修剪基于年龄
上下文压力熔断✅ 6 信号综合熔断max_iterations
动态无限上下文✅ 注意力切换 + 最小充分上下文
跨天级挂起/恢复✅ 完整状态序列化部分支持
热检索延迟< 50ms~100msN/A~200ms~50ms

数据来源:祖龙 TSD v3.0 技术规格说明书(2026-05-11)及公开基准测试结果


九、工程实现速览

组件源文件代码行数核心技术栈
MemoryGraphzulong/memory/memory_graph.py2,784 行NetworkX + LMDB + GraphML
CircuitBreakerzulong/l2/circuit_breaker.py800+ 行6 信号状态机
TaskGraphzulong/l2/task_graph.py1,500+ 行无限深度递归树
InferenceEnginezulong/l2/inference_engine.py5,700+ 行两阶段推理 + 5 层防护
  • 图引擎:Python NetworkX(内存)+ LMDB 持久化 + GraphML 序列化
  • 向量检索:FAISS IVF 索引 + BGE 嵌入模型(BAAI)
  • 并发模型:Python asyncio + 多线程锁细粒度控制
  • 协议支持:MCP(Model Context Protocol),对外暴露 7 个记忆相关工具
  • 总代码规模:82,000+ 行(Python 30,000+ + TypeScript/TSX 52,000+)

十、总结

祖龙记忆系统从架构层面解决了 AI Agent 的“遗忘”问题。它用 2784 行 Python 代码实现了:

  1. 异构记忆图谱:9 种节点 + 7 种边类型,统一所有记忆形态
  2. 赫布学习:共激活自动建边,模拟神经可塑性
  3. 自主动态注意力:时间衰减与 graph_boost 博弈,实现图上动态激活
  4. BFS 扩散激活:联想式记忆检索(热 < 50ms + 冷 < 200ms)
  5. 艾宾浩斯遗忘 + 突触修剪:6 级半衰期 + 二级修剪
  6. CircuitBreaker:6 信号综合熔断,超越传统硬限制
  7. 宏观无限上下文:通过注意力切换实现跨会话的逻辑上下文连续性

我们在 GitHub 开源了全部代码与文档(82K+ 行),搜索 zulong 即可找到仓库。欢迎 Star & PR。


延伸阅读

  1. 祖龙 GitHub 仓库:github.com/beautistart…
  2. 技术规格说明书 (TSD v3.0):docs/architecture/technical-spec-v3.md
  3. MemoryGraph 完全指南:docs/memory_graph/
  4. 系统深度技术分析报告:docs/architecture/system-overview.md
  5. Packer, C. et al. (2023). MemGPT: Towards LLMs as Operating Systems. arXiv:2310.08560.
  6. Ebbinghaus, H. (1885). Über das Gedächtnis. Leipzig: Duncker & Humblot.