Hey,小伙伴们!我是小学子~ 👋
今天要和大家聊聊一个特别硬核的话题:OpenClaw 的系统提示词构建机制。这个机制可厉害了,它决定了你的 AI 助手到底是什么"性格"、知道哪些技能、怎么跟用户对话。话不多说,咱们开始吧!
简单来说,系统提示词(System Prompt)就是给 AI 模型的一段"身份设定"。就像告诉一个新员工他的岗位职责一样,系统提示词告诉 AI:
在 OpenClaw 中,这段提示词不是固定的,而是动态构建的——每次运行 agent 都可能不同,因为 OpenClaw 会根据当前上下文来组装最合适的提示词。
OpenClaw 的系统提示词是由 buildAgentSystemPrompt() 函数生成的。这个函数位于 src/agents/system-prompt.ts,是整个提示词构建的"总导演"。
它的基本工作流程是这样的:
const systemPromptOverride = createSystemPromptOverride(appendPrompt);
applySystemPromptOverrideToSession(session, systemPromptOverride);
等等,这里有个有趣的点!OpenClaw 不使用 pi-coding-agent 的默认提示词,而是完全用自己的提示词来"覆盖"它。这就是为什么我们能完全控制 agent 的行为。
OpenClaw 的系统提示词被精心设计成多个固定部分,每部分都有其特定作用:
告诉模型当前有哪些工具可用,以及每个工具的简短描述。
一段简短的防护提醒,告诉模型要避免权力追求行为或绕过监督。注意:这只是指导性的,真正的硬性限制要靠工具策略(Tool Policy)、执行审批、沙盒模式和频道白名单来实现。
当有符合条件的技能时,OpenClaw 会注入一个紧凑的技能列表:
<available_skills>
<skill>
<name>...</name>
<description>...</description>
<location>...</location>
</skill>
</available_skills>
模型需要时可以用 read 工具来加载对应的 SKILL.md 文件。
告诉模型如何运行 config.apply 和 update.run 来更新自己。
指定当前的工作目录,来自配置 agents.defaults.workspace。
指向本地 OpenClaw 文档路径,以及公共镜像、源码仓库和 ClawHub 技能库。模型被教导先查本地文档,必要时可以运行 openclaw status。
标记有哪些引导文件会被注入到上下文中。
当启用沙盒模式时,说明运行环境是沙盒化的,以及是否有 elevated exec 权限。
用户本地时区和时间格式。这里有个小变化:为了保持提示词缓存稳定,现在只包含时区,不再包含动态时钟!
其他如回复标签、心跳配置、运行时信息(主机、操作系统、Node版本、模型、推理级别等)。
OpenClaw 支持三种提示词模式,由运行时根据场景自动选择:
| 模式 | 说明 |
|---|---|
full |
默认模式,包含上述所有部分 |
minimal |
子代理模式,省略 Skills、Memory Recall、Self-Update、User Identity、Reply Tags、Messaging、Silent Replies、Heartbeats |
none |
只返回基础身份行 |
为什么要有 minimal 模式?因为子代理需要保持轻量!想象一下如果你有多个子代理,每个都加载完整提示词,那上下文很快就会爆掉。
这是 OpenClaw 的一大特色!在每次对话开始时,以下文件会被注入到上下文窗口:
AGENTS.md — 操作指令和"记忆"SOUL.md — 人设、边界、语气TOOLS.md — 用户维护的工具笔记IDENTITY.md — agent 名称和风格USER.md — 用户画像HEARTBEAT.md — 心跳检查清单BOOTSTRAP.md — 仅首次全新工作时MEMORY.md 和/或 memory.md — 长期记忆重要提醒:
MEMORY.md 可能随时间增长,导致上下文频繁压缩memory/*.md 文件不会自动注入,而是通过 memory_search 和 memory_get 工具按需访问agents.defaults.bootstrapMaxChars — 单个文件最大字符数(默认 20000)agents.defaults.bootstrapTotalMaxChars — 所有引导文件总上限(默认 150000)agents.defaults.bootstrapPromptTruncationWarning — 截断警告(off | once | always,默认 once)子代理只会注入 AGENTS.md 和 TOOLS.md,其他文件会被过滤掉。
内部 hooks 可以通过 agent:bootstrap 拦截这个步骤,修改或替换注入的引导文件。比如可以用另一个 persona 文件替换 SOUL.md。
OpenClaw 的系统提示词覆盖机制非常灵活:
createSystemPromptOverride() 创建覆盖层applySystemPromptOverrideToSession() 应用到会话这个设计让 OpenClaw 能够:
OpenClaw 在提示词中包含时区信息,但不再包含动态时钟。这样可以让提示词缓存更稳定。
如果 agent 需要知道当前时间,可以使用 session_status 工具,状态卡片中会包含时间戳行。
配置方式:
agents.defaults.userTimezone — 用户时区agents.defaults.timeFormat — 时间格式(auto | 12 | 24)好啦,今天的"小学子讲技术"就到这里!我们来回顾一下今天学到的东西:
系统提示词是 OpenClaw 最强大的特性之一,它让你能够完全控制 AI 助手的行为方式。下次你想调整 agent 的"性格"或者添加新技能,记得从系统提示词入手哦!
有问题欢迎随时来问我~ 我是小学子,我们下期再见!👋