记忆管理

📎 引用文件

本文引用的文件 - agent/src/memory/persistent.py - agent/src/memory/hierarchy.py - agent/src/memory/compression.py - agent/src/memory/search_index.py - agent/src/memory/lifecycle.py - agent/src/memory/semantic_links.py - agent/tests/test_persistent_memory.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录:操作示例与最佳实践

简介

本文件系统性阐述 Vibe-Trading 的记忆管理系统,覆盖工作空间记忆、持久化记忆与分层记忆的实现原理;详细说明存储结构、检索算法与压缩策略;给出保存、查询、删除等具体操作路径;解释语义搜索、相关性评分与自动召回机制;并说明生命周期管理、垃圾回收与数据迁移。最后提供性能优化建议与扩展方法,帮助读者在工程实践中高效使用与演进该子系统。

项目结构

记忆系统位于 agent/src/memory 目录下,采用“核心持久化 + 可选增强”的模块化设计: - 持久化层:基于本地 Markdown 文件(带 frontmatter)实现跨会话记忆,维护索引 MEMORY.md。 - 分层路由:按 memory_type 将条目路由到分类子目录,支持 O(类别规模) 范围扫描。 - 全文检索:SQLite FTS5 倒排索引,提供 O(log n) 级别检索与片段高亮。 - 语义链接:BM25 相似度发现关联条目,以 .relations.json 侧车文件持久化。 - 压缩管线:三级压缩(raw -> daily -> digest),保留原始内容归档。 - 生命周期:质量分更新、重要性衰减、容量型垃圾回收与压缩触发。

graph TB subgraph "持久化层" PM["PersistentMemory<br/>读写 .md 与 MEMORY.md"] HIER["MemoryHierarchy<br/>分类目录路由"] end subgraph "检索与语义" FTS["MemorySearchIndex<br/>SQLite FTS5 索引"] LINKS["SemanticLinker<br/>BM25 语义链接"] end subgraph "生命周期与压缩" LIFECYCLE["MemoryLifecycle<br/>质量/衰减/GC"] COMP["CompressionPipeline<br/>raw->daily->digest"] end PM --> HIER PM --> FTS PM --> LINKS LIFECYCLE --> PM LIFECYCLE --> COMP FTS --> PM LINKS --> PM

图表来源 - agent/src/memory/persistent.py:196-637 - agent/src/memory/hierarchy.py:34-176 - agent/src/memory/search_index.py:113-481 - agent/src/memory/semantic_links.py:158-372 - agent/src/memory/lifecycle.py:71-421 - agent/src/memory/compression.py:160-353

章节来源 - agent/src/memory/persistent.py:196-637 - agent/src/memory/hierarchy.py:34-176

核心组件

章节来源 - agent/src/memory/persistent.py:122-143 - agent/src/memory/hierarchy.py:34-90 - agent/src/memory/search_index.py:96-121 - agent/src/memory/semantic_links.py:158-177 - agent/src/memory/compression.py:160-193 - agent/src/memory/lifecycle.py:71-98

架构总览

记忆系统以“可插拔增强”的方式围绕持久化层构建:默认仅使用文件系统与 MEMORY.md 索引;按需启用 FTS5、语义链接、层级路由与压缩。所有写操作通过文件锁保护,保证并发安全。

sequenceDiagram participant App as "调用方" participant PM as "PersistentMemory" participant H as "MemoryHierarchy" participant FTS as "MemorySearchIndex" participant L as "SemanticLinker" participant C as "CompressionPipeline" App->>PM : add(name, content, type, description) PM->>H : route_entry(type, slug.md) H-->>PM : path PM->>PM : 写入frontmatter与body PM->>FTS : index_entry(id, title, desc, keywords, body) PM->>L : discover_links(...) L-->>PM : links PM->>PM : 更新MEMORY.md索引 Note over PM,FTS : 首次空检索时自动重建FTS索引

图表来源 - agent/src/memory/persistent.py:462-578 - agent/src/memory/hierarchy.py:70-90 - agent/src/memory/search_index.py:207-250 - agent/src/memory/semantic_links.py:179-230

详细组件分析

持久化记忆(PersistentMemory)

flowchart TD Start(["开始"]) --> CheckDedup{"是否重复写入?"} CheckDedup --> |是| EndSkip["跳过写入"] CheckDedup --> |否| Route["路由到目标路径"] Route --> WriteFM["写入frontmatter与正文"] WriteFM --> UpdateIndex["更新MEMORY.md"] UpdateIndex --> OptionalFTS{"启用FTS5?"} OptionalFTS --> |是| IndexFTS["index_entry()"] OptionalFTS --> |否| SkipFTS["跳过"] IndexFTS --> OptionalLinks{"启用语义链接?"} SkipFTS --> OptionalLinks OptionalLinks --> |是| DiscoverLinks["discover_links()"] OptionalLinks --> |否| Done["完成"] DiscoverLinks --> Done

图表来源 - agent/src/memory/persistent.py:440-578 - agent/src/memory/persistent.py:358-438

章节来源 - agent/src/memory/persistent.py:122-143 - agent/src/memory/persistent.py:196-307 - agent/src/memory/persistent.py:309-438 - agent/src/memory/persistent.py:440-578

分层记忆(MemoryHierarchy)

