【AI工程师精讲】31:提示词工程化:别再靠"感觉好点了"

0 阅读16分钟

调提示词的现场常常是这样:

改一版,试几个问题,觉得回答变好了;再改一版,试另几个问题,好像又变差了。

改了十几版,说不清哪一版最好,也说不清每一版具体改进了什么。

问题不在于不够努力,而在于缺少一套能给出确定答案的机制。

这篇文章给出这套机制。核心观点有点反直觉:

提示词的优化效果,主要不是靠"写出更好的措辞",而是靠"建立能判断好坏的流程"。


第一部分:先有一份能对比的样本

没有样本集,所有改动都只能靠印象。

1.1 样本集怎么建

三个来源,按价值排序:

来源内容为什么这个顺序
① 真实失败案例线上出错的、用户投诉的、人工发现不对的最有价值,因为它们代表真实分布
② 业务典型问法让业务同事提供"用户最常问的 20 个问题"覆盖高频场景
③ 边界与对抗样本空输入、超长输入、矛盾要求、试图诱导防止在极端情况下翻车

1.2 规模建议

起步 30 到 50 条就够用。

别追求一次建全 —— 重要的是每次改动都跑一遍,让它随使用逐渐丰富。

"30 到 50 条"这个量级的设计考虑:

  • 太少(如 5 条) → 噪声大,改动效果看不出来;
  • 太多(如 500 条) → 跑一次太慢,你会懒得跑,而"懒得跑"等于样本集不存在。

1.3 一个硬性要求

每条样本都要有"期望结果"。

这个期望可以不是唯一答案,但必须能判断"这次输出是否合格"(比如必须包含某要点、必须符合某格式)。

"不是唯一答案"这一点很重要 —— 因为大量真实任务(总结、改写、建议)没有唯一正确答案,而如果坚持要求唯一答案,你会建不出样本集。

可行的做法是定义"合格判据":比如"必须包含这三个要点中的一个""必须返回合法的 JSON"。

1.4 这一步的投入产出比

它把"凭感觉"变成了"有对照"。


第二部分:定义指标,而不是"感觉"

样本集有了,还需要能算出来的数。

2.1 四个指标

指标定义作用
① 任务准确率输出是否满足期望看效果
② 格式合规率输出是否符合约定的结构看效果,且直接决定下游可用性
③ token 成本提示词变长会让每次调用更贵看代价
④ 稳定性同一个输入跑多次,结果是否一致看代价

四个指标里,前两个看效果,后两个看代价。一起看,才能判断一次改动是不是"净收益"。

2.2 关于第二、四项

格式合规率"很容易被忽略,但它直接决定下游系统能不能用" —— 因为格式不对意味着解析失败,而解析失败意味着这个功能完全不可用。

稳定性是"生产里的隐患" —— 因为一个平均值很好但波动很大的系统,用户体验是"时好时坏"。

2.3 一个常见陷阱

只看准确率。

如果为了涨两个百分点,把提示词从 500 字扩到 3000 字,成本可能涨了三倍——这笔账要一起算。

这个陷阱的机制:准确率的提升是可见的(你立刻能看到"答对了"),而成本的上升是渐进的(账单下个月才出现)。


第三部分:单变量改动 + 版本管理

这是从"瞎调"变成"实验"的分水岭。

3.1 规则一:一次只改一处

如果你同时改了角色描述、输出格式和示例,结果提升了,你不知道是哪一处起作用;结果变差了,你也不知道该回退哪一处。

"不知道该回退哪一处"这个损失很大 —— 因为它意味着你可能放弃了一个本来有效的改动(只是被另一个无效改动抵消了)。

3.2 规则二:每版都记录

记录这四项:

① 版本号与时间
② 改了什么(一句话)
③ 指标变化(四个指标的前后对比)
④ 是否采纳,若不采纳则回退

3.3 规则三:保留历史版本

提示词必须能一键回到上一个好版本,和代码没有区别。

3.4 规则四:改动进代码库

