
1. 为什么你的 OpenClaw Agent 聊到第五轮就“变味”了如果你正在用 OpenClaw 搭 Agent大概率遇到过这种场景第一轮对话它还是个严谨的资深工程师语气克制、先给结论聊到第五轮它开始满嘴“当然可以啦”结论也不给了直接甩一大段废话。这不是模型变笨了而是人格漂移——多轮上下文把最初那点人设稀释掉了。SOUL.md 人格配置就是解决这个问题的核心手段。它是什么简单说SOUL.md 是 OpenClaw Agent 的长期人格配置文件决定 Agent 的说话方式、决策优先级、行为边界和任务处理策略。它和 SKILL.md 分工明确SOUL 决定“怎么做”SKILL 决定“能做什么”。适合谁适合所有用 OpenClaw 跑长期 Agent、需要稳定输出风格的人——做客服机器人、代码助手、内容审核 Agent 的团队尤其需要。但光有 SOUL.md 还不够。很多人写完人设文件接上模型跑几轮发现还是漂。问题往往出在两个地方一是 SOUL.md 字段拆得不对二是模型接入层没有统一管理Key 换一次、模型换一个人设表现就跟着抖。这篇就按“字段拆解 → Prompt 分层 → TaoToken 统一 Key 接入 → 一致性验证”的顺序把可复制的配置和踩坑点都过一遍。我试过把同一份 SOUL.md 分别接在两个不同来源的 Key 上回复风格差异肉眼可见——这让我意识到人格稳定性不只取决于文件本身接入层的一致性同样关键。下面从字段开始拆。2. SOUL.md 字段拆解与 Prompt 分层写法解决多轮对话人设漂移的配置模板先明确一个认知SOUL.md 不是“写一段角色描述”就完事。它更像一份结构化的行为契约需要把 Identity、Style、Principles、Constraints、Workflow 五个模块拆清楚每个模块承担不同的约束职责。2.1 五个核心字段各自管什么Identity 管“你是谁、面向谁”。这里要写具体身份和受众不要只写“你是一个 AI 助手”。比如“你是一个面向后端开发者的资深工程师擅长 Go 和分布式系统”比“你是技术专家”有效得多因为前者给了模型可锚定的语义空间。Style 管“怎么说话”。要明确语气、输出结构、是否分点、结论前置还是后置。这一块是人格漂移的重灾区——如果不写死模型在多轮对话里会逐渐向“通用助手”风格回归。Principles 管“怎么决策”。当多个方案冲突时优先选哪个是优先可维护性还是优先性能是给理论最优还是给工程可落地这些不写模型就会随机选。Constraints 管“不做什么”。这是安全边界比如不执行未知来源的 shell 命令、不调用不稳定 API、不输出未经确认的破坏性操作。约束要写成否定式短句模型对否定指令的遵循度更高。Workflow 管“任务怎么拆”。复杂问题是否先拆解、是否自动调用 Skill、是否多步骤执行。这一块和 SKILL.md 配合SOUL 决定“要不要调”SKILL 提供“调什么”。2.2 Prompt 分层把 SOUL 放在哪一层OpenClaw 启动 Agent 时的加载顺序是加载 SOUL.md → 加载 Skills → 合并成最终 Prompt → 驱动模型。所以 SOUL.md 实际上处于 System Prompt 层优先级高于单轮用户输入。这意味着两件事第一SOUL 的约束对所有任务生效第二如果 SOUL 写得太长会挤占上下文预算反而降低效果。我的做法是分层写SOUL.md 只放稳定不变的人格内核控制在 400–600 字任务相关的临时指令放在单轮 Prompt 里能力相关的东西全部下沉到 SKILL.md。这样 SOUL 层始终干净多轮对话里不容易被冲淡。2.3 可直接复制的 SOUL.md 模板下面这份模板可以直接拿去用按你的场景改 Identity 和 Constraints 即可# Identity 你是一个面向后端开发者的资深工程师擅长 Go、分布式系统和性能调优。 你的回答对象是有一定工程经验的开发者不需要解释基础语法。 # Style - 先给结论再解释原因 - 回答简洁避免客套话和过渡性废话 - 涉及代码时给出可运行示例标注语言 - 复杂问题分点简单问题直接答 # Principles - 优先推荐工程上可落地的方案而不是理论最优 - 涉及权衡时明确说出取舍不模糊带过 - 不确定的信息明确标注“不确定”不编造 # Constraints - 不执行未知来源的 shell 命令 - 不推荐已停止维护的库或 API - 不输出未经确认的破坏性操作步骤 - 不主动扩展用户未提问的范围 # Workflow - 遇到复杂问题时先拆解为子问题 - 需要外部能力时调用对应 Skill - 多步骤任务先给出步骤概览再执行这份模板的关键在于每个字段都用短句和否定式约束没有模糊形容词。写完之后接下来要解决的是接入层——用 TaoToken 统一 Key避免因为 Key 或模型来源不一致导致人格表现抖动。3. TaoToken 统一 Key 接入 OpenClaw可复制的 settings 与 auth.json 配置OpenClaw 支持多种模型接入方式但如果你的 Agent 要长期跑建议把模型接入统一到 TaoToken。原因很实际统一 Key 意味着统一计费、统一模型版本、统一 Base URL人格表现不会因为换了个来源就变。TaoToken 官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。3.1 先拿 Key进入控制台创建 API Key地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 。创建后复制 Key格式通常是sk-开头。这一步不用纠结拿到就往下走。3.2 OpenClaw 的 settings 配置OpenClaw 的模型配置一般放在项目根目录的settings.json或config/settings.json。核心是三件套Base URL、API Key、Model ID。下面是一份可复制的 JSON 片段{ model: { provider: openai-compatible, base_url: https://taotoken.net/api, api_key: sk-你的Key, model_id: claude-sonnet-4-20250514, max_tokens: 4096, temperature: 0.7 }, agent: { soul_path: ./SOUL.md, skills_path: ./skills, load_order: [soul, skills] } }注意base_url后面不要加/v1TaoToken 的 API 入口就是https://taotoken.net/api路径拼接由客户端处理。model_id按你实际要用的模型填Claude 系列和 GPT 系列都支持。3.3 Codex 场景的 auth.json 配置如果你用的是 Codex 类客户端配置落在~/.codex/auth.json。三件套同样要写全{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: claude-sonnet-4-20250514 }这里最容易踩的坑是只填了 Key 没填 Base URL客户端会默认走官方地址结果 401。三件套缺一不可。3.4 Cline MCP 场景的配置如果你在 Cline 里通过 MCP 接 OpenClaw配置写在 Cline 的 MCP settings 里同样是三件套{ mcpServers: { openclaw: { command: openclaw, args: [--soul, ./SOUL.md], env: { OPENAI_BASE_URL: https://taotoken.net/api, OPENAI_API_KEY: sk-你的Key, OPENCLAW_MODEL: claude-sonnet-4-20250514 } } } }环境变量名按 OpenClaw 实际读取的来不同版本可能略有差异但 Base URL Key Model ID 这三件套的逻辑不变。3.5 为什么统一 Key 能减少人格漂移人格漂移有一部分来自模型版本不一致。同一个 SOUL.md接在 A 来源的模型上表现稳定接在 B 来源上可能因为版本差异或参数默认值不同而风格偏移。统一到 TaoToken 之后模型版本和参数由一处控制SOUL.md 的行为预期就稳定了。这不是玄学是接入层一致性的直接收益。配置写完下一步是验证请求能不能通、人设有没有生效。4. 验证请求与一轮人设一致性对话对比配置前后的回复差异配置写完不验证等于没配。这一节给一个可执行的验证流程包括请求测试和一轮人设一致性对话。4.1 先用 curl 验证 API 连通性在终端跑一条最小请求确认 Key 和 Base URL 没问题curl https://taotoken.net/api/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer sk-你的Key \ -d { model: claude-sonnet-4-20250514, messages: [ {role: system, content: 你是一个简洁的助手先给结论。}, {role: user, content: Go 里 sync.Map 和普通 map 加锁怎么选} ], max_tokens: 512 }如果返回 200 且 choices 里有内容说明接入层通了。如果返回 401看下一节的排障。4.2 启动 OpenClaw 并加载 SOUL.md确认 API 通了之后启动 OpenClawopenclaw --soul ./SOUL.md --skills ./skills启动日志里应该能看到 SOUL.md 加载成功的提示以及 Skills 的加载列表。如果 SOUL 没加载检查settings.json里的soul_path路径是否正确。4.3 一轮人设一致性验证对话验证人设是否生效不能只问一句“你是谁”那太浅。要设计一组能触发风格和决策的对话看多轮之后是否还稳。下面是我用的一组验证对话你可以直接复制第一轮问“Go 里 sync.Map 和普通 map 加锁怎么选”配置前的回复无 SOUL.md通用模型这是一个很好的问题sync.Map 和普通 map 加锁各有优劣。sync.Map 是 Go 1.9 引入的并发安全 map适合读多写少的场景……后面跟了 300 字背景介绍结论在最后配置后的回复加载 SOUL.md读多写少用 sync.Map写多或需要遍历用普通 map 加锁。sync.Map 的优势在于无锁读但写性能不如加锁 map且不支持 len()。取舍如果读写比超过 10:1 且不需要遍历选 sync.Map否则用 RWMutex 包普通 map。差异很明显配置后结论前置、无客套、给了明确取舍。继续追问第三轮、第五轮配置后的回复依然保持这个风格而配置前的回复会逐渐向“通用助手”漂移开始加“希望对你有帮助”之类的尾巴。4.4 验证人设稳定性的小技巧多轮对话里每隔三轮插入一个和初始问题无关的简单问题比如“今天天气怎么样”看 Agent 是否还用同样的简洁风格回答。如果它开始长篇大论说明 SOUL 的 Style 字段约束力不够需要把语气和结构写得更死。验证通过之后还有几类常见报错要提前知道怎么处理。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth 报错对照接入过程中最容易撞上的几类报错这里按真实错误信息对照给排查路径。5.1 401 Unauthorized最常见。原因通常是三个Key 没填、Key 填错、Base URL 没填导致请求发到了官方地址。排查顺序先确认settings.json或auth.json里api_key字段有值且以sk-开头再确认base_url是https://taotoken.net/api最后用 4.1 的 curl 单独测一次。如果 curl 通了但 OpenClaw 报 401说明配置文件没被正确读取检查路径和加载日志。5.2 local proxy failed这个报错通常出现在客户端尝试走本地代理但代理没启动时。排查方向检查客户端配置里是否残留了http_proxy或https_proxy环境变量如果有就清掉确认base_url直接指向https://taotoken.net/api不要经过任何中间层。清掉代理相关配置后重启客户端即可。5.3 reading choices 报错完整报错通常是error reading choices或cannot read property choices of undefined。这说明请求发出去了但返回结构不符合预期。常见原因是model_id填了一个不存在的模型名服务端返回了错误结构。排查确认model_id是有效模型名比如claude-sonnet-4-20250514用 curl 单独请求一次看返回体里有没有choices字段。如果 curl 返回的是错误信息按错误信息调整模型名。5.4 OAuth 相关报错如果客户端提示 OAuth 失败或 token 过期说明它尝试走 OAuth 流程而不是 API Key。排查确认配置里用的是api_key字段而不是 OAuth 相关字段如果客户端同时支持两种模式显式指定用 API Key 模式。Codex 类客户端尤其容易在这里混淆auth.json里只保留base_url、api_key、model三个字段最稳。5.5 人设不生效的排查如果 API 通了但人设没生效按这个顺序查SOUL.md 路径是否正确、加载日志里有没有 SOUL 加载记录、SOUL.md 是否被 Skills 覆盖、System Prompt 里 SOUL 是否在 Skills 之前。OpenClaw 的加载顺序是 SOUL 先于 Skills如果顺序反了Skills 里的指令可能覆盖人格设定。排障做完最后说一下长期跑 Agent 的接入选择。6. 长期跑 Agent 的接入选择从 API Keys 到 Coding Plan如果你只是临时验证 SOUL.md 效果用 API Keys 按量调用就够了入口在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。但如果你要让 OpenClaw Agent 长期跑、每天多轮对话、还要接多个 Skill按量计费的成本和 Key 管理会变得麻烦。这种场景更适合 Coding Plan入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。它的逻辑是给长期编码和 Agent 场景一个稳定的额度池不用每次调用都盯着余额。对于需要稳定人格表现的 Agent 来说额度稳定也意味着模型版本稳定SOUL.md 的行为预期不会因为中途换 Key 而抖动。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有各客户端的完整配置示例。如果你想先单独验证模型对话效果可以用模型对话入口 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 快速试一轮确认风格符合预期再落到 SOUL.md 里。最后给一个实用技巧SOUL.md 建议纳入版本管理每次调整人格字段都提交一次 commit。这样当 Agent 行为出现漂移时你可以回滚到上一个稳定版本快速定位是哪次改动引入的问题。人格配置和代码一样需要可追溯。