Memory Tree 记忆树架构
v0.14.0Memory Tree 记忆树架构 — 通用版,适用于任何 AI Agent 的长期记忆系统。包含三棵树设计、热冷路径管道、14 条打分规则、数据库 Schema、检索 API 和坑点总结。当用户需要记忆系统、长期记忆、AI Agent 记忆架构时加载此技能。 (无需翻译,原文已包含中文描述)
运行时依赖
安装命令
点击复制技能文档
Memory Tree 记忆树架构 — 通用版 源自 OpenHuman Memory Tree 设计理念,经 Hermes Agent 实战验证后抽象为通用架构。 适用于任何需要长期记忆、多轮对话、信息压缩的 AI Agent 系统。
一、核心思想 问题:传统 Agent 记忆是"碎片袋"——所有对话塞进 context,越聊越慢,重要信息被淹没。 答案:Memory Tree 把记忆变成"大脑"——有层次、有分类、有热度、有压缩。 三棵树,三个作用域 树 作用域 功能 Source Tree 每个来源(QQ/飞书/文档) 滚动缓冲区,L0→L1→L2 级联压缩 Topic Tree 每个实体(人/项目/概念) 热度驱动,越频繁越深入 Global Tree 全局 每日摘要,跨来源聚合 为什么是树,不是向量库? 向量库只能回答"什么与查询相似"。树能回答: "今天发生了什么?" → Global Tree "这个人的最新动态?" → Topic Tree + hotness "上周二下午 3 点说了什么?" → Source Tree + provenance 结构让记忆可导航,嵌入保证语义搜索。
二、架构流程 输入源(聊天/文档/邮件) ↓ Canonicalize → 标准化 Markdown + 来源元数据 ↓ Chunker → 确定性 ID, ≤3k token/块 ↓ Fast Score → 14 条规则快速打分(无 LLM) ↓ Persist → SQLite 持久化(chunks + FTS5 索引) ↓ ┌─────────────────────────────────────┐ │ 冷路径(异步后台) │ ├─────────────────────────────────────┤ │ Deep Score → LLM 判断 admitted/dropped │ │ Entity Extract → 提取实体 │ │ Topic Route → 自动分类 │ │ Hotness Engine → 热度追踪 │ │ Sealer → L0→L1 摘要压缩 │ └─────────────────────────────────────┘ ↓ 检索 → 中文 LIKE / 英文 FTS5 MATCH + 热度排序
三、热路径管道(无 LLM,<50ms)
- Canonicalize(标准化)
- Chunk(分块)
- Fast Score(14 条规则,无 LLM)
四、数据库 Schema -- 记忆块 CREATE TABLE memory_chunks ( id TEXT PRIMARY KEY, session_id TEXT, message_id INTEGER, content TEXT, content_hash TEXT, token_count INTEGER, source TEXT, role TEXT, timestamp REAL, score REAL, is_admitted INTEGER, -- 0=dropped, 1=admitted, 2=sealed score_reasons TEXT -- JSON 数组 );
-- 主题/实体 CREATE TABLE memory_topics ( id INTEGER PRIMARY KEY, name TEXT, entity_type TEXT, hotness REAL, summary TEXT, last_updated REAL );
-- Chunk-Topic 关联 CREATE TABLE memory_chunk_topics ( chunk_id TEXT, topic_id INTEGER, relevance REAL );
-- 摘要(L1/L2) CREATE TABLE memory_summaries ( id INTEGER PRIMARY KEY, topic_id INTEGER, level INTEGER, -- 1=L1, 2=L2 content TEXT, child_chunk_ids TEXT, sealed_at REAL );
-- FTS5 全文索引(外部内容表) CREATE VIRTUAL TABLE memory_chunks_fts USING FTS5( content='memory_chunks', content_rowid='rowid' );
-- Trigram 索引(中文搜索) CREATE VIRTUAL TABLE memory_chunks_fts_trigram USING fts5tokenize=trigram(...);
五、冷路径管道(异步,有 LLM)
- JobQueue(SQLite 轻量队列)
- DeepScorer(LLM 判断)
- EntityExtractor(正则提取)
- TopicRouter(自动分类)
- HotnessEngine(热度追踪)
- Sealer(摘要压缩)
六、检索 API 搜索(中文 LIKE + 英文 FTS5 MATCH) def search(query, limit=10, min_score=0.1, topic=None, days=None): has_cjk = bool(re.search(r'[\u4e00-\u9fff]', query)) if has_cjk: # 中文:LIKE(准确但慢) sql = """ SELECT c., t.name as topic_name, t.hotness FROM memory_chunks c LEFT JOIN memory_chunk_topics ct ON c.id = ct.chunk_id LEFT JOIN memory_topics t ON ct.topic_id = t.id WHERE c.content LIKE ? AND c.is_admitted >= 1 AND c.score >= ? ORDER BY c.score DESC, t.hotness DESC LIMIT ? """ params = [f'%{query}%', min_score, limit] else: # 英文:FTS5 MATCH(快) sql = """ SELECT c.*, t.name as topic_name, t.hotness FROM memory_chunks c JOIN memory_chunks_fts f ON c.rowid = f.rowid LEFT JOIN memory_chunk_topics ct ON c.id = ct.chunk_id LEFT JOIN memory_topics t ON ct.topic_id = t.id WHERE f MATCH ? AND c.is_admitted >= 1 AND c.score >= ? ORDER BY c.score DESC, t.hotness DESC LIMIT ? """ params = [query, min_score, limit]
其他检索方法 方法 说明 search(query) 全文搜索 get_topic_summary