不要把提示词散落在业务代码的字面量里,它应该是一个可追溯、可评审的独立资产。

"散落在字面量里"是当前最常见的状态 —— 而它导致三个问题:

  • 看不到全貌(不知道该改哪些地方);
  • 无法评审(改动不经过 review);
  • 容易不一致(训练和推理用了不同版本,这正是前面讲微调排查时那个最常见失败原因)。

3.5 做完这四条

你的调优过程就变成了一条可回溯的实验记录。这比任何"提示词技巧"都更能提升长期效率。


第四部分:四个真正有效的技巧

技巧不少,但下面这四个是有机制支撑、跨模型普遍成立的。

4.1 技巧一:用正面指令,而不是禁令

与其写"不要输出多余的解释",不如写"只输出一个 JSON 对象"。

原理:

模型按你给出的形态生成,你描述"要什么"比"不要什么"提供了更明确的目标。禁令往往只删掉了一部分,而正面指令直接约束了输出空间。

"禁令只删掉一部分"这个观察很关键 —— 因为**"不要输出解释"并没有告诉模型"该输出什么",它可能输出别的东西**(比如换个形式的解释)。

4.2 技巧二:给示例,常常比描述更有效

对于格式与风格类要求,一到三个真实示例的效果,往往超过三段文字描述。

原理:

示例同时传达了格式、语气、长度、粒度——这些信息很难用描述穷尽。

"很难用描述穷尽"是核心 —— 因为这些是"看起来就知道对不对"的属性,而用语言描述它们既啰嗦又不完整。

这也是为什么"few-shot"在实践中如此有效。

4.3 技巧三:把复杂任务拆成多步

一条又长又复杂的指令,不如拆成两三次独立的调用(先抽取、再判断、再生成)。

原理:

每一步的任务更单一,模型的判断空间更小、更容易做对;而且中间结果可检查、可调试。

"可检查、可调试"这个附加价值很实际 —— 因为单次调用失败时,你无法知道是哪一步错了。

4.4 技巧四:明确输出结构

如果能用结构化格式(如 JSON、固定模板),就明确指定字段与取值。

原理:

它把"自由生成"变成"填空",大幅降低格式漂移,也让下游系统能直接解析。

4.5 注意这四个技巧都有边界

技巧代价
拆解增加调用次数与延迟
结构化输出限制表达自由度
给示例占用上下文预算
正面指令需要你想清楚"到底要什么"

按场景取舍,别一刀切。

最后一条容易被忽略 —— 因为**"想清楚要什么"本身是有成本的**,而有时候模糊的指令反而更省事(只是效果不稳定)。


第五部分:五个反模式

这些做法很常见,但往往收益极小甚至有害。

5.1 反模式一:堆砌"魔法句式"

比如"你是世界顶级的专家,请极其认真地思考这个问题"。

这类话术的边际效果通常很小,而且会占用上下文预算。

更有效的替代:明确任务目标、约束条件、输出格式,并给出示例。

为什么"魔法句式"效果小? 因为现代模型已经经过了指令微调 —— 它默认就会尽力完成任务,不需要你"求它"。

5.2 反模式二:一条提示词改全局

系统提示被多个功能共用,改一处影响全部场景。

某个场景变好了,另一个场景崩了。

更有效的替代:分层管理 —— 通用部分(角色、全局约束)与场景部分(具体任务)分开,按需组合。

5.3 反模式三:系统提示越来越长

每次遇到问题就往上加一句,半年后变成三千字。

结果是关键约束被淹没,模型注意力被稀释。

更有效的替代:

定期做一次精简,把能移到流程里(代码校验、结构化输出)的约束移出去,只留下真正需要模型判断的内容。

"移到流程里"这个动作很关键 —— 因为用代码能保证的事,不该交给提示词去"请求"。

5.4 反模式四:改动没有记录

三周后你发现效果变差了,但不知道中间改了什么。

更有效的替代:提示词纳入版本管理,改动留痕。

5.5 反模式五:只在几个"顺手想到"的问题上验证

