缓存系统架构

📎 引用文件

本文引用的文件 - agent/src/memory/persistent.py - agent/src/memory/compression.py - agent/src/memory/hierarchy.py - agent/src/memory/lifecycle.py - agent/src/memory/search_index.py - agent/src/config/env_schema.py - agent/src/config/accessor.py

目录

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

简介

本文件为 Vibe-Trading 缓存系统的综合架构文档,聚焦多级缓存策略、压缩算法、层次化存储设计、生命周期管理、持久化机制与内存优化。同时覆盖配置选项、失效策略、性能监控、大数据量优化与故障恢复,并提供架构图与数据处理流程图,以及调优指南和常见问题解决方案。

项目结构

Vibe-Trading 的“缓存/记忆”子系统位于 agent/src/memory,围绕持久化、压缩、层次化路由、生命周期管理与全文检索展开;配置集中在 agent/src/config。

graph TB subgraph "配置层" Cfg["EnvConfig<br/>MemoryConfig"] end subgraph "持久化层" PM["PersistentMemory<br/>读写 .md + 索引"] H["MemoryHierarchy<br/>按类型分目录"] end subgraph "生命周期层" ML["MemoryLifecycle<br/>质量/衰减/GC"] end subgraph "压缩层" CP["CompressionPipeline<br/>raw→daily→digest"] end subgraph "检索层" FTS["MemorySearchIndex<br/>SQLite FTS5"] end Cfg --> PM Cfg --> ML PM --> H ML --> CP PM --> FTS

图表来源 - agent/src/config/env_schema.py:461-537 - agent/src/memory/persistent.py:196-311 - agent/src/memory/hierarchy.py:34-90 - agent/src/memory/lifecycle.py:71-106 - agent/src/memory/compression.py:160-193 - agent/src/memory/search_index.py:113-145

章节来源 - agent/src/memory/persistent.py:196-311 - agent/src/config/env_schema.py:461-537

核心组件

章节来源 - agent/src/memory/persistent.py:196-311 - agent/src/memory/hierarchy.py:34-90 - agent/src/memory/compression.py:160-193 - agent/src/memory/lifecycle.py:71-106 - agent/src/memory/search_index.py:113-145 - agent/src/config/env_schema.py:461-537

架构总览

下图展示写入与读取的主流程,包括层次化路由、压缩、GC、FTS 索引与锁保护。

sequenceDiagram participant App as "调用方" participant PM as "PersistentMemory" participant H as "MemoryHierarchy" participant FS as "文件系统" participant L as "MemoryLifecycle" participant C as "CompressionPipeline" participant S as "MemorySearchIndex" App->>PM : add(name, content, type) PM->>H : route_entry(type, slug.md) H-->>PM : path PM->>FS : write frontmatter + body (原子写) PM->>S : index_entry(id,title,desc,kw,body) Note over PM,S : 可选:语义链接发现 App->>PM : find_relevant(query) alt FTS 可用 PM->>S : search(query) S-->>PM : matches PM-->>App : entries else 回退 PM->>PM : token 匹配 + 重要性加权 PM-->>App : entries end App->>L : run_gc(dry_run=False) L->>L : compute_importance(qs,ac,days) alt 低于归档阈值 L->>FS : move to archive else 低于删除阈值且允许删除 L->>FS : copy to archive + unlink end L->>C : should_compress(level,last_accessed) alt 需要压缩 L->>C : apply_compression(entry,content,keywords,target) C->>FS : archive original C-->>L : compressed L->>FS : update frontmatter + replace body end

图表来源 - agent/src/memory/persistent.py:462-578 - agent/src/memory/persistent.py:358-438 - agent/src/memory/hierarchy.py:70-90 - agent/src/memory/lifecycle.py:183-273 - agent/src/memory/compression.py:292-334 - agent/src/memory/search_index.py:207-250

详细组件分析

持久化层:PersistentMemory

flowchart TD Start(["写入入口"]) --> Slug["生成slug"] Slug --> Route{"启用层次化?"} Route --> |是| HPath["route_entry(type, slug.md)"] Route --> |否| BasePath["base_dir/slug.md"] HPath --> Write["写入frontmatter+正文"] BasePath --> Write Write --> Index["更新MEMORY.md索引"] Index --> FTS{"启用FTS?"} FTS --> |是| IndexFTS["index_entry(...)"] FTS --> |否| End IndexFTS --> End(["完成"])

图表来源 - agent/src/memory/persistent.py:462-578 - agent/src/memory/persistent.py:196-206

章节来源 - agent/src/memory/persistent.py:122-143 - agent/src/memory/persistent.py:440-453 - agent/src/memory/persistent.py:358-438

层次化存储:MemoryHierarchy

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

图表来源 - agent/src/memory/hierarchy.py:34-90 - agent/src/memory/hierarchy.py:145-176 - agent/src/memory/hierarchy.py:200-261 - agent/src/memory/hierarchy.py:313-379 - agent/src/memory/hierarchy.py:381-436

章节来源 - agent/src/memory/hierarchy.py:34-90 - agent/src/memory/hierarchy.py:145-176 - agent/src/memory/hierarchy.py:200-261 - agent/src/memory/hierarchy.py:313-379 - agent/src/memory/hierarchy.py:381-436

