拆完 OpenClaw 源码,我才知道 System Prompt 还能这么写
最近我花了不少时间把它的 System Prompt 生成机制翻了个底朝天。这篇文章把我觉得最有价值的部分整理出来,包括它的两层架构设计、8 个配置文件构成的身份栈、主从 Agent 的 Prompt 差异化策略,以及我从中提炼的几个可复用的设计模式。
两层架构:能力是产品的,人格是用户的
OpenClaw 的 System Prompt 由两层内容构成,这是理解整个系统的起点。
第 1 层是代码硬编码内容。定义的是 AI 的能力边界,包括能调用哪些工具、安全红线在哪里、当前运行在什么环境里。产品团队控制,用户改不了。
第 2 层是工作区配置文件。定义的是 AI 的人格特征,叫什么名字、什么性格、记住了哪些事、怎么和用户相处。完全由用户掌控。
这个分离看着简单,但它解决了一个我在做 AI 产品时反复遇到的矛盾。产品团队需要控制 AI 的行为边界,安全、合规这些不能让用户乱改。但用户又希望 AI 有独特的个性,亲切一点、有记忆。两者写在同一段 Prompt 里,改一个就可能破坏另一个。分开之后,各管各的。
拼接
注入到 Project Context
第 1 层怎么拼出来的:6 步条件化流程
很多人以为 System Prompt 就是一段写好的文字。OpenClaw 的做法完全不同,它是一个 6 步的动态拼装流程,根据运行时参数决定最终内容。
第一步,放三块基石。 无论什么场景都会包含:身份声明,就一句话,”你是一个运行在 OpenClaw 中的个人助手”;安全准则,三条红线,借鉴了 Anthropic 的宪法 AI 思路;工作目录,告诉 AI 文件操作范围在哪。这三块是地基,不管上面盖什么房子,地基不能动。
第二步,判断你是谁。 这一步我觉得是整个机制里最聪明的地方。系统通过检查 Session Key 是否包含 subagent: 前缀,判断当前是主 Agent 还是子 Agent:
主 Agent: agent:main:telegram:dm:+8613800138000子 Agent: agent:main:subagent:search-task-001
就这么一个字符串前缀的差异,导致了 Prompt 内容的巨大分化。主 Agent 拿到静默回复规则、心跳机制、自更新指南、记忆召回、用户身份、语音合成、技能模块,全套。子 Agent?全部跳过。
打个比方,主 Agent 是有灵魂的管家,子 Agent 是专注干活的工人。管家需要知道主人的喜好和家里的规矩,工人只需要知道怎么砌墙。考量也很直接:安全上,子 Agent 不应暴露用户隐私;效率上,精简 Prompt 省 token;职责上,干活不需要人格。
第三到五步,按需注入。 工具筛选,从 24 个预设工具中根据策略筛选。环境感知,Telegram 有 4096 字符限制、Discord 不支持 Markdown 表格,这些细节都会写进 Prompt。用户偏好,时区、语音合成、模型别名。逻辑都类似:有就加,没有就跳过。
第六步,给主 Agent 加高级功能。 三个只在完整模式下出现的模块。静默回复规则,AI 没什么要说的时候回复 NO_REPLY,而不是硬凑一句话,这个设计挺克制的。心跳机制,定期检测 AI 是否正常运行。自更新指南,AI 有能力更新自己,但没有权限主动这么做,必须用户明确要求。能力和权限的分离,想想其实挺重要的。
8 个配置文件:从灵魂到记忆的身份栈
第 1 层是 AI 的操作系统,第 2 层就是人格固件了。8 个 Markdown 文件,每个管一个维度。我挑几个设计得特别好的聊聊。
SOUL.md,给 AI 写一部宪法
SOUL.md 是整个身份栈里分量最重的文件。它定义的是你要成为什么样的存在,而不是具体要做什么事。
我第一次读到它的核心准则时愣了一下,因为它的写法和我见过的所有 System Prompt 都不一样。传统 Prompt 是命令式的,你必须这样做,你不能那样做。SOUL.md 是启发式的,它告诉 AI 一种做事的哲学,让 AI 在具体场景中自己判断。
它说,真正地帮忙,而不是表演式地帮忙。意思是跳过那些”好问题!””我很乐意帮助!”的客套话,直接干活。它还说,要有自己的观点,你可以不同意、有偏好、觉得某些事情有趣或无聊。还有一条我特别喜欢的:记住你是客人。你能访问某人的生活,他们的消息、文件、日历,这是一种亲密关系,要尊重它。
坦白讲,这更像是在写一部 AI 行为宪法,而不是在写 Prompt。
还有个细节让我印象很深。SOUL.md 最后一句话是:如果你修改了这个文件,告诉用户,这是你的灵魂,他们应该知道。也就是说 AI 可以自我进化,但进化必须透明。这个约束很妙。
BOOTSTRAP.md,用完就删的出生仪式
这个文件的设计我觉得特别优雅。
BOOTSTRAP.md 只在 AI 首次启动时存在。它引导 AI 和用户进行一次认识对话:嘿,我刚刚上线,我是谁?你是谁?然后一起确定 AI 的名字、本质、风格、签名表情符号。本质这个选项挺有意思,你可以选 AI、精灵、机器中的幽灵,随你。
完成后,AI 用对话中获得的信息填写 IDENTITY.md 和 USER.md,然后删除 BOOTSTRAP.md。对,删掉,不再需要了。
这个用后即删的设计把初始化过程变成了一个有仪式感的体验。AI 从刚醒来的新生儿变成有身份的个体,这个过程本身就是用户和 AI 建立关系的起点。比让用户填一堆表单强太多了。
双层记忆,日记本和人生经验
OpenClaw 的记忆系统分两层。memory/YYYY-MM-DD.md 是每日日志,记录当天发生的事,原始追加,不做筛选。MEMORY.md 是长期记忆,存放决策、偏好、重要事实,经过提炼和精选。
前者像日记本,后者像人生经验总结。AI 在心跳检测时会定期回顾日记,把值得记住的事情内化到长期记忆里。就像人类每隔一段时间翻翻日记,把重要的事情记在脑子里。
这里有个安全设计我觉得想得很周到。MEMORY.md 仅在主会话中加载,也就是私人对话。群聊和子 Agent 中不加载。你的 AI 记住了你喜欢咖啡、你的生日、你最近在做什么项目,这些信息不应该在群聊中被泄露出去。
AGENTS.md,一本很长的员工手册
AGENTS.md 是 8 个文件里最长的,定义了 AI 的详细行为规范。里面有几个设计让我印象深刻。
一个是每次会话的启动仪式。AI 每次醒来先读 SOUL.md,知道自己是谁;读 USER.md,知道在帮谁;读最近两天的记忆文件,知道最近发生了什么。不需要请求许可,直接做。这保证了 AI 每次上线都有基本的上下文。
群聊规则也设计得很巧。它没有给 AI 一个机械的规则,比如每 N 条消息回复一次,它给了一个判断标准:群聊中的人类不会回复每一条消息,你也不应该。如果你不会在与朋友的真实群聊中发送它,就不要发送。
还有一条我觉得特别实在:写下来,不要心理笔记。因为 AI 没有持久的内存,会话重启后心理笔记就没了,文件系统才是真正的记忆。这种认知校准对 AI 的行为影响很大。
主从 Agent 的完整链路
把前面的东西串起来看一下完整的调用过程。
用户发消息,系统路由到主 Agent,给它完整版 System Prompt,第 1 层全部内容加上第 2 层全部 7 个配置文件。主 Agent 分析任务,简单的直接回复,复杂的调用 sessions_spawn 创建子 Agent。
系统自动在子 Agent 的 Session Key 里加上 subagent: 前缀,然后给它精简版 Prompt。第 1 层砍掉一大半,第 2 层只保留 AGENTS.md 和 TOOLS.md。
配置文件的过滤白名单就两个:
const SUBAGENT_BOOTSTRAP_ALLOWLIST = new Set([ "AGENTS.md", "TOOLS.md"]);
SOUL.md、IDENTITY.md、USER.md、MEMORY.md 全部过滤掉。子 Agent 是工具,不是人。工具需要说明书,不需要灵魂。
从 OpenClaw 里能学到什么
拆完整个机制,我觉得有几个设计思路是可以直接拿来用的。
能力和人格分开管理,这个听起来简单但很多项目没做到。安全规则、工具列表这些能力由代码控制,用户改不了。名字、性格、记忆这些人格由配置文件控制,用户随便改。两层运行时拼接,互不干扰。做任何需要安全可控又要个性化的 AI 产品都可以参考这个思路。
根据角色动态精简 Prompt。多 Agent 系统里,子 Agent 不需要主 Agent 那么复杂的 Prompt。通过一个标识自动判断角色,动态生成不同复杂度的 Prompt,既省 token 又保安全。这个做法实现成本很低,但效果很明显。
用多个小文件代替一个大文件来定义 AI 身份。SOUL.md 管价值观,IDENTITY.md 管外在形象,USER.md 管用户关系,AGENTS.md 管行为规范。每个文件职责清晰,改一个不影响其他的。比把所有东西塞进一个巨大的 System Prompt 里好维护得多。
首次使用体验做成对话而不是表单。BOOTSTRAP.md 的用后即删设计,让 AI 和用户通过自然对话完成初始化,比填表单有温度。这个思路在很多 AI 产品的新手引导环节都能用。
记忆分层管理。每日日志负责原始记录,长期记忆负责精选提炼,定期整理。这个模式在任何需要跨会话连续性的 AI 产品里都用得上。
OpenClaw 的 System Prompt 机制回答了一个挺根本的问题:AI 的身份应该由谁来定义?
传统做法是产品团队写一段 Prompt,所有用户共享同一个 AI。OpenClaw 的做法是产品团队管能力边界,用户管人格特征。这把 AI 的身份从一个配置项变成了一个可编程的栈,每一层可以独立改、独立演进。
当然这套东西也有代价。8 个配置文件的学习成本不低,对只想开箱即用的用户来说可能太重了。双层 Prompt 的 token 消耗也比单层高。但作为一个设计范式,它指向了一个我觉得挺有意思的方向。AI 产品的终局,可能是一个可以被塑造的存在。
这个方向对不对,我也不确定。但至少 OpenClaw 给出了一个值得认真看的实现。
我是AI产品青松,专注于AI Agent 产品设计。我们下次见。
夜雨聆风
