在构建 24/7 主动代理如 openclaw(moltbot/clawdbot)时,长时记忆是关键瓶颈。传统文件式存储如 Markdown 日志易膨胀且检索低效,而 memU 框架提供分层结构:Resource(原始数据)、Item(提取事实)、Category(主题聚类),完美适配 SQLite 实现混合 episodic(事件序列)和 semantic(稳定知识)存储。本文聚焦 SQLite-backed 方案,强调衰减曲线与召回阈值,实现高效主动召回与持久化聊天状态。
SQLite Schema 设计:Episodic + Semantic 混合
核心是三层表结构,模拟 memU 文件系统式内存。
-
resources 表(episodic 原始层):
- id (INTEGER PRIMARY KEY)
- user_id (TEXT)
- session_id (TEXT) # clawdbot 聊天会话
- content (TEXT) # 完整对话 / 事件 JSON
- timestamp (INTEGER) # Unix 时间戳
- modality (TEXT) # 'chat', 'file', 'tool'
此表存储 raw episodic 数据,如 moltbot 连续聊天流,确保可追溯。
-
items 表(混合事实层):
- id (INTEGER PRIMARY KEY)
- resource_id (INTEGER REFERENCES resources)
- user_id (TEXT)
- kind (TEXT) # 'episodic' 或'semantic'
- content (TEXT) # 短事实:"用户偏好 Python 调试"
- embedding (BLOB) # 1536-dim vector (OpenAI text-embedding-3-small)
- importance (REAL DEFAULT 0.5) # 0-1 分数
- half_life_days (INTEGER DEFAULT 30) # 衰减半衰期
- created_at (INTEGER)
- updated_at (INTEGER)
- valid_until (INTEGER NULLABLE)
Episodic items 绑定时间事件,如 "2026-03-01 讨论 ClawdBot 部署";semantic items 存储持久偏好,如 "风险容忍度:中性"。
-
categories 表 & item_categories(语义聚类):
- categories: id, name, summary, embedding
- item_categories: item_id, category_id
使用 sqlite-vss 扩展支持向量搜索:pip install sqlite-vss,初始化 db.execute('CREATE VIRTUAL TABLE items_fts USING vss0(items_embedding(1536))')。
证据显示,此 schema 镜像 memU 的 Resource-Item-Category,支持 OpenClaw 外部内存协议。[1]
衰减曲线:Exponential Decay for 真实召回
记忆非永存,需模拟人类遗忘。采用指数衰减公式:
decayed_score = base_similarity * exp(-ln(2) * age_days / half_life_days)
- 参数清单:
memory_type importance half_life_days 示例 correction 0.9-0.95 180 错误修正,长期保留 preference 0.7-0.9 180 用户风格,稳定 decision 0.85-0.95 90 项目决策,中期 observation 0.3-0.5 14 临时观察,快速衰减 general 0.4-0.6 60 通用事实
在 retrieve 时,SQL 查询:
SELECT *,
(cosine_similarity(?, embedding) * importance * exp(-0.693 * (strftime('%s','now') - created_at)/86400.0 / half_life_days)) AS decayed_score
FROM items_fts
WHERE decayed_score > 0.75 -- 召回阈值
ORDER BY decayed_score DESC LIMIT 10;
半衰期 30 天:30 天后分数 halved,90 天 1/8。evergreen 如 MEMORY.md 设 half_life=∞ (importance 永不衰减)。
召回阈值与 Proactive Loop
召回阈值(默认 0.75)过滤噪声,仅注入高相关上下文,节省 token。低于阈值则 fallback 纯近期 episodic。
Proactive Recall 循环(针对 openclaw 24/7):
- Auto-Capture(响应后):LLM 提取 items,分类 kind/importance,插入 DB。检查 duplicate:相似度 >0.9 更新 semantic。
- Background Monitor(每 5min cron):扫描 resources,预测 intent(如 "用户最近查 NVDA,监控价格"),预存 proactive items。
- Pre-Recall(用户输入前):embedding 查询 top-10 decayed_score >0.75,注入 prompt:"相关记忆:[list]"。
- Compaction Trigger:session 近 80% 上下文窗,silent turn 强制 store summaries。
监控要点:
- 阈值调优:A/B 测试 0.7 vs 0.8,metric = 召回准确率(Locomo benchmark ~92%)。
- 回滚:若 DB 膨胀,PRAGMA journal_mode=WAL;scale >10k 用外部 ANN 如 FAISS。
- Clawdbot 持久化:session_id 索引,确保跨重启恢复。
落地参数:
- Embedding model: text-embedding-3-small (成本低)。
- LLM 提取:Claude-3.5-sonnet,prompt:"从对话提取 3-5 semantic/episodic facts"。
- 阈值:开发 0.8,生产 0.75。
- 清理:每周 cron DELETE WHERE valid_until <now () OR decayed_score <0.1。
此方案将 OpenClaw token 成本降至 1/10,支持 moltbot 连续聊天无遗忘。[2]
资料来源:
[1] https://github.com/NevaMind-AI/memU
[2] memU OpenClaw 内存整合文档 (mem0.ai/blog/mem0-memory-for-openclaw)