OpenClaw 第一篇: MD 记忆系统
前言
OpenClaw 的整体记忆系统是采用本地 Markdown 文件来记录,因此本文从 md 文件出发,分析当用户输入问题后,整个背后是怎么运作的,整个数据流是如何产生的。
QClaw 实际上是基于 OpenClaw 的二次开发,因为我是 QClaw 的重度用户,对 QClaw 理解的比较充分,因此本文以 QClaw 代码为例。
最近股市行情很火热,因此我这一个多月来精心调教了一只 理财虾 ,本文就以该 Agent 为例详细分析下 OpenClaw 的 MD 记忆系统。
记忆文件总览
现在市面上的文章大多数都是简单介绍下每个文件是什么含义,我这里会以理财为切入口,从理财虾的角度,介绍每个文件具体放什么样的内容。
~/.qclaw/workspace/├── MEMORY.md # 长期关键记忆:偏好、决策、持久事实├── memory/│ ├── 2026-04-30.md # 今日日志│ ├── 2026-04-29.md # 昨日日志│ └── ... # 历史日志├── USER.md # 用户身份以及个人信息├── SOUL.md # Agent 人格设定,包括性格,语气,风格等├── TOOLS.md # 工具如何使用的经验├── HEARTBEAT.md # 定时检查清单└── AGENTS.md # Agent的工作流程以及操作准则~/.qclaw/agents/agentID/sessions # 记录每个 session下每轮交互的详细记录├── sessionID1.jsonl├── sessionID2.jsonl
AGENT.md
AGENT.md 中记录了 Agent 的整个工作流程以及行为准则,决定了Agent【做什么,有什么权限,怎么做】,在每次启动 Session 时加载,大多数情况下并不会主动修改该文件。一般只会在以下情况下修改:
-
用户主动修改:用户希望重新制定Agent 的工作流程以及相关的配置
-
OpenClaw 升级修改:在重大版本更新时可能会更新 AGENT.md
Agent人设:SOUL.md
SOUL.md 中就记录了该 Agent 的角色,风格,也就是人设。可以用户自行修改或者模型帮你自动生成。 比如说我的SOUL.md 如下,是我的投资助手:
# SOUL.md我是QClaw,老板的投资助手。## 性格- 专业但不啰嗦,直给结论- 市场有风险时严肃提醒,行情好时跟着高兴- 不说废话,数据说话- 复盘报告写得好不好直接影响老板的钱包,认真对待## 表达风格- 用emoji但不滥用:🔥大涨 📉大跌 🚨风险 ⚠️注意- 表格优先,文字补充- 操作建议要具体,不说"建议关注"这种废话
用户画像:USER.md
USER.md 记录了用户的信息以及用户的要求,让 Agent 更懂你。 我的理财虾里面就主要存放了我的具体持仓和我的交易策略。内容如下:
# USER.md - 老板档案- **Name:** 宋老板- **What to call them:** 老板- **Timezone:** Asia/Shanghai- **角色定位:** 股票投资高手,注重估值+周期+政策分析---## 当前持仓(2026-04-30 更新)| 分类 | 股票 | 代码 | 金额 | 占比 ||:---|:---|:---|:---:|:---:|| 核心底仓 | 招商证券 | 600999 | 40w | 40% || 核心底仓 | 国金证券 | 600109 | 27w | 27% || 弹性股 | *** | *** | **w | *% || 弹性股 | 荣盛石化 | 002493 | 8w | 8% || 现金 | — | — | 25w | 25% |---*详细投资体系见 `memory/交易策略.md`*
记忆系统
长期记忆:MEMORY.md
该文件是长期记忆的存储文件,相当于OpenClaw 的大脑,指导 Agent 如何进行操作。其作用如下:
-
关键信息提炼:将历史的经验教训,客观事实等信息提取出来记录形成长期指导
-
冷启自动加载:每次主会话启动时候自动加载,掌握全局信息。
以我的复盘 Agent 为例,为了隐私,我删掉了大部分内容,其文件内容如下:
# MEMORY.md - 长期记忆> 最后更新:2026-05-02> 持仓和交易规则见 USER.md,投资体系详见 memory/交易策略.md## 复盘流程(当前)**一条命令搞定,不要手动造轮子**:```python generate_report.py --date YYYY-MM-DD```脚本自动完成:拉行情(qt.gtimg.cn) → 刷新K线(新浪) → 算均线/BIAS/抵扣价 → 生成报告### 完整步骤1. 确认 USER.md 持仓是否需要更新2. `python generate_report.py --date YYYY-MM-DD`(K线默认强制刷新)3. 如持仓变了,同步改脚本 `PORTFOLIO` + USER.md
短期记忆:memory/YY-MM-DD.md
memory/YY-MM-DD.md 记录了在某天的操作,任务进展等,举例来说 memory/2026-4-30.md 就记录了 4月30号那天发生的事情,内容也是通过大模型提炼出来的。举例参见:
# 2026-04-30 记忆## 4/30复盘 — v2重生成 (23:12)- 老板加仓**券商ETF 5w**- ✅ 本次规范流程:temp → write_file.py → memory/26-04-30-复盘报告.md- 报告路径变更:从根目录迁移至 `memory/26-04-30-复盘报告.md`- v2更新:新增券商ETF分析,券商板块合计65w(57%);现金调为35w;综合评分3.4→3.5- 旧根目录报告已清理## 4/30复盘 — v2重生成 (23:32)- 老板加仓5w券商ETF,要求重生成复盘报告,路径改为 memory/26-04-30-复盘报告.md- 本次使用write_file.py规范流程写入(上次v1用了内置write,已纠正)- 报告分5章:宏观/大盘/持仓逐一/汇总表/节后计划 + 牛市见顶检查- 报告统一路径规范:memory/YY-MM-DD-复盘报告.md
工作记忆:sessions/session-ID.json
sessions/session-ID.json 记录了在当前会话下的系统运行下的所有对话内容,工具调用结果等,不需要用户编辑,系统自动记录,不推荐修改。一个 Agent 可以有多个 SessionID 。
Sessions 文件夹的核心功能为:
-
当前 session(会话)断点续聊:当你和Agent聊到一半重启OpenClaw,再次打开同一聊天窗口,能够无缝之前的话题。
-
并发控制和状态锁:防止同一会话被多个请求修改,避免上下文混乱
-
上下文窗口管理:高效管理对话历史的token占用,避免每次都重复计算
为了理清整个过程是如何处理的,我来通过我调教出来的理财虾来进行分析
-
首先,我输入我的请求:【现在帮我生成今日复盘报告】
{"message": {"role": "user","content": [{"type": "text","text": "Sender (untrusted metadata):\n```json\n{\n\"label\": \"openclaw-control-ui\",\n\"id\": \"openclaw-control-ui\"\n}\n```\n\n[Sat 2026-05-02 01:58 GMT+8] 现在帮我生成今日复盘报告"}]}}
-
然后,模型根据 memory.md 思考整个复盘过程,开始调用工具:generate_report.py,该工具中包含了【拉取股票价格->计算技术指标->生成报告】 整个完整的过程:
{"message": {"role": "assistant","content": [{"type": "thinking","thinking": "The user wants me to generate today's daily review report. According to MEMORY.md, I should use the script `generate_report.py`. Today is 2026-05-02.\n\nLet me run the script directly.","thinkingSignature": "reasoning_content"},{"type": "text","text": "好的老板,马上跑复盘脚本。"},{"type": "toolCall","name": "exec","arguments": {"command": "python C:\\Users\\song\\.qclaw\\workspace\\generate_report.py --date 2026-05-02","workdir": "C:\\Users\\song\\.qclaw\\workspace","yieldMs": 120000}}]}}
-
最后,执行完 generate_report.py 后,接收调用工具的结果:
{"message": {"role": "toolResult","toolName": "exec","content": [{"type": "text","text": "[date] 报告日期: 2026-05-02 (周六)\r\n[dir] K线目录: ./_kline_data\r\n\r\n[fetch] 拉取实时行情 (qt.gtimg.cn 批量)...\r\n 【此处省略n行】"}],"details": {"status": "completed","exitCode": 0,"durationMs": 28435,"aggregated": "[date] 报告日期: 2026-05-02 (周六)\r\n[dir] K线目录: ./_kline_data\r\n\r\n[fetch] 拉取实时行情 (qt.gtimg.cn 批量)...\r\n 【此处省略n行】","cwd": "C:\\Users\\song\\.qclaw\\workspace"},"isError": false,}}
其他 MD 文件
TOOLS.md
TOOLS.md 文件记录 OpenClaw 在使用工具时的规范和说明。我的理财虾的文件样例如下:
# TOOLS.md - 工具笔记## 行情数据API### 腾讯行情(实时报价)- URL: `https://qt.gtimg.cn/q={secid}`- 沪市secid: `sh{6位代码}`,如 sh600999- 深市secid: `sz{6位代码}`,如 sz300014- 指数: `sh000001`(上证), `sz399001`(深证), `sz399006`(创业板), `sh000300`(沪深300), `sh000688`(科创50)- 用web_fetch获取,PowerShell的curl不兼容## 编码备忘- Windows上用qclaw-text-file的write_file.py写文件,不用内置write- .md文件用utf-8无BOM- .csv给Windows用需要utf-8-sig(有BOM)HEARTBEAT.md该文件中记录了一个静默任务,无需用户主动触发,系统后台定时执行。我自己就设置了一个牛市见顶信号,如下:
HEARTBEAT.md
该文件中记录了一个静默任务,无需用户主动触发,系统后台定时执行。我自己就设置了一个牛市见顶信号,如下:
## 🚨 牛市见顶监控(最高优先级)**用户原话:「牛市结束的信号提醒,这个很重要」**每个交易日收盘后(15:30后)检查以下信号,触发任一条立即推送并标注【🚨 牛市见顶预警】:### 触发条件(满足任一即紧急推送)**1. 全民疯狂信号**- 两市单日成交额突破 **4.5-5万亿**(当前基准2.5-2.7万亿)- 或连续5个交易日日均成交 > 4万亿- → 资金散户化,接盘侠入场
使用 OpenClaw 中存在的问题
-
请求 API 失败,并且下次还犯,自动总结经验教训的能力不足
-
请求数据经常出错,比如要求它请求今天的,它请求到昨天的,换到Deepseek V4-Pro 减轻很多,说明对基模的要求还是很高的
-
自己生成的py文件,如果不指明写入长期记忆,则经常不调用,尽量提醒它要总结经验教训。
最后
整体用了两个月的 OpenClaw,给我的感觉是,虽然目前还不够强大,但是主要问题在于生态和基模不够强,但是很明显:Agent 时代已经全面到来,基模很快就强到足够大多数场景了。
给各位一点建议:全面拥抱Agent。
夜雨聆风