数据存储层

📎 引用文件

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

目录

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

简介

本文件为 Vibe-Trading 的数据存储层提供系统化文档,覆盖多级存储架构(内存缓存、持久化存储与压缩策略)、分层记忆系统、数据生命周期管理与自动清理机制、数据库选型与索引优化、备份恢复与迁移策略、版本兼容性、存储性能监控与容量规划、扩展方案,以及典型场景(会话历史、研究结果、策略配置)的存储管理实践。

项目结构

数据存储层围绕“持久化记忆 + 可选增强能力”构建: - 持久化记忆:基于 Markdown 文件的跨会话记忆,支持元数据前导块、分类目录路由、全文检索与语义链接。 - 层级组织:按 memory_type 将条目路由到 category 子目录,提升扫描与搜索效率。 - 压缩归档:对长期未访问的条目进行分级压缩(原始→每日摘要→要点摘要),并保留原文件归档。 - 生命周期管理:质量评分、衰减、垃圾回收与容量控制。 - 全文检索:SQLite FTS5 倒排索引,支持 CJK 分词与片段高亮。 - 语义链接:BM25 相似度发现与 .relations.json 侧车文件维护。 - 会话存储:文件系统 JSON/JSONL 日志,用于会话、消息与执行尝试记录。

graph TB A["应用调用"] --> B["PersistentMemory<br/>持久化记忆"] B --> C["MemoryHierarchy<br/>分类目录路由"] B --> D["CompressionPipeline<br/>三级压缩"] B --> E["MemorySearchIndex<br/>FTS5 索引"] B --> F["SemanticLinker<br/>语义链接"] B --> G["MEMORY.md<br/>轻量索引快照"] H["SessionStore<br/>会话存储"] --> I["sessions/{id}/session.json"] H --> J["sessions/{id}/messages.jsonl"] H --> K["sessions/{id}/attempts/{attempt_id}/attempt.json"]

图表来源 - agent/src/memory/persistent.py:196-637 - agent/src/memory/hierarchy.py:34-436 - agent/src/memory/compression.py:160-353 - agent/src/memory/search_index.py:113-481 - agent/src/memory/semantic_links.py:158-372 - agent/src/session/store.py:16-259

章节来源 - agent/src/memory/persistent.py:196-637 - agent/src/memory/hierarchy.py:34-436 - agent/src/memory/compression.py:160-353 - agent/src/memory/lifecycle.py:71-421 - agent/src/memory/search_index.py:113-481 - agent/src/memory/semantic_links.py:158-372 - agent/src/session/store.py:16-259

核心组件

章节来源 - agent/src/memory/persistent.py:196-637 - agent/src/memory/hierarchy.py:34-436 - agent/src/memory/compression.py:160-353 - agent/src/memory/lifecycle.py:71-421 - agent/src/memory/search_index.py:113-481 - agent/src/memory/semantic_links.py:158-372 - agent/src/session/store.py:16-259

架构总览

存储层采用“文件为主、数据库为辅”的混合架构: - 主数据:Markdown 条目(含 frontmatter 元数据),通过分类目录组织,便于 O(类别规模) 级扫描与检索。 - 辅助索引:SQLite FTS5 倒排索引,提供 O(log n) 级别全文检索;若不可用则回退到本地 token 匹配。 - 语义关联:BM25 相似度生成 .relations.json 侧车文件,支持搜索结果扩展。 - 压缩与归档:按时间阈值触发压缩,原文件原子归档至 archive 目录,保障可恢复性。 - 生命周期:质量评分与访问计数驱动重要性衰减,GC 根据阈值归档或(可选)删除,并触发压缩。 - 会话存储:独立于记忆的 JSON/JSONL 日志,保证会话历史的可追加性与可回溯性。

sequenceDiagram participant App as "应用" participant PM as "PersistentMemory" participant MH as "MemoryHierarchy" participant CP as "CompressionPipeline" participant SI as "MemorySearchIndex" participant SL as "SemanticLinker" App->>PM : add(name, content, type) PM->>MH : route_entry(type, slug.md) MH-->>PM : path PM->>PM : 写入frontmatter+正文 PM->>SI : index_entry(id,title,desc,body) PM->>SL : discover_links & save_relations Note over PM,SL : 可选功能由配置开关控制

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

详细组件分析

持久化记忆(PersistentMemory)

