agentic_huge_data_base / wiki
页面 jcode · 6.2 记忆管理器与记忆智能体·DeepWiki 中文全文译文

6.2 · 记忆管理器与记忆智能体(Memory Manager and Memory Agent)

代理式研究运行时 · 聚焦本章的模块关系、源码依据与实现要点。

项目jcode 章节6.2 状态全文译文 模块记忆与上下文、检索、召回与索引、界面与交互、模型调用与提供方适配
源码线索
  • crates/jcode-memory-types/Cargo.toml
  • crates/jcode-memory-types/src/graph.rs
  • crates/jcode-memory-types/src/graph/graph_tests.rs
  • crates/jcode-memory-types/src/lib.rs
  • src/compaction.rs
  • src/compaction_tests.rs
  • src/embedding.rs
  • src/import_tests.rs
  • src/lib.rs
  • src/memory.rs
模块标签
  • 记忆与上下文
  • 检索、召回与索引
  • 界面与交互
  • 模型调用与提供方适配
  • 入库与解析

章节正文

记忆管理器与记忆智能体

记忆管理器与记忆代理

相关源文件

本章引用的主要源码文件:

  • crates/jcode-memory-types/Cargo.toml
  • crates/jcode-memory-types/src/graph.rs
  • crates/jcode-memory-types/src/graph/graph_tests.rs
  • crates/jcode-memory-types/src/lib.rs
  • src/compaction.rs
  • src/compaction_tests.rs
  • src/embedding.rs
  • src/import_tests.rs
  • src/lib.rs
  • src/memory.rs
  • src/memory/pending.rs
  • src/memory_agent.rs
  • src/memory_prompt.rs
  • src/memory_tests.rs
  • src/sidecar.rs
  • src/tool/memory.rs
  • src/tui/app/conversation_state.rs
  • src/tui/info_widget_memory_render.rs

记忆管理器(Memory Manager)与记忆代理(Memory Agent)构成了一个双层持久化存储系统,旨在支持跨会话学习与上下文检索。与由 CompactionManager 管理的短期会话上下文不同,该系统通过结合向量嵌入与基于图的遍历,管理长期事实、用户偏好以及项目特定实体。

记忆条目生命周期

MemoryEntry 是长期存储的基本单元。每个条目都会被分类,以帮助代理区分不同类型的知识。

记忆类别
类别用途
Fact关于项目或领域的通用信息。
Preference用户特定的设置、编码风格或工作流选择。
Correction用户对先前错误的反馈。
Entity特定代码组件或模块的定义或描述。
作用域与持久化

记忆存储在两个不同的作用域中,以平衡项目特定知识与全局用户身份:

  • 项目作用域:通过项目路径的哈希值,关联到当前工作目录。这些记忆仅在同一项目内工作时才会被检索。
  • 全局作用域:用户级别的偏好设置,存储在中央 global_memory.json 文件中,会跟随用户在所有目录下生效。

来源:src/memory.rs:32-35, src/memory.rs:180-220, src/tool/memory.rs:101-112

基于嵌入向量的相似度搜索

系统通过 jcode-embedding 包,使用本地基于 ONNX 的嵌入模型(all-MiniLM-L6-v2)来执行语义搜索。

嵌入器外观

src/embedding.rs 中的 Embedder 管理着一个进程级别的模型实例。为优化性能:

  • LRU 缓存:一个 128 槽位的 LRU 缓存(embedding_lru)存储了最近的文本到嵌入向量的映射,以避免重复的 ONNX 推理。
  • 空闲卸载:通过 maybe_unload_if_idle 方法,如果模型在可配置的时长内未被使用,会自动从内存中卸载。
  • 自动生成MemoryEntry 对象通过 ensure_embedding 扩展方法,在需要时自动生成其嵌入向量。

来源:src/embedding.rs:1-48, src/embedding.rs:216-219, src/memory.rs:93-112

通过 MemoryGraph 进行级联检索

除了简单的向量相似度之外,jcode 还使用 MemoryGraph(通过 petgraph::StableGraph 实现)来表示记忆之间的关系。它跟踪显式标签、自动发现的聚类以及语义链接。

检索模式

MemoryTool 支持不同的检索模式:

  1. 最近:检索最近创建或更新的记忆。
  2. 搜索:使用嵌入向量执行纯向量相似度搜索。
  3. 级联:查询的默认模式。它首先进行语义搜索以找到"种子"节点,然后遍历图以查找相关记忆。
图操作
  • 链接:代理可以使用 link 操作,显式地将两个记忆以权重(0.0 到 1.0)进行链接,这会在 MemoryGraph 中创建一条边。
  • 相关性related 操作允许代理探索特定记忆 ID 的图邻域,最多可达指定的 depth 深度。

来源:crates/jcode-memory-types/src/graph.rs:20-30, src/tool/memory.rs:97-112, src/tool/memory.rs:170-256

记忆代理与 Sidecar 验证

MemoryAgent 是一个后台任务,负责管理记忆生命周期,而不会中断主代理循环。

Sidecar 相关性验证

MemoryAgent 检索候选记忆时,它会使用 Sidecar 客户端来验证这些记忆与当前会话的相关性。

  • 模型选择Sidecar 优先使用 gpt-5.3-codex-spark,否则回退到 claude-haiku-4-5-20241022,以实现快速、低成本的验证。
  • 过滤:候选记忆通过 Sidecar::verify_relevance 进行验证(通过 Sidecar::extract_memories_with_existing 调用)。
  • 优化:它在 RetrievalContext 中跟踪 verified_idsrejected_ids,以记录检索缺口并提高未来准确性。
异步 PENDING_MEMORY 管线

为防止记忆检索阻塞用户界面或主大语言模型调用,系统使用了一个 PENDING_MEMORY 管线。

数据流:记忆检索管线

jcode · 异步 PENDING_MEMORY 管线 · 图 1
jcode · 异步 PENDING_MEMORY 管线 · 图 1

来源:src/memory/pending.rs:7-9, src/memory_agent.rs:1-11, src/memory_agent.rs:28-36, src/sidecar.rs:1-21

维护与优化

MemoryAgent 会定期执行维护操作,以确保长期记忆存储的健康状态。

置信度衰减与聚类优化
  • 聚类:代理会定期运行聚类优化(每 CLUSTER_REFINEMENT_INTERVAL 一次),使用 ClusterEntry 将相似记忆分组在一起。
  • 最终提取:在会话结束时,run_final_extraction 使用 Sidecar 从整个会话记录中提取新的记忆。
  • 去重PENDING_MEMORY 系统会在 180 秒的时间窗口内,抑制近乎重复的相同记忆集合的重新注入。
自然语言到代码实体空间的映射

下图展示了 MemoryTool 如何弥合用户自然语言意图与底层记忆实现之间的差距。

接口:记忆工具到记忆管理器

jcode · 自然语言到代码实体空间的映射 · 图 2
jcode · 自然语言到代码实体空间的映射 · 图 2

来源:src/memory.rs:325, src/memory/pending.rs:29-35, src/memory_agent.rs:50-51, src/memory_agent.rs:121-141, src/embedding.rs:162