压缩管线:CompressionPipeline

flowchart TD A["输入: entry.content, keywords, level, last_accessed"] --> Check{"should_compress?"} Check --> |否| End["不压缩"] Check --> |是| Target{"target=daily or digest"} Target --> |daily| Daily["关键句提取(TF-IDF)<br/>拼接关键词头"] Target --> |digest| Digest["关键词提取(TF*IDF)<br/>生成要点列表"] Daily --> Archive["archive_original()"] Digest --> Archive Archive --> Write["返回压缩后内容"] Write --> End

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

章节来源 - agent/src/memory/compression.py:160-193 - agent/src/memory/compression.py:194-256 - agent/src/memory/compression.py:258-334 - agent/src/memory/compression.py:336-353

生命周期管理:MemoryLifecycle

flowchart TD GStart["run_gc(dry_run)"] --> Scan["list_entries()"] Scan --> ForEach{"遍历条目"} ForEach --> Age{"age>=MIN_AGE_DAYS?"} Age --> |否| Next["下一个"] Age --> |是| Imp["compute_importance(qs,ac,days)"] Imp --> Threshold{"imp < archive/delete threshold?"} Threshold --> |是| Action{"action=archive/delete"} Threshold --> |否| Next Action --> Exec{"dry_run?"} Exec --> |否| DoAction["执行归档/删除"] Exec --> |是| Log["记录决策"] DoAction --> Rebuild["_rebuild_index()"] Rebuild --> CompressCheck["should_compress(level,last_accessed)"] CompressCheck --> |需要| Apply["apply_compression(...)"] Apply --> UpdateFront["更新frontmatter+正文"] UpdateFront --> Next Log --> Next Next --> ForEach

图表来源 - agent/src/memory/lifecycle.py:183-273 - agent/src/memory/lifecycle.py:275-318 - agent/src/memory/lifecycle.py:323-421 - agent/src/memory/persistent.py:80-91

章节来源 - agent/src/memory/lifecycle.py:71-106 - agent/src/memory/lifecycle.py:112-178 - agent/src/memory/lifecycle.py:183-273 - agent/src/memory/persistent.py:80-91

全文检索:MemorySearchIndex

classDiagram class MemorySearchIndex { +db_path : Path +index_entry(id,title,description,keywords,body) void +remove_entry(id) void +search(query,max_results) MemoryMatch[] +rebuild_all(entries_data) int +close() void }

图表来源 - agent/src/memory/search_index.py:113-145 - agent/src/memory/search_index.py:207-250 - agent/src/memory/search_index.py:252-302 - agent/src/memory/search_index.py:304-355 - agent/src/memory/search_index.py:357-445

章节来源 - agent/src/memory/search_index.py:113-145 - agent/src/memory/search_index.py:207-250 - agent/src/memory/search_index.py:252-302 - agent/src/memory/search_index.py:304-355 - agent/src/memory/search_index.py:357-445

依赖关系分析

graph LR Env["EnvConfig.MemoryConfig"] --> PM["PersistentMemory"] Env --> ML["MemoryLifecycle"] PM --> H["MemoryHierarchy"] PM --> S["MemorySearchIndex"] ML --> C["CompressionPipeline"] ML --> PM

图表来源 - agent/src/config/env_schema.py:461-537 - agent/src/memory/persistent.py:196-311 - agent/src/memory/lifecycle.py:71-106

章节来源 - agent/src/config/env_schema.py:461-537 - agent/src/memory/persistent.py:196-311 - agent/src/memory/lifecycle.py:71-106

性能考量

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

故障排查指南

章节来源 - agent/src/memory/search_index.py:252-302 - agent/src/memory/persistent.py:358-438 - agent/src/memory/persistent.py:440-453 - agent/src/memory/lifecycle.py:183-273 - agent/src/memory/compression.py:160-193 - agent/src/memory/lifecycle.py:275-318 - agent/src/memory/hierarchy.py:92-143 - agent/src/memory/hierarchy.py:381-436

结论

Vibe-Trading 缓存系统以“持久化 + 层次化 + 压缩 + 生命周期 + 全文检索”为核心,形成高可用、可扩展、低成本的记忆存储方案。通过配置开关灵活组合 Tier 1(质量/衰减/GC)与 Tier 2(层次化/链接/压缩/FTS),既能满足小规模场景的轻量需求,也能支撑大数据量下的高吞吐与低延迟。配合原子写、文件锁、归档与自动重建等机制,系统在稳定性与可恢复性方面表现稳健。

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

附录:配置与调优

配置选项与环境变量

章节来源 - agent/src/config/env_schema.py:461-537

失效策略与生命周期

章节来源 - agent/src/memory/persistent.py:80-91 - agent/src/memory/lifecycle.py:183-273 - agent/src/memory/compression.py:160-193

大数据量优化建议

章节来源 - agent/src/memory/search_index.py:304-355 - agent/src/memory/persistent.py:207-216

常见问题与解决

章节来源 - agent/src/memory/search_index.py:357-445 - agent/src/memory/compression.py:336-353 - agent/src/memory/persistent.py:41-73 - agent/src/memory/lifecycle.py:183-273