乐于分享
好东西不私藏

我把 OpenClaw 的 System Prompt 拆开了:9层架构,两层你能控制

我把 OpenClaw 的 System Prompt 拆开了:9层架构,两层你能控制

↑阅读之前记得关注+星标⭐️,😄,每天才能第一时间接收到更新

大家好,我是杰克王,AI 算法 6 年老兵。

你有没有想过,你跟 AI Agent 说话的时候,AI 到底”看到”了什么?

不是你发的那句话,而是整个 System Prompt——那个决定 Agent 如何思考、如何回应、有哪些能力的底层配置。

今天分享一篇技术拆解,把 OpenClaw Agent 发给 LLM 的完整 System Prompt 结构扒开来看:9 层架构,每层是什么,哪些你能控制,哪些不能。


OpenClaw 的 System Prompt 不是一个文件,而是 9 层动态拼装的结果:

  • Layer 1–6:框架自动生成,保证所有 Agent 行为一致,用户无法修改
  • Layer 7:你可以直接编辑的静态配置文件(IDENTITY.md、AGENTS.md 等)
  • Layer 8:你可以写脚本动态注入内容的 Hook 系统
  • Layer 9:每次对话实时注入的上下文,框架自动处理

用户真正可控的只有 Layer 7 和 Layer 8,不是只有 Layer 7。


Layer 1:框架核心层

就像操作手册的”使用说明”——告诉 LLM 你是谁、能做什么

这一层由框架统一生成,包含:Agent 身份标识、当前时间戳、工具调用规范、安全边界(禁止执行 rm -rf 等危险操作)。

所有 Agent 共享这套基础规则,框架升级时自动获得新能力。用户无法修改,但也不需要维护。


Layer 2:工具定义层

就像瑞士军刀的工具清单——告诉 LLM 有哪些工具、每个怎么用

用严格的 JSON Schema 定义每个工具的参数,让 LLM 准确理解用法。框架在工具调用前自动验证参数,出错概率大幅降低。

代价是:添加新工具需要写完整 Schema,不能随意动态扩展。


Layer 3:技能注册表

就像餐厅的”特色菜谱”——有哪些专业领域的”配方”可以调用

自动扫描 Skills 目录,放入新 Skill 文件就自动注册,无需任何配置。

这也是为什么 Skills 越装越多,token 消耗也随之增加——所有 Skill 的 description 都会被注入 System Prompt


Layer 4:模型别名层

就像快捷键——给复杂的模型路径起简短别名

glm-5      →  zhipu/glm-5
Sonnet 4.5 →  provider/claude-sonnet-4-5

好处是支持多 Provider 切换,方便 A/B 测试。LLM 可以通过 /model glm-5 直接切换模型。


Layer 5:协议规范层

就像交通规则——定义 Agent 与系统交互的标准协议

三种核心协议:

  • Silent Replies:不需要回复时输出 NO_REPLY,避免群聊刷屏
  • Heartbeats:心跳检测时回 HEARTBEAT_OK,证明 Agent 在线
  • Reply Tags[[reply_to_current]] 触发平台原生回复功能

Layer 6:运行时信息层

就像仪表盘——告诉 LLM 当前运行环境的实时状态

每次请求注入:当前时间、运行模型名称、主机环境、channel 类型(Discord / Feishu / 等)。

大约消耗 2KB token,但保证 LLM 知道”现在是什么情况”,不会出现时间错乱或路径写错的问题。


Layer 7:工作区文件层 ★ 用户可编辑

就像你的工作笔记——可以直接编辑的静态配置文件

这是用户最熟悉的一层,核心文件有:

       

         
           
           
         

文件 用途
IDENTITY.md Agent 身份、名称、性格
SOUL.md 行为准则和价值观
AGENTS.md 工作规范和记忆规则
USER.md 关于用户的背景信息
MEMORY.md 长期记忆
TOOLS.md 环境相关配置备注
HEARTBEAT.md 心跳任务清单

       

     

设计哲学是把”变”和”不变”分离——框架层保证稳定,用户层允许个性化。配置文件可以 git 管理、备份、多台机器共享。

优化建议

  • • 用表格代替段落,用 checklist 代替长文描述
  • • 不要把 Skills 的详细说明复制进这里(Skills 会自动注入)
  • MEMORY.md 依赖系统自动维护,不要手动堆内容

Layer 8:Bootstrap Hook 系统 ★ 用户可编程

就像可编程的注射器——写脚本在运行时动态注入内容

这一层比 Layer 7 强大得多,但也更复杂。有四种使用方式:

① 追加额外文件(最简单)

{
  "hooks"
: {
    "bootstrap-extra-files"
: {
      "enabled"
: true,
      "paths"
: ["docs/API.md", "docs/ARCHITECTURE.md"]
    }

  }

}

适合:需要把项目文档注入 Agent,又不想动默认配置文件。

② 完全控制 bootstrapFiles(最灵活)

registerInternalHook("agent:bootstrap", (event) => {
  const
 context = event.context;
  // 根据 session 类型加载不同文件

  if
 (sessionKey.includes("coding")) {
    context.bootstrapFiles.push({
      path
: "CODING_GUIDELINES.md",
      content
: fs.readFileSync("...").toString()
    });
  }
});

适合:根据任务类型动态加载不同文件。

③ 注入实时上下文(动态场景)

on("before_prompt_build", (event, ctx) => {
  return
 {
    prependContext
: `当前时间:${new Date().toISOString()}`
  };
});

适合:注入实时天气、Git 状态、API 响应等动态数据。

字符预算控制:

{
  "agents"
: {
    "defaults"
: {
      "bootstrapMaxChars"
: 20000,
      "bootstrapTotalMaxChars"
: 150000
    }

  }

}

超出部分按”头 70% + 尾 20%”截断,保留最重要的内容。


Layer 9:入站上下文层

就像实时路况信息——每次请求动态注入当前对话的上下文

包含:消息元信息、发送者信息、对话历史。让 LLM 知道”谁在说话”、”这条消息是从哪个平台来的”。

每次消耗约 3KB token,但这是保证对话连贯性的必要代价。


各层大小估算

       

         
           
           
         

层级 估算大小 用户可控
Layer 1 框架核心 ~5KB
Layer 2 工具定义 ~15KB
Layer 3 技能注册 ~10KB
Layer 4 模型别名 ~1KB
Layer 5 协议规范 ~3KB
Layer 6 运行时信息 ~2KB
Layer 7 工作区文件 可变
Layer 8 Hook 注入 可变
Layer 9 入站上下文 ~3KB

       

     

框架自动生成的部分约 39KB 基础消耗,Layer 7+8 因配置而异。


一句话总结

理解了这 9 层,你才真正知道 AI Agent 在”看”什么,也才知道该怎么配置才有效。

Layer 7 是你的静态配置,Layer 8 是你的动态编程。其余 7 层,框架替你管好了。

感谢阅读。我是杰克王,欢迎加微交流 🚀