记忆压缩系统

📎 引用文件

本文引用的文件 - compression.py - hierarchy.py - lifecycle.py - persistent.py - search_index.py - semantic_links.py - test_memory_lifecycle.py - test_persistent_memory.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录:配置与监控

简介

本文件为 Vibe-Trading 记忆压缩系统的技术文档,聚焦记忆内容的压缩算法、去重策略、摘要生成机制、压缩率控制、质量评估与可逆性保证、存储格式与解压过程、性能影响,以及配置参数、阈值设置和监控指标。同时给出不同数据类型的最优压缩策略建议与自定义压缩规则的开发方法。

项目结构

记忆子系统位于 agent/src/memory 下,围绕“持久化—生命周期—压缩—层级路由—检索—语义链接”形成完整闭环: - 持久化与基础数据结构:persistent.py - 生命周期管理(质量评分、衰减、垃圾回收):lifecycle.py - 三级压缩管线(raw → daily → digest):compression.py - 层级目录路由(按类型分目录):hierarchy.py - 全文检索索引(FTS5):search_index.py - 语义关联(BM25):semantic_links.py

graph TB A["PersistentMemory<br/>持久化与索引"] --> B["MemoryLifecycle<br/>质量/衰减/GC"] B --> C["CompressionPipeline<br/>压缩管线"] A --> D["MemoryHierarchy<br/>层级路由"] A --> E["MemorySearchIndex<br/>FTS5检索"] A --> F["SemanticLinker<br/>语义关联"]

图表来源 - persistent.py:196-307 - lifecycle.py:71-273 - compression.py:160-353 - hierarchy.py:34-176 - search_index.py:113-303 - semantic_links.py:158-231

章节来源 - persistent.py:196-307 - lifecycle.py:71-273

核心组件

章节来源 - persistent.py:196-637 - lifecycle.py:71-421 - compression.py:160-353 - hierarchy.py:34-436 - search_index.py:113-481 - semantic_links.py:158-372

架构总览

记忆系统在写入时进行去重与规范化,在读取时通过关键词匹配或 FTS5 检索并考虑语义链接扩展;在后台生命周期管理中根据质量、访问频率与时间衰减计算重要性,执行归档/删除与压缩;压缩采用三级策略,确保信息高保留率且具备可逆性(原始内容归档)。

sequenceDiagram participant App as "调用方" participant PM as "PersistentMemory" participant HL as "MemoryLifecycle" participant CP as "CompressionPipeline" participant SI as "MemorySearchIndex" participant SL as "SemanticLinker" App->>PM : add(name, content, type, description) PM->>PM : is_duplicate() 滑动窗口去重 PM->>PM : sanitize/truncate/frontmatter PM->>SI : index_entry() (可选) PM->>SL : discover_links() (可选) PM-->>App : path Note over HL : 定时或事件触发 App->>HL : run_gc(dry_run=False) HL->>PM : list_entries() HL->>CP : should_compress(level, last_accessed) alt 需要压缩 HL->>CP : apply_compression(entry_path, body, keywords, target_level) CP->>CP : archive_original() CP->>CP : compress_to_daily()/compress_to_digest() CP-->>HL : compressed_content HL->>HL : _write_compressed() 原子替换正文+更新frontmatter end HL-->>App : actions[]

图表来源 - persistent.py:462-578 - lifecycle.py:183-273 - compression.py:168-334 - search_index.py:207-240 - semantic_links.py:179-231

详细组件分析

压缩算法与摘要生成(CompressionPipeline)