这等于在做一个有偏的测试集。你会优化"你记得的那几个问题",而不是"真实分布的多数问题"。

更有效的替代:用固定的样本集,并且持续从线上失败里补充新样本。


第六部分:把它做成一条流水线

把前面所有内容串起来,形成日常流程。

6.1 六个步骤

① 改提示词(一次改一处)
② 自动跑样本集(输出四个指标)
③ 与基线对比(关注是否"净收益"——效果与成本一起看)
④ 通过则合入并记录版本;不通过则回退
⑤ 定期从线上失败案例补充样本
⑥ 定期精简(防止提示词膨胀)

6.2 这条流水线的价值

它把提示词优化从"手艺"变成了"流程"。

流程可以交给多人执行、可以持续积累、不会因为人员变动而丢失经验。

"不会因为人员变动而丢失经验"这一点值得强调 —— 因为在手艺模式下,提示词的调优经验完全存在于某个人的脑子里,而这个人一旦离开,团队就回到起点。


第七部分:什么时候该停止调提示词

最后给一个止损判断,避免无止境打磨。

7.1 四个停止信号

信号一:改动收益持续低于噪声。

连续几版改动都在指标波动范围内,说明提示词已经不是瓶颈。

信号二:失败集中在一类问题上。

比如总是差某个字段、总是漏某个约束 —— 这更适合用代码校验或结构化输出解决,而不是继续加文字。

信号三:正确信息根本不在上下文里。

那是检索或上下文工程的问题,提示词救不了。

信号四:模型能力确实不够。

换成更强的模型、或换任务拆解方式。

7.2 一个判断

这四条出现任意一条,就该把精力转到别处。知道什么时候停,比知道怎么改更重要。

"知道什么时候停比知道怎么改更重要"这句话值得记住 —— 因为无限打磨提示词是团队最容易陷入的时间黑洞。


常见误区

误区一:"提示词是文案工作,不需要工程规范。"

它直接决定线上效果、成本与稳定性,应当按工程资产来管理。

误区二:"多试几版总能试出好的。"

没有对照与记录,多试只是产生更多无法归因的版本。

这句"产生更多无法归因的版本"很准确 —— 因为问题不是"版本多",而是"无法知道哪个好、为什么好"。

误区三:"提示词越长越全面越好。"

过长会稀释重点、抬高成本,而且让后续改动难以归因。

"让后续改动难以归因"这一点容易被忽略 —— 因为系统提示越长,你在改一处时更可能无意中影响另一处。

误区四:"A/B 测试太麻烦,看几个例子就行。"

用几个例子判断,等于在优化"你恰好想到的那几个场景"。

误区五:"提示词写得好就不需要其他手段了。"

提示词有它的能力边界。

问题类型提示词能解决吗
表达不清能
缺知识不能(要检索)
格式不稳部分能(结构化输出更可靠)
推理能力不足不能(要换模型或拆任务)

这条误区与前面讲"微调/RAG/提示词怎么选"时是同一个道理 —— 先诊断缺哪一层,再选工具。

误区六:"提示词优化是一次性的工作。"

它是持续的过程。

原因:

  • 模型会升级(新模型对提示词的响应可能不同);
  • 业务会变化(新的场景、新的约束);
  • 线上会暴露新的失败模式。

所以"定期复核"应该是流程的一部分 —— 而不是"上线后就锁死"。


实战问答

Q1:面试问"你怎么优化提示词",怎么答得像有工程经验?

A:给流程而不是技巧。

① 先建样本集(含真实失败案例与边界样本)
② 定义四项指标(准确率、格式合规率、成本、稳定性)
③ 一次只改一处并记录版本
④ 通过则合入、不通过则回退

最后补一句判断:

"当收益进入噪声区间、或失败集中在某一类可规则化的问题上,就该停手,转向结构化输出或代码校验。"

最后这句是加分项 —— 它说明你知道"何时不该继续",而这恰恰是工程判断力的体现。


Q2:我们团队的提示词散在各个服务里,怎么治理?

A:分三步。