classDiagram class MemoryHierarchy { +route_entry(memory_type, filename) Path +scan_all() Path[] +scan_category(category) Path[] +recover_extensionless_entries() Path[] +migrate_flat_entry(file_path, memory_type) Path? +rebuild_index(entries) void }

图表来源 - agent/src/memory/hierarchy.py:34-176 - agent/src/memory/hierarchy.py:178-261 - agent/src/memory/hierarchy.py:313-436

章节来源 - agent/src/memory/hierarchy.py:70-90 - agent/src/memory/hierarchy.py:92-176 - agent/src/memory/hierarchy.py:200-261 - agent/src/memory/hierarchy.py:313-436

全文检索(MemorySearchIndex)

sequenceDiagram participant PM as "PersistentMemory" participant FTS as "MemorySearchIndex" PM->>FTS : index_entry(id,title,desc,keywords,body) Note over FTS : 触发器自动同步到 memories_fts PM->>FTS : search(query, max_results) FTS-->>PM : [MemoryMatch...] alt 首次空结果且未重建 PM->>FTS : rebuild_all(entries_data) PM->>FTS : search(query, max_results) end

图表来源 - agent/src/memory/search_index.py:147-196 - agent/src/memory/search_index.py:207-250 - agent/src/memory/search_index.py:304-355 - agent/src/memory/persistent.py:358-438

章节来源 - agent/src/memory/search_index.py:113-196 - agent/src/memory/search_index.py:207-355 - agent/src/memory/search_index.py:357-446

语义链接(SemanticLinker)

flowchart TD A["新条目tokens"] --> B["构建语料(排除自身)"] B --> C["计算IDF与平均长度"] C --> D["逐条计算BM25分数"] D --> E{"分数>=阈值?"} E --> |是| F["加入候选"] E --> |否| G["忽略"] F --> H["排序并截取top-k"] H --> I["写入.relations.json"]

图表来源 - agent/src/memory/semantic_links.py:73-150 - agent/src/memory/semantic_links.py:179-230 - agent/src/memory/semantic_links.py:232-319

章节来源 - agent/src/memory/semantic_links.py:158-372

压缩管线(CompressionPipeline)

flowchart TD S["开始"] --> T{"是否满足压缩阈值?"} T --> |否| End["不压缩"] T --> |是| Arch["归档原始文件"] Arch --> Level{"目标级别"} Level --> |daily| Daily["TF-IDF关键句提取"] Level --> |digest| Digest["术语提取与摘要"] Daily --> Ret["估算保留率"] Digest --> Ret Ret --> W["写回压缩内容与frontmatter"] W --> End

图表来源 - agent/src/memory/compression.py:160-193 - agent/src/memory/compression.py:194-256 - agent/src/memory/compression.py:258-353

章节来源 - agent/src/memory/compression.py:160-353

生命周期管理(MemoryLifecycle)

sequenceDiagram participant L as "MemoryLifecycle" participant PM as "PersistentMemory" participant C as "CompressionPipeline" L->>PM : list_entries() loop 遍历条目 L->>L : 计算importance(质量,访问,时间) alt 低于归档/删除阈值 L->>PM : 归档或删除 L->>PM : _rebuild_index() end end opt 启用压缩 L->>C : should_compress(...) C-->>L : target_level L->>C : apply_compression(...) C-->>L : compressed_body L->>PM : 写回压缩内容与frontmatter end

图表来源 - agent/src/memory/lifecycle.py:183-273 - agent/src/memory/lifecycle.py:275-379

章节来源 - agent/src/memory/lifecycle.py:71-178 - agent/src/memory/lifecycle.py:183-379

依赖关系分析

graph LR PM["PersistentMemory"] --> H["MemoryHierarchy"] PM --> FTS["MemorySearchIndex"] PM --> LNK["SemanticLinker"] LC["MemoryLifecycle"] --> PM LC --> CP["CompressionPipeline"]

图表来源 - agent/src/memory/persistent.py:196-637 - agent/src/memory/lifecycle.py:71-421

章节来源 - agent/src/memory/persistent.py:196-637 - agent/src/memory/lifecycle.py:71-421

性能考量

[本节为通用性能讨论,无需特定文件来源]

故障排查指南

章节来源 - agent/src/memory/persistent.py:358-438 - agent/src/memory/search_index.py:147-196 - agent/src/memory/semantic_links.py:232-319 - agent/src/memory/compression.py:258-334 - agent/src/memory/lifecycle.py:183-317

结论

Vibe-Trading 的记忆系统以轻量、可扩展、可观测为目标,通过“持久化 + 可选增强”的架构,在保证数据安全与并发一致性的前提下,提供了高效的检索、语义关联与生命周期管理能力。结合层级路由、FTS5 索引、BM25 语义链接与三级压缩,可在不同规模与场景下取得良好的性能与可维护性平衡。

[本节为总结性内容,无需特定文件来源]

附录:操作示例与最佳实践

以下示例以“代码片段路径”形式给出,便于定位实现位置,避免直接粘贴代码。

章节来源 - agent/src/memory/persistent.py:313-607 - agent/src/memory/search_index.py:252-446 - agent/src/memory/lifecycle.py:112-273 - agent/src/memory/compression.py:160-334 - agent/src/memory/hierarchy.py:70-436