Hotdry.
ai-systems

memU SQLite 混合式 episodic+semantic 存储:针对 openclaw 的衰减曲线与召回阈值

基于 SQLite 实现 memU 的 episodic+semantic 混合内存,支持 openclaw 等代理的 24/7 主动召回。详述衰减曲线、召回阈值参数及爪子机器人聊天状态持久化工程实践。

在构建 24/7 主动代理如 openclaw(moltbot/clawdbot)时,长时记忆是关键瓶颈。传统文件式存储如 Markdown 日志易膨胀且检索低效,而 memU 框架提供分层结构:Resource(原始数据)、Item(提取事实)、Category(主题聚类),完美适配 SQLite 实现混合 episodic(事件序列)和 semantic(稳定知识)存储。本文聚焦 SQLite-backed 方案,强调衰减曲线与召回阈值,实现高效主动召回与持久化聊天状态。

SQLite Schema 设计:Episodic + Semantic 混合

核心是三层表结构,模拟 memU 文件系统式内存。

  1. 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 连续聊天流,确保可追溯。

  2. 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 存储持久偏好,如 "风险容忍度:中性"。

  3. 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):

  1. Auto-Capture(响应后):LLM 提取 items,分类 kind/importance,插入 DB。检查 duplicate:相似度 >0.9 更新 semantic。
  2. Background Monitor(每 5min cron):扫描 resources,预测 intent(如 "用户最近查 NVDA,监控价格"),预存 proactive items。
  3. Pre-Recall(用户输入前):embedding 查询 top-10 decayed_score >0.75,注入 prompt:"相关记忆:[list]"。
  4. 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)

查看归档