Agent 说“记得”,不代表它把信息永久保存了。一次回答可能只依赖当前会话;开启新会话后,旧对话不一定还在模型眼前。想让重要内容以后还能用,需要先区分正在处理的上下文、保存下来的笔记,以及能否检索到笔记。
这篇用 OpenClaw 和本机 Qwen3.8-27B 做了一个虚构门店练习:同一个会话能复述临时标记;新 session 在没有调用检索工具时不会自动知道它。本机关键词索引和 Gateway 下的 memory_search 都找到了工作区笔记,并返回文件来源。嵌入式 --local 模式的一次 memory_search 探针没有命中;因此下面会说明两种运行路径的差别。
三种东西别混为一谈
| 层 | 放什么 | 何时能用 | 主要限制 |
|---|---|---|---|
| 当前会话上下文 | 正在讨论的问题、临时数字、过程信息 | 当前 session 的后续轮次 | 受模型上下文窗口约束;开新 session 后不应假定旧消息可见 |
| 历史记录与压缩摘要 | 已保存的对话记录,以及 OpenClaw 压缩较早对话后留下的摘要 | 后续轮次会看到保留的近期消息和摘要 | 摘要会省略细节;历史文件存在,不等于每一轮都完整读入 |
| 工作区记忆 | 稳定偏好、长期决定、每日记录、可检索资料 | 启动时加载少量文件,或通过 memory_search / memory_get 按需读取 |
文件写对了也不保证检索命中;检索还受索引和关键词影响 |
OpenClaw 的上下文窗口是模型本轮可处理信息的上限。会话变长后,系统可将较早的轮次压缩成摘要并保留近期内容;压缩不是把旧消息原样塞回新上下文。官方压缩说明
工作区里几种文件也各有用途:USER.md 可记录稳定的用户偏好;MEMORY.md 是经过整理的长期事实和决定;memory/ 下的记录适合放当天观察、项目过程和较详细的背景。日常记录可以被索引并通过 memory_search 检索,但不应把每篇历史笔记都塞进每轮提示词。OpenClaw 记忆概览
按“以后要怎么用”来放
- 只对当前问题有用的内容:留在当前对话,例如正在比较的两个方案、临时变量和推理过程。
- 今天还要接着做、以后未必复用的过程:记到
memory/YYYY-MM-DD.md,同时写清任务、结果和待办。 - 之后很多会话都会影响决策的事实:压缩成简短条目放进
MEMORY.md,写来源、确认日期和适用范围。 - 有时效或审批边界的决定:写清何时生效、何时过期、谁确认、过期后该怎么办。记忆只能帮助 Agent 找到规则,不会代替权限设置或人工审批。
例如,不要只写“可以改库存”。应写明:“店长于 2026-10-11 确认:盘点差异先记录 SKU 和数量,再由店长复核;没有复核前不得直接改库存。此规则仅适用于青禾小店练习资料。” 这样换 session 后,Agent 才有机会拿到规则的来源与边界,而不是只剩一句容易误用的结论。
用一条虚构规则看检索
练习包中的 workspace/memory/shop-operations.md 写着:“青禾小店的库存盘点须在 18:40 前提交。”这是测试资料,不代表真实门店制度。
本次为 OpenClaw 创建单独的 s160 profile,工作区只放这条虚构规则。选本机 Qwen3.8-27B,是因为这篇要验证 OpenClaw 的会话延续和 memory_search 工具调用;它通过 Ollama 在本机运行,没有做模型排名。记忆搜索 provider 设为 none,因此只测试关键词检索,不触发 OpenAI 或其他远端嵌入服务。索引状态为 2 个文件、12 个片段;全文检索可用,向量索引未启用。
随后分三步检查:
- 同一 session:先让模型只在当前对话记住随机标记
birch-602,再用相同 session ID 提问。它回答了birch-602。 - 新 session:改用新的 session ID,在不调用
memory_search的情况下问上一个 session 的标记。模型回答“当前会话没有这条信息”,没有猜值。这只说明新 session 没有自动收到标记;不代表启用 session 检索后也搜不到它。 - 工作区笔记:CLI 用精确数字
18:40搜索时,命中memory/shop-operations.md;只搜“盘点”没有命中。在嵌入式--localAgent 探针里,两个查询都没找回笔记;随后改用隔离 Gateway(loopback、临时 token),新 session 中的memory_search命中规则,Qwen 回答“18:40 前提交”,并列出memory/shop-operations.md第 1–7 行。
这个结果把“索引能搜到”和“模型会不会用工具搜”分开了。纯关键词模式下,短词或混合多个概念的长句可能落空;嵌入式 --local 与 Gateway 路径也要分别验证。本次最终成功的 Gateway 检索调用共用了 3 次工具(发现工具、memory_search、返回结果);没有向量嵌入,所以不能据此评价语义检索效果。最后一次 memory status 还显示 memory 和 sessions 两种来源,包含 2 个记忆文件、5 个会话记录;因此临时标记可能在 transcript 索引里,本文没有把“新 session 不知道”扩大成“跨 session 永远搜不到”。先用 CLI 检查索引和命中内容,再在实际运行路径里验证 Agent 工具能否找到来源;不要把“没有搜到”误写成“笔记不存在”。
复做步骤
先完成OpenClaw 本地接入 Ollama,准备一个全新的独立 profile 和练习工作区。在练习包解压目录运行下面的命令;不要在含有真实客户资料的工作区里做这个探针,也不要复用现有 profile 名称。
将练习包中的 workspace/memory/shop-operations.md 放进新 profile 的工作区,然后执行:
# 给新 profile 建一个单独工作区;不要覆盖你已有的 profile
openclaw --profile s160-memory-demo setup --baseline \
--workspace "$HOME/openclaw-memory-demo"
openclaw --profile s160-memory-demo config set gateway.port 19083
openclaw --profile s160-memory-demo config set gateway.bind loopback
OLLAMA_API_KEY=ollama-local openclaw --profile s160-memory-demo models list --refresh
OLLAMA_API_KEY=ollama-local openclaw --profile s160-memory-demo config set \
agents.defaults.model ollama/qwen3.8-27b:latest
mkdir -p "$HOME/openclaw-memory-demo/memory"
cp workspace/memory/shop-operations.md "$HOME/openclaw-memory-demo/memory/"
# 纯本地关键词索引;不要为本次练习配置远端 embedding
openclaw --profile s160-memory-demo config set memory.search.provider none
openclaw --profile s160-memory-demo memory index --force --agent main
openclaw --profile s160-memory-demo memory search --agent main --min-score 0 '18:40'
如果 memory search 没有命中,先核对工作区路径、文件是否在 memory/ 下、索引状态及输出的片段,再调整检索词。OpenClaw 的 CLI 文档说明,memory index 等离线命令需要对应 profile 的 Gateway 停止;不要为了运行它而停止其他 profile 正在使用的服务。openclaw memory CLI 说明
完成索引后,在终端 A 启动仅监听本机回环地址的测试 Gateway。local-test-token 只是本次练习的临时令牌;不要复用真实 Gateway token:
OPENCLAW_GATEWAY_TOKEN=local-test-token OLLAMA_API_KEY=ollama-local \
openclaw --profile s160-memory-demo gateway run --port 19083 \
--bind loopback --auth token
终端 B 用新的 session 检查长期笔记是否能经 Agent 工具找到:
OPENCLAW_GATEWAY_TOKEN=local-test-token OLLAMA_API_KEY=ollama-local \
openclaw --profile s160-memory-demo agent --json \
--model ollama/qwen3.8-27b:latest --thinking off \
--session-id memory-demo --message \
'请用 memory_search 搜索“青禾小店的盘点规则”,回答截止时间并列出来源。'
要比较会话上下文,也在同一 profile 的 Gateway 上用同一个 session ID 发两次消息,再换一个 ID 重问:
OPENCLAW_GATEWAY_TOKEN=local-test-token OLLAMA_API_KEY=ollama-local openclaw --profile s160-memory-demo agent \
--json --model ollama/qwen3.8-27b:latest --thinking off \
--session-id context-demo --message '仅在当前会话记住标记 birch-602,不要写文件。只回复已记住。'
OPENCLAW_GATEWAY_TOKEN=local-test-token OLLAMA_API_KEY=ollama-local openclaw --profile s160-memory-demo agent \
--json --model ollama/qwen3.8-27b:latest --thinking off \
--session-id context-demo --message '刚才的标记是什么?只答标记。'
OPENCLAW_GATEWAY_TOKEN=local-test-token OLLAMA_API_KEY=ollama-local openclaw --profile s160-memory-demo agent \
--json --model ollama/qwen3.8-27b:latest --thinking off \
--session-id fresh-demo --message '上个会话里的标记是什么?不知道就说当前会话没有这条信息,不要猜。'
这里的 OLLAMA_API_KEY=ollama-local 是本地 Ollama provider 的占位值,不是账号密钥;按 OpenClaw 的 Ollama 配置说明,本机服务不校验这个值。实际使用前先用 ollama list 确认模型已安装。Ollama 接入说明
输入 token 也属于成本
在这台机器上,Qwen3.8-27B 的第一次短提示报告 11,951 个输入 token、3 个输出 token,用时 111.7 秒;同一 session 的第二轮新增输入为 51 token、输出 7 token,并复用了约 11,953 个缓存 token,用时 2.6 秒。新 session 的探针报告 511 个输入、6 个输出 token,用时 6.0 秒。Gateway 下的记忆检索问答报告 14,291 个输入、220 个输出 token,并复用了 25,366 个缓存 token,用时 141 秒;整次调用共 39,877 tokens(含缓存量)。耗时会受模型是否已加载、系统负载和上下文长度影响。
OpenClaw 为本次本地模型调用报告的 API 费用是 0;这不表示计算没有成本,模型仍占用内存、设备时间和电力。长期把大量内容塞进 MEMORY.md 会增加每轮启动时注入的输入;把过程放在可检索的笔记里、只保留短摘要,有助于控制提示词体积。上下文接近上限时,压缩和可选的记忆整理也会产生额外模型调用。Token 用量说明 · 压缩前记忆整理
这不是 Qwen3.8-27B 的普遍记忆能力评测,也没有压到上下文上限、触发自动压缩或比较向量嵌入模型。当前结果只说明:同 session 与新 session 的信息边界可在这组探针里观察;纯关键词 CLI 和本次隔离 Gateway 都能找到笔记,但嵌入式 --local 探针表现不同。实际部署应在将要使用的运行路径里验证检索,并给长期事实加来源和边界。
练习材料与相关教程
下载Agent 记忆练习包,其中有虚构门店笔记、测试提示和本次结果摘要。
继续阅读:Agent 是什么?和聊天机器人有什么区别 · OpenClaw Agent 怎么用得稳? · 工具调用原理和常见失败 · RAG 知识库为什么答非所问