tagmind
tagMind — 结构化标签记忆
基于用户自定义 tag prompts,从对话中抽取结构化信息,持久存储到本地 SQLite。
固定路径
| 文件 | 路径 |
|---|---|
| 脚本 | ~/.openclaw/skills/tagmind/scripts/ |
| 数据库 | ~/.openclaw/tagmind/memory.db |
| Tag 配置 | ~/.openclaw/tagmind/prompts.json |
agentId / userId
- agentId:系统提示 Runtime 行中
agent=<id>的值;缺省用main - userId:inbound 消息的 sender ID;缺省用系统用户名
$USER
操作一:初始化
每次使用前先确保 DB 存在:
python3 ~/.openclaw/skills/tagmind/scripts/init.py
操作二:读取记忆
用户问「你还记得我什么」「查看我的信息」「我的记忆」时:
python3 ~/.openclaw/skills/tagmind/scripts/read.py <agentId>
将输出内容格式化展示给用户,空字段标注「暂无记录」。 同时将记忆作为隐式上下文融入后续对话(用正确称呼、符合偏好等),不逐字背诵。
输出中包含新鲜度标记:
- 无标记:90天内有更新,可信
[warm]:90~180天未更新,可能过时[cold ⚠]:超过180天未更新,建议向用户确认是否仍然准确
操作三:写入记忆
用户提供个人信息、或说「记住 / 保存 / 别忘了」时:
- 先运行 init.py 确保 DB 就绪
- 读取
~/.openclaw/tagmind/prompts.json了解 tag 定义 - 对照每个 tag 的 description,从对话中提取对应信息
- 每个有新信息的 tag 单独写入:
# 普通更新(用户补充/修改信息)
python3 ~/.openclaw/skills/tagmind/scripts/write.py <agentId> <tag_name> "<tag_memory>"
# 冲突更新(用户纠正了已有信息,如换了城市、换了工作)
python3 ~/.openclaw/skills/tagmind/scripts/write.py <agentId> <tag_name> "<tag_memory>" --conflict
重要:
<tag_name>必须严格使用prompts.json中各 tag 的name字段值(如name、preferences、background、goals、personality、context)。禁止自创 tag_name(不能用occupation、hobbies等未定义字段)。所有信息归入最匹配的已有 tag。
只写有实质内容的 tag,空值不覆盖已有数据。
写入时会自动将旧值存入历史记录,不会丢失。
操作四:清除记忆
用户说「忘掉我」「删除我的信息」时:
python3 -c "
import sqlite3
from pathlib import Path
db = Path.home() / '.openclaw/tagmind/memory.db'
with sqlite3.connect(db) as conn:
conn.execute('DELETE FROM tag_memories WHERE agent_id=?', ('$AGENT_ID',))
conn.execute('DELETE FROM tag_history WHERE agent_id=?', ('$AGENT_ID',))
print('[tagMind] 已清除所有记忆')
"
操作五:查看 tag 历史
用户问「我之前填写的 XX 是什么」「你记的 XX 改过几次了」时:
python3 ~/.openclaw/skills/tagmind/scripts/history.py <agentId> <tag_name>
输出当前值、更新时间、以及每次被覆盖时保存的历史值(含更新原因)。
操作六:衰减检查
用户问「有没有过期的信息」或在读取记忆时发现 [cold ⚠] 标记时:
# 仅查看衰减报告
python3 ~/.openclaw/skills/tagmind/scripts/decay.py <agentId>
# 查看报告并将 cold tag 标记为 archived(不删除,可用 history.py 查看)
python3 ~/.openclaw/skills/tagmind/scripts/decay.py <agentId> --archive-cold
收到报告后,可以向用户确认过期信息是否仍然准确,再用写入操作更新。
抽取原则
- 只记事实:用户明确说过的,不推测
- 增量更新:新信息追加或替换,不清空其他 tag
- 简洁存储:每个 tag 控制在 1-3 句话内
- 自然融入:记忆体现在回复方式里,不逐字背诵
- 冲突感知:用户纠正已有信息时加
--conflict标记,旧值自动归档保留
冲突解决规则
当用户提供的新信息与已存储的信息矛盾时(如更换城市、换工作、改变偏好):
- 最新的信息优先 — 用新值覆盖旧值,旧值自动保存到历史记录
- 加
--conflict标记 — 区分普通补充和主动纠错,方便事后追溯 - 旧值不删除 — 用
history.py仍可查看所有历史值 - 不向用户确认 — 直接更新,除非语义不清楚应该写入哪个 tag
衰减机制
| 状态 | 条件 | 显示 | 建议操作 |
|---|---|---|---|
| active | 90天内有更新 | 无标记 | 正常使用 |
| warm | 90~180天未更新 | [warm] |
留意,有机会时确认 |
| cold | 超过180天未更新 | [cold ⚠] |
向用户确认是否仍然准确 |
读取记忆时自动显示标记。发现 [cold ⚠] 时,可在对话中自然地向用户确认,如:
"我记得你之前在上海工作,现在还是吗?"
自定义 Tag Prompts
编辑 ~/.openclaw/tagmind/prompts.json,增删 tags 数组。
默认 6 个 tag:name / preferences / background / goals / personality / context。