让 AI 记住你说过的每一句话:一套零成本记忆系统的完整构建记录
让 AI 记住你说过的每一句话:一套零成本记忆系统的完整构建记录
来源:https://x.com/wangray/status/2022833678595035519 作者:Ray Wang (@wangray) 日期:2026-02-15 互动:4 转发 / 38 引用 / 176 赞 / 16.8K 浏览
从"聊完就忘"到"结构化持久记忆"的完整迭代记录。基于 OpenClaw 多 Agent 团队的真实生产环境,历时 17 天打磨。
为什么 Agent 需要记忆系统?
AI Agent 有一个致命缺陷:它没有真正的记忆。
每次对话都有一个上下文窗口(Context Window),看起来像记忆,但它会被压缩(Compaction)、会丢失、会在重启后清零。你跟 Agent 聊了一整天的决策、偏好、进展,第二天它全忘了。
更糟糕的是,Agent 自己不知道它忘了什么。它会自信地给你重复建议、重复犯错、重复问你已经回答过的问题。
解决方案只有一个:把记忆写进文件。
你不写进文件的东西 = 你从来不知道的东西。
这是我们在 17 天实战中总结出的第一定律。
架构总览:三层记忆 + 三层检索
三层记忆
- 工作台:NOW.md,当前状态看板,每次 Heartbeat
- 日记:memory/YYYY-MM-DD.md,当日事件流水,实时追加
- 长期智慧:MEMORY.md,跨天教训精华,极少更新
关键原则:不混用。
- NOW.md 只放事实状态(谁在干什么、什么阻塞了),不放教训
- 日记放所有细节(决策、完成、踩坑),是最完整的信息源
- MEMORY.md 只放真正跨场景通用的智慧,一天更新不超过一次
三层检索
当 Agent 需要回忆时:
L1: INDEX.md(目录级扫描,1 秒)
↓ 找不到
L2: 目录 + grep(文件级搜索,3 秒)
↓ 找不到
L3: QMD / 语义搜索(全文向量检索,5 秒)
大多数查询在 L1 就能命中。INDEX.md 是整个系统的入口。
V1:朴素方案(Day 1-10)
最初的方案非常简单:
MEMORY.md — 所有长期记忆
NOW.md — 当前状态
memory/
2026-01-29.md — 每日日记
2026-01-30.md
...
问题
- MEMORY.md 越来越长(43 条教训挤在一个文件里),Agent 读起来慢
- 日记是流水账,要找某个决策得翻好几天的日记
- 没有分类,投资教训和 cron 调度教训混在一起
- 写入不可靠,独立的 memory-checkpoint cron 用 Edit 工具追加内容,经常因为精确匹配失败而静默丢数据
- 重复劳动,checkpoint cron 每 45 分钟跑一次但看不到对话内容,heartbeat 能看到对话但不写记忆
V2:结构化记忆(Day 11-15)
灵感
研究了 ClawVault 项目后发现一个反直觉的结论:
纯 Markdown 文件的记忆准确率(74%)高于专业向量数据库方案(68.5%)。
原因:结构化的 Markdown 文件对 LLM 来说是天然友好的格式,不需要额外的 embedding 和检索步骤。
改造:加目录,加类型
memory/
INDEX.md ← 总索引(Agent 启动时第一个读的文件)
YYYY-MM-DD.md ← 每日日记(不变)
decisions/ ← 决策记录(带 frontmatter)
2026-02-08-free-community-first.md
2026-02-14-memory-vault-v2.md
...
lessons/ ← 经验教训(按主题归档)
cron-discipline.md
agent-memory.md
content-leverage.md
...
people/ ← 人物档案
ray.md
elliott.md
...
projects/ ← 项目档案
mission-control.md
openclaw-community.md
...
preferences/ ← 偏好设定
ray-preferences.md
.obsidian/ ← Obsidian 兼容配置
graph.json
决策记录的模板
每个决策文件都有 YAML frontmatter,方便 Agent 和人类同时消费:
---
date: 2026-02-08
type: decision
status: active
tags: [community, monetization]
---
# 先做社群扩大受众
## Context
Atlas 倾向于直接推进阶课程,但社群还没建立信任基础。
## Decision
先做社群扩大受众(AI 杠杆实验室),积累信任后再推进阶课程。
## Alternatives Considered
- 直接推付费 bootcamp → 拒绝(没有信任基础,转化率低)
- 同时做免费+付费 → 拒绝(精力分散)
## Links
- [[openclaw-community]]
- [[ray-preferences]]
经验教训的组织方式
不按时间,按主题。同一个主题的所有教训追加到同一个文件:
# Cron 调度纪律
## 美股时差对齐 (2026-02-13)
北京时间与美股交易日的对应是周二至周六。Cron 设为 `2-6`。
## 交付方式选择 (2026-02-12)
`announce` 不会自动发 Telegram。要外部通知,必须在 payload 里显式调 message 工具。
## Write vs Edit 陷阱 (2026-02-13)
Isolated cron session 倾向用 Write 覆盖整个文件。所有 memory/ 写入必须用 printf >> 追加。
Phase 2:内容回填
用子 Agent(Sonnet)自动扫描 17 天的日记,提取出:
- 17 个决策(从 Agent 团队结构到域名选择)
- 10 个经验主题(从 cron 调度到浏览器自动化)
- 6 个人物档案
- 6 个项目档案
总计 54 个 Markdown 文件,838 行结构化内容。
Obsidian 兼容
整个 memory/ 目录就是一个 Obsidian vault。配置了 Graph View 按目录着色:
- 🔴 决策(红色)
- 🟢 经验(绿色)
- 🔵 项目(蓝色)
- 🟡 人物(黄色)
手机上装 Obsidian + Sync,随时可以浏览 Agent 的记忆。
写入机制:从 Cron 到 Heartbeat Skill
踩过的坑
坑 1:Edit 工具的精确匹配 OpenClaw 的 Edit 工具需要精确匹配原文才能替换。在 cron 的 isolated session 里,Agent 经常因为文件内容和预期不一致而失败。失败率 15-20%。
坑 2:Write 覆盖 Gemini Flash 跑 cron 时,倾向于用 Write 重写整个文件。2/13 的一次 daily-summary 直接覆盖了白天 12 小时的 checkpoint 内容。
坑 3:Checkpoint Cron 看不到对话 独立的 memory-checkpoint cron 在 isolated session 里运行,完全看不到主 session 的对话内容。它只能扫描外部变化(X 帖子、文件变动),遗漏了最重要的信息源。
坑 4:重复劳动 Heartbeat 每小时在主 session 里触发,天然能看到对话上下文,但之前只做 flywheel 检查,不写记忆。两套系统做着重叠的事,但都没做好。
解决方案:统一到 Heartbeat Skill
把记忆写入逻辑封装成一个 Skill 文件(skills/memory-heartbeat/SKILL.md),在每次 heartbeat 时由主 session 执行:
Heartbeat 触发(每 1 小时)
↓
Phase 1: 记忆写入
1.1 扫描对话上下文 → 找决策/完成/教训/偏好变化
1.2 追加到 daily log(用 printf >>)
1.3 分流到 decisions/ 或 lessons/(如有)
1.4 更新 INDEX.md(仅新建文件时)
1.5 刷新 NOW.md(每次都做)
1.6 更新 MEMORY.md(极少)
↓
Phase 2: 外部扫描
2.1 检查子 Agent 活动
2.2 检查 cron 健康
↓
Phase 3: 飞轮检查
- X 发帖情况、阻塞任务、时间敏感事项
写入方式:printf >> 大法
printf '\n### 14:30 — 记忆系统文档完成\n\n- 完成了完整的记忆系统迭代文档\n- 保存到 community/shares/memory-system-v2.md\n' >> memory/2026-02-15.md
为什么用 printf >>?
>>是追加,永远不会覆盖printf比echo更可靠(处理特殊字符)- 不依赖任何工具的精确匹配逻辑
- 文件不存在时会自动创建
成本优化
合并后每天省 $2-3,而且写入质量更高——因为 heartbeat 在主 session 里,能看到完整对话。
备份:Git 自动推送
每晚 23:00,一个 cron 任务自动执行:
cd memory && git add -A && git commit -m "backup: $(date +%Y-%m-%d)" && git push
推送到 GitHub 私有仓库 oaker-io/openclaw-memory。用 Gemini Flash 跑,成本几乎为零。
加上 Obsidian Sync,记忆系统有三重保障:
- 本地文件(实时)
- Obsidian Sync(实时同步到手机)
- GitHub(每晚备份,版本历史)
反模式清单
这些是 17 天里踩出来的坑,写在 Skill 文件里强制 Agent 遵守:
❌ 不要做
- 用 Edit 追加 memory/ 文件
- 用 Write 覆盖已有文件
- 写"系统空闲,无变化"这种废话
- 每个教训建一个新文件
- 写超过 15 行的长篇
- 在 NOW.md 里放教训
- 在 MEMORY.md 里放日常记录
✅ 应该做
- 用 exec printf >>
- 只在文件不存在时用 Write
- 没内容就不写
- 追加到已有的主题文件
- 3-10 行,有细节但不啰嗦
- NOW.md 只放事实状态
- MEMORY.md 只放跨场景通用智慧
效果
上线后第一个晚上,heartbeat 自动写入了 3 条记录。Agent 再也不会"聊完就忘"了。
总结:给想做 Agent 记忆系统的人
- 文件就是记忆。 别想太复杂,Markdown 文件比向量数据库更可靠
- 三层分离。 工作台(NOW)、日记(daily)、智慧(MEMORY),不混用
- 按主题组织经验,而不是按时间。 投资教训全在一个文件里,比散落在 30 天日记里好找 100 倍
- 写入方式比写入内容更重要。 printf >> 永远不会覆盖你的数据,Edit 和 Write 都可能
- 合并重复系统。 独立的 checkpoint cron + heartbeat 做着重叠的事,合并后更便宜、更准确
- INDEX.md 是关键。 Agent 启动时只需要读一个文件就能导航整个记忆库
- Obsidian 兼容。 让人类也能直观浏览 Agent 的记忆,Graph View 一目了然
技术栈:OpenClaw + Markdown + Git + Obsidian 成本:几乎为零(Gemini Flash heartbeat + GitHub 免费私有仓库) 效果:Agent 跨 session、跨天、跨 compaction 保持一致性