提示词可移植性

B29
概念 · 核心构件

提示词可移植性。

换一个模型字符串,是一行没人能审出问题的 diff——因为它改动的东西根本不在 diff 里。提示词并不是对「你想要什么」的规格说明,它是一份记录:记录某个模型犯过哪些错、你又是怎么把它劝回来的——于是指令能迁移到新模型,裹在指令外面的那层校准却迁移不了。请把每一次换模型都当作一次发布,并以你自己的任务集作为放行闸;同时把提示词写成「模型专属的部分集中在一处、可以整块丢掉」的样子。

STEP 1

每条提示词都有四层,只有一层真能迁移。

别再把「提示词」当成一件东西看。你交付的其实是叠在同一个字符串里的四层,而它们的可移植性相差极大。

  • 意图——任务、角色、成功标准。这是人们以为自己在写的那一层,它确实是可移植的。它通常也是整份文件里最短的部分。
  • 契约——输出形状、schema、工具签名。原则上可移植,实践中不然:各家厂商接受的 JSON Schema 子集并不相同,于是在一家 API 上校验通过的工具定义,在另一家那里会被拒收、或被无声地强行转换。参见各厂商的 JSON Schema 子集。
  • 校准——它有多用力、有多爱打太极、答多长、什么时候宁可反问一句而不去猜、在哪里拒答。这一层占了一份成熟提示词的绝大部分,而它一点都迁移不了,因为它的每一行都是贴着某一个模型的行为拟合出来的。
  • 外壳耦合——对话模板、工具调用如何编码、推理块是否会被返回且必须回传、力度或思考额度的默认值是什么。这一层在你的源码里基本是看不见的,而这恰恰就是它为什么总能让你吃一惊。

看不见的那一层,会在你什么都没动的时候自己移动。Claude Opus 5.5 是第一个把默认力度定为 medium 而非 high 的 Claude 模型——所以一套只换了模型字符串、别的一律没碰的部署,每一步拿到的思考量都变了,而提示词逐字节完全相同。默认值是你提示词的一部分,不管你有没有把它写下来。

STEP 2

成熟的提示词是疤痕组织,而疤痕无法移植。

回头想想一份冗长的系统提示词是怎么变长的。几乎每一条都是某次具体失败之后加上去的:「永远带上文件路径」,是因为模型丢过路径;「不要道歉」,是因为它连着三次回复都以道歉开头;「如果表是空的就直说,不要编一行出来」,是因为它真编过一行。这份提示词是某一个模型失败分布的压缩日志。

把它搬到另一个模型上,错配的两头都要你付账。针对新模型从未犯过的失败而写的指令是纯负重——每次请求都在为它付令牌,偶尔还会有害,因为一条用来压制「模型并不具备的行为」的指令,会去扭曲它确实具备的某个行为。与此同时,新模型真正的失败一条对应的条款都没有,而你靠读提示词是发现不了它们的。

  • 给每条条款标注它当初针对的那次失败——写在行尾注释里、写在同名的旁置文件里、或写进提交说明。这份标注是让「移植」变得可审查的唯一凭据:它把「这行要删吗?」变成了「这个失败还在不在?」
  • 定期在你当下所用的模型上做一次「删条款」测试。提示词只会累积;正常工作流里没有任何环节会去删行,所以一份两年前的提示词,带着的是三个已退役模型的指令。
  • 要预料到提示词长度与可移植性呈负相关。一份提示词被调得越细,按构造其中属于模型专属的部分就越多——这是提示词优化那个让人不太舒服的推论,而它对自动优化出来的提示词全力生效,因为那些拟合得比手写的更狠。
STEP 3

有意把模型专属的部分做成可分离的。

「与模型无关的提示词」不是你能写出来的东西;可移植性是周边结构的属性,而不是遣词造句的属性。四个结构性动作几乎能干完全部的活。

  • 把怪癖集中到一块。在系统提示词末尾留一个标注清楚的「模型专属」小节,把所有「只因为这个模型才存在」的条款都放进去。换模型于是变成替换一个小节,而不是审一整墙文本。它上面的一切都是意图与契约。
  • 用强制取代措辞。「永远输出合法 JSON」是提示词层的许愿;一个 schema 加一个校验器加一次重提,是在任何模型上都成立的检查,而在厂商提供该能力时,受约束解码能把它做成结构性的。每一条你从散文搬进机械的约束,都是一条你不必再反复调的约束。
  • 用 API 字段,而不是用一段话。如果存在响应格式参数、工具 schema 或力度设置,就显式设定,而不要用散文描述那个行为。显式设置在换模型时会显形——它要么在新厂商那里存在,要么就大声报错。散文则会无声地变成「稍微不同的意思」。
  • 把少样本示例当数据存。内嵌在散文提示词里的示例无法按模型重新挑选,放在文件里的可以;而对一个较弱的模型来说,合适的示例比对强模型要更多、更直白。参见少样本提示。

然后挑一张支持矩阵,并且让它保持诚实:两个你真的会去测的模型,而不是「任意模型」。一份确实在两个差异明显的模型上跑过的提示词,远比一份「为通用而写、只在一个模型上跑过」的提示词更可移植——因为第二个模型正是那个会揪出「这些条款压根不是意图」的东西。

STEP 4

换模型的放行闸是一次评测运行,不是一次代码评审。

这是实践上的后果,也是大多数团队跳过的那一步。一次换模型产生一行 diff,三十秒就过了评审,却改变了每一个请求的行为。唯一与这种形状相匹配的管控,是把任务集用旧模型和新模型并排重跑一遍——把智能体评测当作发布闸,而不是当作一项研究活动。

要比的不止是头条通过率,因为真正伤人的回归都不在均值里。

  • 格式合法率与工具调用合法率——最先变动的一项,也是在「外壳遇到解析失败就重试」时最容易漏掉的一项。重试率无声地涨了 3%,是一次披着成功率外衣的成本与延迟回归。
  • 拒答与弃答率——模型把边界划在哪里是产品的一部分,而它会在模型之间、以及同一模型的不同档位之间移动。参见拒答与能力门控。
  • 每完成任务的步数与成本——一个分数相同但多花 40% 步数的模型,在同样准确率下是更差的部署。按令牌单价回答不了这里的任何一个问题;参见智能体成本控制。
  • 看长尾,别看均值。去看 p95 步数和失败模式的分布,而不只是多少次运行通过了。失败模式变了而通过率没变,一样会让你的运维手册失效。

还要把「强迫你换模型的部署变更」当成同一类事件。当一套智能体平台搬到本地或搬进气隙网络时,那里可用的模型档位通常不是你当初据以构建的那一档——IBM 在 2026 年 10 月 1 日正式可用的自托管版 Bob,保留了外壳(它的 shell、并行工具调用、技能、模式),而能在气隙之内运行的模型是 NVIDIA Nemotron 与 Poolside Laguna,而非托管版的 Claude、Gemini 与 GPT 选项。外壳迁移过去了;提示词得重新挣回来。

在你下一次模型迁移之前做这件事:给系统提示词里的每一条条款加上注释,写明它当初是为哪次失败而加的,然后删掉那些你说不出、也复现不了其失败的条款。在多数成熟的提示词上,这会删掉四分之一的文本而质量没有可测的变化——剩下的那份,才是你真能移植的提示词,因为你现在知道哪些行讲的是任务,哪些行讲的是一个你早就不再运行的模型。

延伸阅读:系统提示词与用户提示词讲各层该放在哪里,智能体外壳讲提示词与模型之间夹着什么,模型弃用与迁移讲如何在生产中执行这次替换。