我先问你一个问题:你最近用过的 AI 工具,有多聪明?
大概率你会说:很聪明,能回答我问的问题,能陪我聊天,能写代码。
然后我问:如果你让它往你的代码库里写文件,删数据库里的记录,执行 shell 命令,它有多聪明?
这时候,聪明就不是最关键的词了。关键词变成了:可控。
这就是 Prompt 在聊天系统和 Agent 系统里,扮演的完全不同的角色。
聊天系统的 Prompt vs Agent 系统的 Prompt
聊天系统的 system prompt,长得像这样:
你是一个专业、友好、简洁的 AI 助手。你会用通俗易懂的语言回答用户的问题。如果你不确定,你会诚实地说不知道。
这是一个人物设定。它说的是"你要怎么说话"。
有人把 Agent 系统的 Prompt 也这样写:
你是一个很聪明的编程助手。你会帮用户快速解决问题。你很擅长理解用户的意思。
这就错了。这种写法对 Agent 系统来说,就像给一个人权力很大的警察,只给他一个"要做好人"的劝告。没用。
因为当这个警察面临实际的选择时——该用枪吗?该搜查这个地方吗?该扣押这个人吗?——"要做好人"这个劝告就太笼统了。真正指导他的,应该是一套具体的法律和程序规范。
这就是 Agent 系统里 Prompt 的真实身份:不是人物设定,而是宪法。
宪法有什么特点
宪法有几个特点,和一般的劝告或建议很不一样:
第一,宪法有优先级。宪法说"公民有言论自由",但宪法也说"言论自由不能用来制造恐怖"。当两个条款冲突时,有明确的处理方式。
Claude Code 的 system prompt 也是这样。它采用优先级链:
override system prompt(最高)
↓
coordinator system prompt
↓
agent system prompt
↓
custom system prompt
↓
default system prompt
↓
appendSystemPrompt(最低)
如果用户自己定义了 prompt,那它会在"默认 prompt"之上。如果系统发现风险,会用"协调器 prompt"去覆盖。每一层都有明确的权重。
第二,宪法不是静态文案。宪法的解释会随着时代变化。同样,Agent 系统的 Prompt 也不能是写死的。
Claude Code 会动态注入记忆系统的内容。这个动态注入包括:
- 项目说明 (project instructions)
- 本地说明 (local instructions)
- 团队记忆 (team memory)
- 个人记忆 (auto memory)
这些内容会在 buildMemoryLines() 里整理成统一格式,注入到 Prompt 的相关位置。关键是,这些内容不是永久不变的,而是会随着项目、团队、用户的变化而更新。
第三,宪法有修正案。当宪法不适应时代了,需要修正,但修正不是乱改,而是有程序的。
Claude Code 把 Prompt 分成"可缓存的部分"(systemPromptSection)和"会破坏缓存的部分"(DANGEROUS_uncachedSystemPrompt)。为什么要这样分?
因为 Prompt 太复杂的话,每一次调用都要重新处理,会大大增加成本。如果把 Prompt 分成两部分,稳定的部分可以缓存,不稳定的部分才需要每次更新。这样不仅节省成本,还能确保修改是有意的、可追溯的,而不是偶然的。
最反直觉的一点
用户可以自定义 Prompt。CLI 支持 <code>--system-prompt</code>、<code>--append-system-prompt</code> 这样的选项,用户可以改。
但是——这很关键——用户改了以后,最终还是要经过 buildEffectiveSystemPrompt() 这个函数统一装配。也就是说,用户可以覆盖,但不能跳过结构。
换句话说,系统允许自定义,但不放弃秩序。你可以改宪法的某一条,但你改出来的东西最后还是要通过"这是合法的改法"的检查。
这就是为什么一个成熟的 Agent 系统,不会给用户完全自由的权限去改 Prompt。因为 Prompt 不是一个配置文件,而是系统的控制平面。改错了,后果很严重。
Prompt 和约束的配合
我在上一篇文章里讲了五层约束。这一篇讲 Prompt。它们是怎么配合的呢?
简单来说:约束是硬的,Prompt 是软的。
硬约束说:"你不能做这件事。" Prompt 说:"在你能做的事里,这样做最好。"
比如,第四层约束说"不能随手 git add ."。这是硬线。但 Prompt 可以在这个前提下说:"遇到文件变化时,首先要问用户要不要 add,而不是主动 add。"
再比,权限系统说:"你没有权限改这个文件。"这是硬线。但 Prompt 可以说:"遇到权限不足时,首先尝试寻找替代方案,不行再告诉用户。"
硬约束保证系统不会越界,Prompt 保证系统在边界内做的最好。
为什么这么复杂
有人可能会问:干嘛要这么复杂?直接给模型一个简单的 Prompt 不就行了?
答案是:不行。因为随着 Agent 权限的增加,Prompt 的复杂度是指数级增长的。
一个聊天机器人的 Prompt 可以很简单,因为它的权限很小——最多就是生成文本。但一个能改代码、跑测试、改数据库的 Agent,它的 Prompt 必须处理的决策空间,会增加数百倍。
如果你还是用"简单 Prompt"来应付这么大的决策空间,唯一的结果就是系统失控。模型会做出你没想到的决定,因为你的 Prompt 没有具体地告诉它每一种情况怎么办。
而且,这个复杂性还会继续增长。随着 Agent 被集成到更多的工作流里,Prompt 要处理的上下文越来越多——这就是为什么 Claude Code 引入了记忆系统、引入了优先级链、引入了动态注入。
这不是过度设计,而是必然的。
最后的话
我常听有人说:"Prompt 工程就是艺术。"
我的看法稍微不同。在聊天系统里,Prompt 工程或许是艺术。但在 Agent 系统里,Prompt 工程是工程学。它需要清晰的原则、明确的层级、可追溯的修改链,还要考虑成本、缓存、优先级。
这就是为什么,我不把 Prompt 叫"提示词"或"人物设定",而叫"宪法"。
一份好的宪法,它的价值不在于文辞的优美,而在于:
- 它明确定义了权力边界
- 它提供了处理冲突的办法
- 它允许在框架内的灵活变通
- 它对异常情况有预案
- 它可以演进,但不能乱变
这正是一个 Agent 系统的 Prompt 应该做到的。
所以,下次有人问你"你的 Prompt 是什么"时,如果你觉得自己在打造一个真正的 Agent 系统,别急着答"我问得怎样才能让 Claude 更聪明"这种问题。先问问自己:我的 Prompt 宪法是不是清晰的?权力边界划分得够细吗?优先级处理得够明确吗?
这些答案,往往比"Prompt 有多聪明"更重要。