返回文章列表

五个经得起迭代的 Prompt 模式(和三个应该扔掉的)

大部分 Prompt 技巧在模型升级后会失效。这篇只讲那些我用了两年、跨了四代模型仍然有效的模式——它们的共同点是约束结构而非利用漏洞。

4 分钟阅读1138

先说个让人沮丧的事实:我 2024 年收集的一半 Prompt 技巧,现在已经没用了。

"让我一步步思考"在推理模型上反而降低质量;角色扮演带来的提升在新模型上几乎消失;那些精心设计的分隔符技巧,模型早就不需要了。

但有几个模式活了下来。它们的共同点是:不依赖模型的具体行为,而是约束输出的结构。

经得起迭代的五个模式

1. 先给结论,再给理由

这是投入产出比最高的一个改动,且适用于几乎所有模型。

❌ 请分析这个方案的可行性,然后告诉我你的结论。
 
✅ 先给出一句话结论(可行 / 不可行 / 需要更多信息),
   再用不超过五条理由支撑这个结论。

区别在于:第一种写法下,模型会边推理边组织语言,容易在推理过程中自我动摇。第二种写法强制它先形成判断,理由是后补的支撑。

副作用也很有价值——结论前置让你能快速判断要不要读下去。长回答里,这个信息密度差异很明显。

2. 显式声明不确定性

模型的默认倾向是"给一个答案",而不是"说不知道"。这个倾向需要主动对抗。

对于你没有把握的判断,必须明确标注 [不确定] 并说明缺什么信息。
编造一个看似合理的答案,比说"我不知道"严重得多。

第二句话不是废话。它给"承认不知道"提供了合法性——模型需要知道这个选项是被允许的,甚至是被鼓励的

实测下来,加上这段后,幻觉率明显下降,但代价是"我不知道"的出现频率上升。这个交易是否划算取决于场景:客服场景未必划算,医疗、法律场景一定划算。

3. 结构化输出优于格式说明

不要描述格式,直接给 schema。

❌ 请用 JSON 格式输出,包含标题、摘要和标签。
 
✅ 严格输出如下 JSON,不要包裹在代码块中,不要添加任何解释:
 
{
  "title": string,
  "summary": string,
  "tags": string[],
  "confidence": number  // 0-1,你对自己判断的确信程度
}

confidence 字段是我后来加的,效果意外地好。它不只是给你一个参考值——要求模型自评置信度,本身会让它更谨慎。这是个免费的幻觉抑制器。

4. 少样本示例 + 反例对照

给示例大家都知道,但只给正例其实浪费了一半的价值。

## 好的输出
用户问"怎么退款" → 直接给出退款入口路径和预计到账时间
 
## 差的输出
用户问"怎么退款" → 先解释公司的退款政策背景,再讲退款流程的
设计初衷,最后才提到操作路径

反例的作用不是"告诉模型不要做什么",而是标定粒度。长度、详略、切入角度——这些抽象要求用正例说不清,用反例一对比就明白了。

5. 把任务拆成有中间产物的阶段

复杂任务一次性输出,质量通常低于分步输出。

分三步完成,每步输出后我会确认再继续:
 
步骤 1:列出需求中所有的显式约束和隐含约束
步骤 2:针对每条约束,说明当前方案如何满足(或说明为何冲突)
步骤 3:基于前两步,输出最终方案

关键在步骤 1 和 2 的中间产物是可验证的。你能立刻看出约束有没有遗漏,而不是等到最终方案才发现问题。

这个模式的变体是多轮对话:把长任务拆成多轮,每轮聚焦一个子问题。代价是交互成本,收益是可控性。

应该扔掉的三个技巧

❌ 角色扮演

"你是一位资深 X,拥有 20 年经验" —— 这个技巧在早期模型上确实有效,但在当前模型上带来的提升接近噪声。

它的有效场景只剩一个:输出风格的迁移。想让回答更口语化或更学术化,指定一个角色仍有帮助。但指望它提升专业准确性,已经不现实了。

❌ 威胁与利诱

"答错了我会被解雇""答对了给你 100 美元小费" —— 这些从未真正有效过,只是早期用户的主观感受。

有研究测过,这类激励性语言带来的提升在统计上不显著,而且会让输出变得更冗长(模型倾向于"多说一些显得更努力")。

❌ 复杂的分隔符技巧

<<<>>>###、XML 标签层层包裹输入——在模型足够强之后,这些技巧的边际收益趋近于零。

现在更可靠的做法是:用结构化的输入格式(如 JSON、YAML)替代分隔符。结构本身携带信息,分隔符只是视觉噪音。

一个通用模板

把上面五个模式组合起来,这是我现在的默认起点:

<任务>
一句话说明要做什么
 
<输入>
{结构化输入,优先 JSON / 列表,而非大段文本}
 
<输出要求>
1. 先给结论,再给理由(不超过 N 条)
2. 没把握处标注 [不确定] 并说明缺什么
3. 严格按以下 schema 输出,不添加额外解释
   {schema}
 
<示例>
正例:{...}
反例:{...}(说明为什么差)
 
<边界>
只做 X,不做 Y
信息不足时明确说明,不要推测

大部分任务调这个模板的两三个字段就够用,不需要从零写。

怎么判断一个技巧还有效

最后给个可操作的方法:做 A/B 对比,且用固定的评测集。

def compare(prompt_a: str, prompt_b: str, cases: list[Case]) -> Report:
    """用同一组用例跑两个 Prompt,比较胜率而非主观感受。"""
    wins = {"a": 0, "b": 0, "tie": 0}
    for case in cases:
        out_a = run(prompt_a, case.input)
        out_b = run(prompt_b, case.input)
        winner = judge(case.expected, out_a, out_b)  # 用模型做裁判
        wins[winner] += 1
    return Report(wins, cases=len(cases))

至少需要 30 个用例才能看出稳定差异。少于这个数量,你观察到的多半是随机波动——人脑特别擅长在没有模式的地方看出模式。

如果一个技巧你只在两三个例子上验证过就深信不疑,那它大概率是运气。

标签:AI 学习

相关阅读