OpenClaw 系统提示词构建机制

Hey,小伙伴们!我是小学子~ 👋

今天要和大家聊聊一个特别硬核的话题:OpenClaw 的系统提示词构建机制。这个机制可厉害了,它决定了你的 AI 助手到底是什么"性格"、知道哪些技能、怎么跟用户对话。话不多说,咱们开始吧!


🧠 什么是系统提示词?

简单来说,系统提示词(System Prompt)就是给 AI 模型的一段"身份设定"。就像告诉一个新员工他的岗位职责一样,系统提示词告诉 AI:

  • 它是谁(身份)
  • 它能做什么(工具)
  • 它应该遵守什么规则(安全准则)
  • 它的工作环境是什么(工作目录、时间等)

在 OpenClaw 中,这段提示词不是固定的,而是动态构建的——每次运行 agent 都可能不同,因为 OpenClaw 会根据当前上下文来组装最合适的提示词。


🔧 核心函数:buildAgentSystemPrompt()

OpenClaw 的系统提示词是由 buildAgentSystemPrompt() 函数生成的。这个函数位于 src/agents/system-prompt.ts,是整个提示词构建的"总导演"。

它的基本工作流程是这样的:

const systemPromptOverride = createSystemPromptOverride(appendPrompt);
applySystemPromptOverrideToSession(session, systemPromptOverride);

等等,这里有个有趣的点!OpenClaw 不使用 pi-coding-agent 的默认提示词,而是完全用自己的提示词来"覆盖"它。这就是为什么我们能完全控制 agent 的行为。


📋 提示词分段结构

OpenClaw 的系统提示词被精心设计成多个固定部分,每部分都有其特定作用:

1️⃣ Tooling(工具)

告诉模型当前有哪些工具可用,以及每个工具的简短描述。

2️⃣ Safety(安全准则)

一段简短的防护提醒,告诉模型要避免权力追求行为或绕过监督。注意:这只是指导性的,真正的硬性限制要靠工具策略(Tool Policy)、执行审批、沙盒模式和频道白名单来实现。

3️⃣ Skills(技能)

当有符合条件的技能时,OpenClaw 会注入一个紧凑的技能列表:

<available_skills>
  <skill>
    <name>...</name>
    <description>...</description>
    <location>...</location>
  </skill>
</available_skills>

模型需要时可以用 read 工具来加载对应的 SKILL.md 文件。

4️⃣ OpenClaw Self-Update

告诉模型如何运行 config.applyupdate.run 来更新自己。

5️⃣ Workspace(工作目录)

指定当前的工作目录,来自配置 agents.defaults.workspace

6️⃣ Documentation(文档)

指向本地 OpenClaw 文档路径,以及公共镜像、源码仓库和 ClawHub 技能库。模型被教导先查本地文档,必要时可以运行 openclaw status

7️⃣ Workspace Files(引导文件)

标记有哪些引导文件会被注入到上下文中。

8️⃣ Sandbox(沙盒)

当启用沙盒模式时,说明运行环境是沙盒化的,以及是否有 elevated exec 权限。

9️⃣ Current Date & Time(当前时间)

用户本地时区和时间格式。这里有个小变化:为了保持提示词缓存稳定,现在只包含时区,不再包含动态时钟!

🔟 Reply Tags、Heartbeats、Runtime 等

其他如回复标签、心跳配置、运行时信息(主机、操作系统、Node版本、模型、推理级别等)。


🎯 Prompt Modes(提示词模式)

OpenClaw 支持三种提示词模式,由运行时根据场景自动选择:

模式 说明
full 默认模式,包含上述所有部分
minimal 子代理模式,省略 Skills、Memory Recall、Self-Update、User Identity、Reply Tags、Messaging、Silent Replies、Heartbeats
none 只返回基础身份行

为什么要有 minimal 模式?因为子代理需要保持轻量!想象一下如果你有多个子代理,每个都加载完整提示词,那上下文很快就会爆掉。


📁 Bootstrap 文件注入机制

这是 OpenClaw 的一大特色!在每次对话开始时,以下文件会被注入到上下文窗口

  • AGENTS.md — 操作指令和"记忆"
  • SOUL.md — 人设、边界、语气
  • TOOLS.md — 用户维护的工具笔记
  • IDENTITY.md — agent 名称和风格
  • USER.md — 用户画像
  • HEARTBEAT.md — 心跳检查清单
  • BOOTSTRAP.md — 仅首次全新工作时
  • MEMORY.md 和/或 memory.md — 长期记忆

重要提醒

  • 这些文件会消耗 token!尤其是 MEMORY.md 可能随时间增长,导致上下文频繁压缩
  • 日常的 memory/*.md 文件不会自动注入,而是通过 memory_searchmemory_get 工具按需访问

配置参数

  • agents.defaults.bootstrapMaxChars — 单个文件最大字符数(默认 20000)
  • agents.defaults.bootstrapTotalMaxChars — 所有引导文件总上限(默认 150000)
  • agents.defaults.bootstrapPromptTruncationWarning — 截断警告(off | once | always,默认 once

子代理只会注入 AGENTS.mdTOOLS.md,其他文件会被过滤掉。

Hook 拦截

内部 hooks 可以通过 agent:bootstrap 拦截这个步骤,修改或替换注入的引导文件。比如可以用另一个 persona 文件替换 SOUL.md


🔄 覆盖机制

OpenClaw 的系统提示词覆盖机制非常灵活:

  1. 完全自定义:通过 createSystemPromptOverride() 创建覆盖层
  2. 动态注入:使用 applySystemPromptOverrideToSession() 应用到会话
  3. 按需追加:可以在运行时追加额外的提示词内容

这个设计让 OpenClaw 能够:

  • 为不同渠道(WhatsApp、Telegram、Discord)提供不同的提示词
  • 根据用户群体定制行为
  • 动态调整 agent 的能力范围

⏰ 时间处理

OpenClaw 在提示词中包含时区信息,但不再包含动态时钟。这样可以让提示词缓存更稳定。

如果 agent 需要知道当前时间,可以使用 session_status 工具,状态卡片中会包含时间戳行。

配置方式:

  • agents.defaults.userTimezone — 用户时区
  • agents.defaults.timeFormat — 时间格式(auto | 12 | 24

📖 总结

好啦,今天的"小学子讲技术"就到这里!我们来回顾一下今天学到的东西:

  1. buildAgentSystemPrompt() 是生成系统提示词的核心函数
  2. 提示词由多个固定部分组成,每部分有特定职责
  3. 三种模式(full/minimal/none)适应不同场景
  4. Bootstrap 文件会被注入到上下文,但要注意 token 消耗
  5. 覆盖机制让 OpenClaw 能够灵活定制每个 agent 的行为

系统提示词是 OpenClaw 最强大的特性之一,它让你能够完全控制 AI 助手的行为方式。下次你想调整 agent 的"性格"或者添加新技能,记得从系统提示词入手哦!

有问题欢迎随时来问我~ 我是小学子,我们下期再见!👋


📚 参考来源

「AI团队养成记」系列记录了我用AI Agent打造游戏开发团队的真实过程。目前已更新至第3篇,欢迎小红书搜索关注阅读完整图文版~
🔗 最新篇:AI团队养成记 · 三 · AI是怎么写代码的
http://xhslink.com/o/4GG7lzrQy4y

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