1. 为什么 Agent 的记忆系统值得单独拆开看
AI Agent 的记忆系统,说白了就是解决一个很朴素的问题:大模型本身没有状态,每次调用都从零开始。你昨天告诉它的偏好、上周踩过的坑、项目里那条不能碰的约定,它默认全都不记得。所以任何能长期干活的 Agent,都得在模型外面自己搭一套记忆机制。
这套机制要回答四件事:存什么、存在哪、怎么取、怎么管。OpenClaw、Claude Code、Hermes Agent 这三个框架,恰好给出了三种完全不同的答案。OpenClaw 把文件系统当唯一真理来源,Claude Code 把 Token 预算当稀缺资源来调度,Hermes 则把记忆按访问模式切成四层,情景记忆是它的核心差异点。
这篇不聊空泛的架构哲学,直接落到能跑起来的配置上。我会先讲清楚三者的记忆骨架差异,然后给出各自的配置文件片段(settings.json、config.toml 这类),最后用 TaoToken 做统一 Key 和 API 通道,把三个 Agent 的模型调用都接进来,并给出记忆读写的验证动作。适合已经在折腾 Agent、想让记忆系统可复现、而不是每次重装都靠记忆重建的开发者。
2. 三类 Agent 记忆架构的骨架差异
2.1 OpenClaw:文件即记忆,两层结构
OpenClaw 的核心约束是一句话:没有写进文件的,不存在。它的长期状态全部落在磁盘的 Markdown 文件里,目录结构大致是这样:
~/.openclaw/workspace/ ├── MEMORY.md # 长期记忆(精华,每次会话加载) ├── SOUL.md # Agent 身份定义 └── memory/ ├── 2026-04-12.md # 当日日志(短期,追加写入) ├── 2026-04-11.md └── ...短期层是memory/YYYY-MM-DD.md,当天的工作日志,追加写入不做整理,今天和昨天的自动注入上下文。长期层是MEMORY.md,从日志里沉淀出来的稳定事实和用户偏好,每次会话都在场。这个两层设计解决的是「想记住很多」和「上下文放不下很多」之间的矛盾。
检索上 OpenClaw 用混合搜索:语义搜索加 BM25 关键词搜索并行跑,结果合并取最相关片段。向量索引存在 SQLite 里(走 sqlite-vec 扩展),不额外起向量数据库,部署简单。
它最容易被忽略、也最容易出问题的环节是 Context Compaction。长会话撑爆窗口时要压缩历史,但只存在于对话历史里的约定会在压缩中消失。OpenClaw 的解法是 Memory Flush:压缩触发前先跑一个静默轮次,提示模型把当前上下文里的重要信息写进磁盘,然后再压缩。文件里的内容压缩不碰,只有对话历史会被压。
2.2 Claude Code:上下文工程优先,路径编码相关性
Claude Code 不把自己当存储系统,而是一套 Token 预算分配和信息注入机制。它的判断是:上下文窗口的容量不等于可用容量,模型对头尾注意力强、中间弱,所以关键不是存更多,而是在正确时机注入正确信息。
它的分层文件体系用路径来编码相关性:
~/.claude/CLAUDE.md # 用户级:所有项目都加载 ~/project/CLAUDE.md # 项目级:进入项目加载 ~/project/src/CLAUDE.md # 目录级:进入该目录加载不需要写检索算法,当前工作目录在哪,文件系统路径本身就决定加载哪些规则。代价是只能做静态的「这个目录用什么规则」,做不了动态的「这个任务需要什么知识」。另外 Claude Code 对 Token 消耗有三档预警(70% 提示、85% 再提示、90% 自动压缩),并且把 Token 使用量注入 Agent 自身上下文,让它能感知剩余预算来规划任务。
2.3 Hermes Agent:四层分离,情景记忆是核心
Hermes 的思路是:不同访问模式的记忆,必须在不同介质里用不同方式管理。它把记忆严格切成四层。
第一层热记忆,始终注入、零延迟:
~/.hermes/memories/ ├── MEMORY.md # 环境事实,上限约 800 token └── USER.md # 用户偏好,上限约 500 token上限设得小是刻意的,强制你做信息质量控制,同时对 Prefix Cache 友好。第二层历史归档放在~/.hermes/state.db,SQLite 加 FTS5 全文索引,由 Agent 主动调用session_search检索,不自动注入。第三层是情景记忆,也就是 Skills 系统:
~/.hermes/skills/ ├── research-workflow.md # 某类任务的最优执行路径 ├── image-generation.md # 图片生成任务的经验积累 └──>export TAOTOKEN_API_KEY="sk-你的key" export TAOTOKEN_BASE_URL="https://taotoken.net/api"注意:Key 只放环境变量或本地配置文件,不要提交进 Git。三个 Agent 的配置里都引用同一个变量,换 Key 时只改一处。
4. 可复制配置:三个 Agent 的骨架片段
4.1 OpenClaw 的 config.toml
OpenClaw 的模型通道和记忆目录分开配。下面这段把模型指向 TaoToken,同时固定 workspace 路径,保证记忆文件位置可复现:
# ~/.openclaw/config.toml [model] provider = "openai-compatible" base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" model = "claude-sonnet-4" max_tokens = 8192 [memory] workspace = "~/.openclaw/workspace" short_term_dir = "memory" long_term_file = "MEMORY.md" auto_inject_days = 2 # 今天和昨天日志自动注入 hybrid_search = true # 语义 + BM25 混合检索 vector_store = "sqlite" # 向量索引落 SQLite [compaction] threshold = 0.85 # 达到 85% 触发 memory_flush = true # 压缩前先静默写盘memory_flush = true是重点,别关。它保证压缩前重要信息先落文件,避免「对话里说好的规则被压没了」这个经典 bug。
4.2 Claude Code 的 settings.json
Claude Code 走环境变量注入通道,settings.json 里配权限和记忆文件层级:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "${TAOTOKEN_API_KEY}" }, "memory": { "userFile": "~/.claude/CLAUDE.md", "projectFile": "CLAUDE.md", "directoryFiles": true }, "context": { "tokenWarnThresholds": [0.7, 0.85, 0.9], "injectTokenUsage": true } }injectTokenUsage打开后,Agent 能感知自己还剩多少预算,规划任务时会更保守,不会一口气读十个大文件然后卡在压缩点。
4.3 Hermes Agent 的 config.toml
Hermes 四层记忆要分别指定路径和上限:
# ~/.hermes/config.toml [model] base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" model = "claude-sonnet-4" [memory.hot] memory_file = "~/.hermes/memories/MEMORY.md" user_file = "~/.hermes/memories/USER.md" memory_token_limit = 800 user_token_limit = 500 [memory.archive] db_path = "~/.hermes/state.db" index = "fts5" auto_inject = false # 历史归档不自动注入,靠主动检索 [memory.skills] dir = "~/.hermes/skills" progressive_disclosure = true # 先加载名称描述,相关才加载全文 auto_update = true # Skill 使用中自我更新auto_inject = false和progressive_disclosure = true是 Hermes 省 Token 的关键,别为了「记得全」把它们改成 true,否则系统提示会随使用时间无限膨胀。
5. 验证请求与记忆读写动作
配置写完,先验证模型通道通不通,再验证记忆读写。
5.1 验证 TaoToken 通道
用 curl 打一次对话接口,确认 Key 和 base_url 生效:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4", "messages": [{"role": "user", "content": "只回复两个字:通了"}] }'返回里能看到choices[0].message.content是「通了」,说明通道没问题。如果报 401,检查 Key 有没有带Bearer前缀;报 404,检查 base_url 是不是多了或少了/v1。
5.2 验证 OpenClaw 记忆写入
启动 OpenClaw 后,在对话里让它记一条明确的事实,然后直接看文件:
# 对话里说:记住,本项目部署分支是 release-2.3 cat ~/.openclaw/workspace/memory/$(date +%F).md当日日志里应该出现这条记录。再触发一次压缩(或手动跑 flush),确认MEMORY.md里也沉淀了这条。如果只在日志里、没进长期记忆,说明提炼环节没跑,检查 Dreaming 是否开启或手动补写。
5.3 验证 Claude Code 分层加载
在项目根目录建CLAUDE.md写一条规则,进子目录建另一个,然后启动会话问它当前目录适用哪条规则。它应该只加载当前路径链上的文件。验证 Token 预警是否生效,可以在长会话里观察 70% 和 85% 的提示是否出现。
5.4 验证 Hermes 的 Skills 检索
让 Hermes 完成一个多步任务(五次以上工具调用),然后看 skills 目录:
ls -la ~/.hermes/skills/如果生成了新的 Markdown 文件,说明情景记忆写入成功。再开一个新会话,问它「上次那个任务是怎么做的」,观察它是否主动调用session_search或加载对应 Skill。这一步能验证「主动检索」而不是「自动注入」的设计是否按预期工作。
6. 本篇常见错排查
Key 配了但三个 Agent 只有一个能通。大概率是环境变量没导出到当前 shell。export只对当前会话有效,写进~/.bashrc或~/.zshrc后记得source一次。三个 Agent 如果跑在不同用户下,各自都要配。
OpenClaw 记忆文件不生成。先确认workspace路径存在且可写,路径里的~有些版本不展开,建议写绝对路径。再看memory_flush是否被关掉,关掉后压缩前不写盘,长会话里记忆会丢。
Claude Code 加载了不该加载的 CLAUDE.md。检查当前工作目录,路径层级是 O(1) 查找,你在哪个目录启动就加载哪条链。跨项目复用时别把用户级~/.claude/CLAUDE.md写得太具体,否则所有项目都被污染。
Hermes 系统提示越来越长。多半是把auto_inject改成了 true,或者热记忆上限调太大。热记忆上限小是特性不是 bug,它逼你做信息取舍。历史归档就该靠主动检索,别图省事全塞进去。
检索搜不到想要的内容。OpenClaw 的混合搜索如果只命中语义、没命中关键词,检查 BM25 是否开启。Hermes 的 FTS5 语义理解弱,搜「auth service」找不到「身份验证微服务」是已知权衡,需要语义能力就上向量扩展。
压缩后 Agent 行为变了。这是记忆系统最隐蔽的坑。确认 Memory Flush 在压缩前真的跑了,日志里应该有静默轮次的记录。如果没跑,重要约定只存在于对话历史,压缩即消失。
排障和接入相关的问题,优先查接入文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 和 API Keys 页面 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。想先验证模型通道是否正常,可以直接用模型对话 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 跑一轮。如果你是要长期跑编码类 Agent、反复调记忆和上下文,Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 会更省心,配合 Claude Code 的 Anthropic 兼容通道 https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecode&utm_campaign=rewrite 直接接上就行。
最后说个我自己的习惯:三个 Agent 的记忆目录我都用 Git 管起来,MEMORY.md、CLAUDE.md、skills/全部纳入版本控制。这样每次记忆被改、被压缩、被 Skill 自我更新,都能 diff 出来。记忆系统出问题时,git log比任何日志都好用——你能看到 Agent 到底在哪一步把哪条记忆弄丢了。