flowchart TD Start(["写入入口"]) --> Dedup{"是否重复?"} Dedup --> |是| ReturnNone["返回 None"] Dedup --> |否| Route["路由到分类目录"] Route --> Write["写入frontmatter+正文"] Write --> Index["更新FTS5索引"] Index --> Links["发现并保存语义链接"] Links --> End(["完成"])

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

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

层级目录(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[] +migrate_flat_entry(file_path, memory_type) Path? }

图表来源 - agent/src/memory/hierarchy.py:34-436

章节来源 - agent/src/memory/hierarchy.py:34-436

压缩管道(CompressionPipeline)

flowchart TD S(["开始"]) --> Check{"是否需要压缩?"} Check --> |否| End(["结束"]) Check --> |是| Archive["原子归档原文件"] Archive --> Level{"目标级别"} Level --> |daily| Daily["TF-IDF 关键句提取"] Level --> |digest| Digest["关键词要点摘要"] Daily --> Retention["估算保留率"] Digest --> Retention Retention --> End

图表来源 - agent/src/memory/compression.py:160-353

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

生命周期管理(MemoryLifecycle)

flowchart TD Start(["运行GC"]) --> Scan["扫描所有条目"] Scan --> Age{"是否满足最小年龄?"} Age --> |否| Next["下一个条目"] Age --> |是| Imp["计算重要性"] Imp --> Threshold{"低于阈值?"} Threshold --> |是| Action{"归档/删除"} Threshold --> |否| Next Action --> Compress{"是否启用压缩?"} Compress --> |是| Apply["应用压缩并写回"] Compress --> |否| Next Apply --> Next Next --> Done(["完成"])

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

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

全文检索(MemorySearchIndex)

sequenceDiagram participant PM as "PersistentMemory" participant SI as "MemorySearchIndex" PM->>SI : index_entry(id,title,desc,body) SI->>SI : _prepare_cjk(text) SI->>SI : INSERT OR REPLACE memories Note over SI : 触发器同步到 FTS5 PM->>SI : search(query) SI->>SI : _sanitize_fts_query(query) SI-->>PM : MemoryMatch[]

图表来源 - agent/src/memory/search_index.py:207-302 - agent/src/memory/persistent.py:358-438

章节来源 - agent/src/memory/search_index.py:113-481 - agent/src/memory/persistent.py:358-438

语义链接(SemanticLinker)

classDiagram class SemanticLinker { +discover_links(entry_title, entry_tokens, all_entries_data, top_k) (filename,score)[] +save_relations(entry_path, links) void +load_relations(entry_path) (filename,score)[] +resolve_wikilinks(body) string[] +get_relation_path(entry_path) Path +remove_relations(entry_path) void }

图表来源 - agent/src/memory/semantic_links.py:158-372

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

会话存储(SessionStore)

graph LR A["SessionStore"] --> B["sessions/{id}/session.json"] A --> C["sessions/{id}/messages.jsonl"] A --> D["sessions/{id}/attempts/{attempt_id}/attempt.json"]

图表来源 - agent/src/session/store.py:16-259

章节来源 - agent/src/session/store.py:16-259

依赖关系分析

graph TB PM["PersistentMemory"] --> MH["MemoryHierarchy"] PM --> SI["MemorySearchIndex"] PM --> SL["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:42-73 - agent/src/memory/search_index.py:147-173 - agent/src/memory/compression.py:258-291 - agent/src/memory/semantic_links.py:282-305 - agent/src/session/store.py:164-193

结论

Vibe-Trading 的数据存储层以文件为核心,辅以 SQLite FTS5 与语义链接增强,实现了高效、可扩展且可恢复的记忆与会话存储体系。通过层级目录、压缩归档与生命周期管理,系统在性能与容量之间取得平衡,并提供灵活的配置开关以适应不同部署环境。

附录

数据库选型与表结构

章节来源 - agent/src/memory/search_index.py:147-196 - agent/src/memory/search_index.py:357-407

备份恢复与迁移策略

章节来源 - agent/src/memory/hierarchy.py:92-143 - agent/src/memory/hierarchy.py:381-436 - agent/src/memory/search_index.py:304-355

版本兼容性

章节来源 - agent/src/memory/semantic_links.py:54-56 - agent/src/memory/semantic_links.py:303-305 - agent/src/memory/persistent.py:257-258 - agent/src/memory/search_index.py:160-173

典型数据存储场景

章节来源 - agent/src/session/store.py:16-259 - agent/src/memory/persistent.py:196-637 - agent/src/memory/hierarchy.py:19-21