Prompt 不是人设,是宪法

内容纲要

我先问你一个问题:你最近用过的 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 有多聪明"更重要。

滚动至顶部