步骤做法
① 集中集中到一个可版本管理的位置(而不是硬编码在业务代码中)
② 分层通用角色与约束、场景任务、输出格式分开
③ 加流水线改动自动跑样本集

第二步收益最大,因为它解决了"改一处崩一片"。

为什么"分层"收益最大? 因为它直接消除了最常见的破坏性改动(改全局约束影响所有场景)。


Q3:加了 few-shot 示例之后效果反而变差,为什么?

A:三个常见原因。

原因机制
① 示例格式不一致互相矛盾,模型学出"平均版"
② 示例太长吃掉预算挤压了真正的任务信息
③ 示例过于贴近某个场景导致模型过度拟合那个场景

建议示例控制在 1 到 3 个,且格式严格统一。

第一条最常见 —— 而它的表现往往是"输出风格变得不稳定",而不是"完全不对"。


Q4:提示词要不要写得很"礼貌"?

A:不必。模型不会因为你多说"请"而更努力。

把字数花在明确任务、约束、格式和示例上,回报高得多。

这个建议的依据是"token 是有限资源" —— 每一个字都在占用上下文预算,所以应该用在能产生差异的地方。


Q5:怎么说服团队"提示词要版本管理"?

A:用一个具体的事故场景来沟通。

"三周前我们的效果还不错,现在变差了。
 谁能告诉我中间改了什么?"

→ 如果答案是"不知道",那就是一个必须解决的问题。

然后给一个低成本方案:

"我们不需要一套复杂的系统。先做一件事:把提示词从业务代码里挪出来,放在一个独立文件里,改动时写一行备注。成本几乎为零。"

这个方案的好处是"门槛低" —— 而完整的版本管理流程可以在习惯养成后再补充。


Q6:怎么判断一次改动是不是"净收益"?

A:看四项指标的组合变化。

情况判断
准确率涨、格式合规率涨、成本不变明显净收益
准确率涨 2%、成本涨 3 倍需要讨论(看这个场景值不值)
准确率涨、但稳定性下降谨慎(生产环境可能不可接受)
准确率不变、成本下降净收益(这类改动经常被忽略)

最后一行值得注意:"简化提示词但不损失效果"也是一种净收益 —— 而它经常被忽略,因为大家习惯只关注"效果提升"。

一个实用原则:优先做"降低成本或提升稳定性、且不损失效果"的改动 —— 它们没有风险。


Q7:样本集要不要包含"模型现在答得很好"的用例?

A:要,但比例要控制。

两类样本的作用不同:

类型作用
失败/困难样本推动改进(它们指出了问题)
正常样本防止回归(它们保证你没改坏别的)

建议比例大致是 7:3 或 6:4(失败样本略多)。

如果全是失败样本,你会看不到回归(某些改动可能让原先好的用例变差);如果全是正常样本,你没有改进方向。


术语表

术语含义
样本集用于评估提示词效果的一组带期望结果的用例
单变量改动一次只修改一处,以便归因
格式合规率输出符合约定结构的比例,直接决定下游可用性
提示词分层把通用约束与场景任务分开管理,避免互相影响
提示词膨胀系统提示因不断追加而变长,导致重点被稀释
净收益效果提升抵消成本与稳定性代价后的综合判断

结语

把这篇压缩成三句话:

第一,提示词是代码:要有样本集、要有指标、要单变量改动、要版本记录、要能回滚。

一旦把它当工程资产管理,"改来改去没方向"的困境会自动消失大半。

第二,真正的技巧只有四个:

正面指令(要什么,而非不要什么)
给示例(1~3 个,格式统一)
拆任务(每次判断空间更小)
定结构(把自由生成变成填空)

第三,最重要的能力是知道什么时候停止调整。

当收益进入噪声区间、或失败集中在"可规则化"的问题上,就该把问题交给结构化输出、代码校验或检索。

而如果只允许带走一个动作,那就是:把提示词从业务代码里挪出来,放进一个独立的、有版本记录的文件。 因为它成本极低,却是所有后续治理工作的前提。