flowchart TD Start(["开始"]) --> CheckLevel{"当前级别与最后访问时间"} CheckLevel --> |raw且超7天| ToDaily["压缩到daily"] CheckLevel --> |daily且超30天| ToDigest["压缩到digest"] CheckLevel --> |不满足| End(["结束"]) ToDaily --> Archive["归档原文到archive/"] ToDaily --> Split["切分为句子"] Split --> IDF["计算句子IDF"] IDF --> Score["句子打分"] Score --> Select["保留首尾+Top-K"] Select --> Header["可选:添加Keywords头"] Header --> Retention["估计保留率(Jaccard)"] Retention --> End ToDigest --> Tokenize["词法切分"] Tokenize --> TFIDF["词频*IDF打分"] TFIDF --> TopK["取Top-N关键词"] TopK --> Bullet["生成要点列表"] Bullet --> End

图表来源 - compression.py:168-353

章节来源 - compression.py:60-154 - compression.py:168-353

去重策略(PersistentMemory)

flowchart TD In(["输入: name, description, content"]) --> Hash["计算content_hash"] Hash --> Clean["清理过期哈希(>30s)"] Clean --> Dup{"是否在窗口内存在?"} Dup --> |是| Block["拒绝写入"] Dup --> |否| Write["写入文件并更新索引"]

图表来源 - persistent.py:35-38 - persistent.py:440-461 - persistent.py:609-628

章节来源 - persistent.py:440-461 - persistent.py:609-628

生命周期与重要性衰减(MemoryLifecycle)

classDiagram class MemoryLifecycle { +reinforce(name, event, source) bool +track_access(entry) void +run_gc(dry_run) list[dict] -_execute_gc_action(entry, action) void -_append_gc_log(actions, dry_run) void -_write_compressed(entry, body, level) void -_update_frontmatter_field(path, field, value) void } class PersistentMemory { +list_entries() MemoryEntry[] +find(name) MemoryEntry? +add(...) Path? +remove(name) bool } class CompressionPipeline { +should_compress(level, last_accessed, now) str? +apply_compression(path, content, keywords, target) str? +archive_original(path) Path? +estimate_retention(original, compressed) float } MemoryLifecycle --> PersistentMemory : "读取/写入条目" MemoryLifecycle --> CompressionPipeline : "GC时触发压缩"

图表来源 - lifecycle.py:71-421 - persistent.py:196-307 - compression.py:160-353

章节来源 - lifecycle.py:71-421 - persistent.py:80-91

层级路由与扫描(MemoryHierarchy)

章节来源 - hierarchy.py:34-176 - hierarchy.py:200-379

章节来源 - search_index.py:113-481 - semantic_links.py:158-372

依赖关系分析

graph LR P["persistent.py"] --> L["lifecycle.py"] L --> C["compression.py"] P --> H["hierarchy.py"] P --> S["search_index.py"] P --> M["semantic_links.py"]

图表来源 - lifecycle.py:21-26 - persistent.py:222-232 - search_index.py:113-173 - semantic_links.py:158-173

章节来源 - lifecycle.py:21-26 - persistent.py:222-232

性能考量

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

故障排查指南

章节来源 - lifecycle.py:192-202 - compression.py:258-290 - search_index.py:160-173 - semantic_links.py:296-305

结论

Vibe-Trading 的记忆压缩系统以“持久化—生命周期—压缩—检索—关联”为核心,实现了高保留率的三级压缩、严格的去重与原子写入、基于重要性的垃圾回收与按需压缩、高效的全文检索与语义关联。通过可配置的阈值与开关,可在不同场景下平衡压缩率、质量与性能。

[本节为总结,无需特定文件引用]

附录:配置与监控

压缩配置参数与阈值

章节来源 - compression.py:23-39 - lifecycle.py:35-53 - search_index.py:1-9 - semantic_links.py:1-7

质量评估与监控指标

章节来源 - compression.py:336-353 - lifecycle.py:204-241 - persistent.py:80-91 - persistent.py:440-461

不同数据类型的最优压缩策略建议

[本节为策略建议,无需特定文件引用]

自定义压缩规则开发方法

章节来源 - compression.py:121-154 - compression.py:220-256 - compression.py:168-193 - lifecycle.py:243-273