记忆管理器与记忆智能体
记忆管理器与记忆代理
相关源文件
本章引用的主要源码文件:
crates/jcode-memory-types/Cargo.tomlcrates/jcode-memory-types/src/graph.rscrates/jcode-memory-types/src/graph/graph_tests.rscrates/jcode-memory-types/src/lib.rssrc/compaction.rssrc/compaction_tests.rssrc/embedding.rssrc/import_tests.rssrc/lib.rssrc/memory.rssrc/memory/pending.rssrc/memory_agent.rssrc/memory_prompt.rssrc/memory_tests.rssrc/sidecar.rssrc/tool/memory.rssrc/tui/app/conversation_state.rssrc/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 支持不同的检索模式:
- 最近:检索最近创建或更新的记忆。
- 搜索:使用嵌入向量执行纯向量相似度搜索。
- 级联:查询的默认模式。它首先进行语义搜索以找到"种子"节点,然后遍历图以查找相关记忆。
图操作
- 链接:代理可以使用
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_ids和rejected_ids,以记录检索缺口并提高未来准确性。
异步 PENDING_MEMORY 管线
为防止记忆检索阻塞用户界面或主大语言模型调用,系统使用了一个 PENDING_MEMORY 管线。
数据流:记忆检索管线
来源: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 如何弥合用户自然语言意图与底层记忆实现之间的差距。
接口:记忆工具到记忆管理器
来源: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