
1. 长对话里 Memory Search 为什么突然“失忆”OpenClaw 的 Memory Search 是一套把历史对话向量化、再按语义相似度召回的记忆检索机制适合长期跑 Agent、跨天聊项目、需要 AI 记住偏好和决策的人。它解决的问题很具体上下文窗口写满后旧消息被压缩成摘要等你三天后再提“上次那个接口怎么配的”没有向量检索的 AI 只能干瞪眼。而向量检索能不能稳定召回取决于 embedding 向量模型配得对不对、检索参数调得顺不顺。我自己的场景是这样的一个跑在本地小主机上的 OpenClaw Agent白天处理代码问答晚上整理笔记一周下来memory/目录攒了十几个日期文件。刚开始用默认配置问它“上周说的那个超时参数是多少”它经常答非所问甚至返回空结果。排查后发现两个坑一是 embedding 服务地址写成了localhost但 Agent 跑在容器里根本连不到宿主机的 Ollama二是maxHistoryShare设得太高历史消息压到 85% 才触发压缩导致检索时向量库里的片段又碎又旧。长对话优化的核心矛盾在于压缩要狠才能腾出 token 空间但压缩太狠原始语义被摘要抹平向量检索就找不到细节。所以配置要分两层看——embedding 模型决定“能不能找到”压缩和检索参数决定“找得准不准”。这篇就按这个思路把 settings 里跟向量模型、检索通道相关的字段逐个拆开给出可复制的配置片段再走一遍验证请求最后把几个高频报错对照着排掉。需要先明确一点Memory Search 的 embedding 请求走的是 OpenAI 兼容格式所以任何提供/v1/embeddings端点的服务都能接。TaoToken 的统一 Key/API 通道正好符合这个格式把baseUrl指过去、apiKey换成 TaoToken 的 Key就能让 embedding 请求和对话请求共用一套凭证省去本地维护多个服务地址的麻烦。下面从环境准备开始。2. TaoToken 前置统一 Key 与 API 通道准备在改 settings 之前先把 TaoToken 这边的凭证和端点确认好。这一步不复杂但顺序别搞反——先拿到 Key再改配置否则 OpenClaw 启动时校验不过会直接报 401。TaoToken 的 API 端点固定为https://taotoken.net/api注意这里不带任何查询参数配置里填的就是这个裸地址。Key 的获取在控制台的 API Keys 页面登录后新建一个复制出来形如sk-开头的一串。这个 Key 同时能用于对话模型和 embedding 模型前提是你选的 embedding 模型在 TaoToken 的模型列表里可用。模型 ID 这块要特别留意。OpenClaw 的memorySearch.model字段填的是模型标识不是随便写个名字就行。如果你打算用云端 embedding常见的选择是text-embedding-3-small这类 OpenAI 兼容模型如果走本地 Ollama就填nomic-embed-text:v1.5。两者的区别在于云端模型不用本机常驻服务但每次检索都要发网络请求本地模型数据不出机器但需要 Ollama 进程一直活着。我建议先把三件套对齐再动手配置项填写内容说明Base URLhttps://taotoken.net/api不带 UTM不带尾部斜杠API Key控制台新建的sk-Key对话和 embedding 共用Model IDtext-embedding-3-small或本地模型名必须与通道支持的模型一致如果你还没建 Key可以直接去 API Keys 页面 新建一个。建好后先别急着写进 OpenClaw用一条 curl 验证通道是否通能省掉后面很多来回。curl https://taotoken.net/api/v1/embeddings \ -H Authorization: Bearer sk-你的Key \ -H Content-Type: application/json \ -d { model: text-embedding-3-small, input: 测试 embedding 通道 }返回里如果能看到data[0].embedding数组说明通道没问题。如果返回 401检查 Key 有没有复制全、有没有多余空格如果返回 404多半是模型 ID 写错了去模型列表核对一下。这一步过了再进 OpenClaw 的 settings 改配置成功率会高很多。另外提一句TaoToken 的 接入文档 里有各语言 SDK 的示例如果你后面想自己写脚本批量重建索引可以参考里面的请求格式。现在先把 OpenClaw 跑通。3. 可复制 settings 配置向量模型与检索参数指向 TaoTokenOpenClaw 的主配置文件在~/.openclaw/openclaw.jsonMemory Search 相关字段挂在agents.defaults.memorySearch下面。下面这份是我实测能跑通的片段你可以直接复制后改 Key 和模型名。{ agents: { defaults: { workspace: /home/tht/.openclaw/workspace, memorySearch: { provider: openai, model: text-embedding-3-small, remote: { apiKey: sk-你的TaoTokenKey, baseUrl: https://taotoken.net/api } }, compaction: { mode: default, reserveTokens: 4096, keepRecentTokens: 2000, maxHistoryShare: 0.7, notifyUser: true, identifierPolicy: strict, memoryFlush: { enabled: true } }, sessionMaintenance: { mode: enforce, pruneAfter: 30d, maxEntries: 500 }, sessionReset: { mode: daily, atHour: 4 }, sessionIsolation: { dmScope: per-channel-peer } } } }逐字段说一下为什么这么填。provider固定openai因为 TaoToken 走的是 OpenAI 兼容协议这个值决定 OpenClaw 用哪种请求体格式。model填text-embedding-3-small这是通道支持的 embedding 模型换成text-embedding-3-large也可以但向量维度更高、检索更慢长对话场景下 small 够用。remote.apiKey就是上一步拿到的 TaoToken Keyremote.baseUrl填https://taotoken.net/api注意不要写成https://taotoken.net/api/v1OpenClaw 内部会自己拼/v1/embeddings多写一层会变成/v1/v1/embeddings直接 404。压缩参数里maxHistoryShare: 0.7是关键。它表示历史消息占到上下文窗口 70% 时触发压缩。设太低比如 0.5会导致频繁压缩向量库里全是摘要碎片设太高比如 0.9则压缩前检索窗口已经很挤召回质量下降。0.7 是我试下来比较平衡的值。memoryFlush.enabled: true一定要开它保证压缩前把原始对话写进memory/目录万一检索不到还能翻原始文件。如果你更想用本地 Ollama 跑 embedding把memorySearch换成下面这段{ memorySearch: { provider: openai, model: nomic-embed-text:v1.5, remote: { apiKey: ollama, baseUrl: http://192.168.1.20:11434/v1 } } }这里apiKey填ollama是占位Ollama 不校验真实 Key。baseUrl要填 Ollama 所在机器的实际 IP别写localhost——如果你的 OpenClaw 跑在 Docker 或另一台机器上localhost指向的是容器自己连不到宿主机。这个坑我踩过报错是connection refused排查了半天才发现是地址问题。改完配置后重启 Gatewayopenclaw gateway restart openclaw gateway statusstatus显示 running 之后用openclaw config get agents.defaults.memorySearch确认配置项已加载。如果这里读出来还是旧值说明配置文件路径不对检查一下是不是改到了别的 agent 的配置。4. 验证请求与成功结果Memory Search 检索实测配置加载只是第一步真正要验证的是检索能不能召回。OpenClaw 提供了memory_search命令可以直接在会话里调用也可以走 CLI。先造点历史数据。在会话里发几条带明确关键词的消息比如“我的项目超时参数设成 30 秒”“数据库连接池大小是 20”然后等压缩触发或手动执行/compact让这些内容进入memory/目录。接着用检索命令查memory_search 超时参数成功的话会返回类似这样的结构{ results: [ { content: 我的项目超时参数设成 30 秒, score: 0.87, source: memory/2026-04-18.md } ] }score是余弦相似度0.8 以上说明召回质量不错。如果返回空数组先别怀疑配置按下面顺序查embedding 通道是否通、memory/目录有没有文件、检索关键词是不是太偏。也可以直接测 embedding 端点确认 OpenClaw 发出的请求能到达 TaoTokencurl https://taotoken.net/api/v1/embeddings \ -H Authorization: Bearer sk-你的TaoTokenKey \ -H Content-Type: application/json \ -d { model: text-embedding-3-small, input: OpenClaw Memory Search 验证 }返回data[0].embedding长度 1536small 模型的维度就说明通道和模型都对。这一步和 OpenClaw 内部调用走的是同一个端点能通就代表配置没问题。再验证一下长对话场景。连续发十几条消息把上下文撑到 70% 以上观察日志里有没有压缩记录tail -f /tmp/openclaw/openclaw-$(date %Y-%m-%d).log | grep -i compact\|memory看到compaction triggered和memory flush completed就说明压缩和落盘都正常。压缩完再执行一次memory_search如果还能召回压缩前的内容说明向量索引没丢。这一步是长对话优化的关键验证点——很多人配置完只测了短对话一上长对话就发现召回失效问题往往出在压缩时没落盘或索引没重建。如果换了 embedding 模型记得清空旧向量重新索引否则新旧向量维度不一致会直接报错。清空方式一般是删掉向量存储目录具体路径看你的 workspace 配置通常在~/.openclaw/workspace/下面。5. 本篇常见错排查401、local proxy failed 与空结果配置过程中最容易撞上的几个报错我按实际遇到的频率排一下每个都给对照的排查路径。401 Unauthorized。这个最直接Key 不对或没带上。检查remote.apiKey是不是完整的sk-串有没有被 JSON 转义弄丢字符。还有一种情况是 Key 复制时带了尾部空格肉眼看不出来用openclaw config get agents.defaults.memorySearch.remote.apiKey | cat -A看一下行尾有没有$之外的符号。如果是 TaoToken 的 Key确认它在控制台里是启用状态没被禁用或删除。local proxy failed / connection refused。这个报错基本都出在baseUrl上。如果你填的是http://localhost:11434/v1但 OpenClaw 跑在容器里容器内的 localhost 不是宿主机。解决办法是把localhost换成宿主机在容器网络里的 IP或者用host.docker.internalmacOS/Windows 的 Docker Desktop 支持。如果是远程 Ollama确认防火墙放行了 11434 端口用telnet 192.168.1.20 11434测一下连通性。reading choices 相关报错。这个通常出现在响应体解析阶段说明请求发出去了但返回格式不对。常见原因是baseUrl多写了/v1导致实际请求打到https://taotoken.net/api/v1/v1/embeddings服务端返回 404 页面而不是 JSONOpenClaw 解析choices字段时就炸了。把baseUrl改回https://taotoken.net/api即可。另一个可能是模型 ID 写错服务端返回错误对象同样解析失败。OAuth 相关报错。如果你之前配过需要 OAuth 的通道残留的 token 刷新逻辑可能干扰 embedding 请求。检查配置文件里有没有旧的oauth字段有的话删掉。OpenClaw 的 embedding 走的是静态 Key不需要 OAuth 流程。检索返回空结果但通道正常。按这个顺序查memory/目录下有没有.md文件没有的话说明压缩没触发或memoryFlush没开有文件但检索不到检查关键词是不是跟原文差太远embedding 是语义匹配不是关键词匹配但太偏的表述也会掉分换了模型没重建索引旧向量维度对不上检索直接跳过。CC Switch / Cline MCP / Codex auth.json 场景。如果你是在这些工具里配 OpenClaw 的 embedding 通道三件套要写全Base URL 填https://taotoken.net/apiKey 填 TaoToken 的sk-串Model ID 填text-embedding-3-small。少任何一个都会在启动时报配置不完整。Codex 的auth.json里对应字段是api_base和api_key别填错键名。排障时养成看日志的习惯/tmp/openclaw/openclaw-日期.log里会打印完整的请求 URL 和响应状态码比猜快得多。6. 语义一致 CTA把通道固定下来再调参数配置跑通之后建议先把 embedding 通道固定成 TaoToken 这一套再去微调maxHistoryShare和pruneAfter。原因是通道一变向量空间就变了之前调好的检索阈值全部作废。我自己的做法是先用text-embedding-3-small跑一周观察日志里的召回 score 分布如果普遍在 0.75 以下再把maxHistoryShare从 0.7 降到 0.65让压缩更早触发、保留更多完整片段。如果你后面要长期跑编码类 Agent或者想让 Memory Search 跟对话模型共用一套配额可以看下 Coding Plan把 embedding 和对话请求都归到同一个通道下管理。想先单独验证模型召回效果用 模型对话 页面发几条测试消息确认通道稳定后再写进 OpenClaw 配置。最后留一个实用习惯每次改完memorySearch相关字段先跑一遍memory_search 最近一次配置变更能召回就说明索引没坏。这个动作花不了十秒但能帮你避开“改了配置忘了重建索引”这个最常见的坑。