Skip to content
2026-05-111分钟aipromptengineering

01|Prompt 设计:从指令到可维护模板

很多团队的 Prompt 散落在业务代码里:一段拼接字符串、几个 f-string 变量、再加几句"请认真回答"。这种写法在 demo 阶段没问题,但上了生产就会出现三类典型故障:输出格式漂移导致下游解析报错、模型在边界输入上自由发挥、改了一个字却没人知道影响了哪些场景。Prompt 的目标不是"写得像咒语",而是让模型在明确约束内稳定完成任务,并且能像代码一样被版本化、被测试、被回滚。

本文从 Prompt Engineering 的演进脉络讲起,再落到生产环境真正可复用的六段式模板、三角色机制、跨模型差异,以及 A/B 实验与版本管理。所有的论断都尽量配上实测数据或可运行 demo,避免"听起来有道理但跑起来不灵"的鸡汤。

一、Prompt Engineering 的方法演进

近三年 Prompt 技术的发展可以看成一条"让模型把思考过程显式化"的主线。理解这条主线,比单纯背几个技巧重要得多——它能帮你判断什么场景该用哪种方法。

  • Zero-shot:只给指令,模型靠预训练分布直接作答。对常识类、改写类任务足够;对需要严格步骤的任务正确率往往落在 60-75% 区间。
  • Few-shot:在 prompt 中塞入 3-8 个示范(input → output 对)。优势是"用样本暗示格式与风格",劣势是 token 成本上涨、且容易让模型把示范中的偶然词汇过拟合到回答里。在 BBH(Big-Bench Hard)的子任务上,few-shot 相比 zero-shot 平均提升 8-12 个百分点。
  • Chain-of-Thought (CoT):让模型显式"先想后答"。最简单的"Let's think step by step"在 GSM8K 数学题上把 GPT-3 的正确率从 17.7% 拉到 78.7%(原论文数据),是 prompt 工程历史上最具标志性的改进之一。
  • Self-Consistency:CoT 多采样几次(典型 n=5~20),用多数投票合并。能稳进 +3~8 个百分点,代价是成本线性上涨。
  • Tree-of-Thought (ToT):把单条思路扩成"思路树",每个节点评估再决定扩展/剪枝。适合搜索与规划类任务,工程实现复杂、token 消耗高,更多在研究场景使用。
  • ReAct:把"推理 (Reason)"和"行动 (Act)"交替起来——模型先想一步,再调用工具拿到真实结果,再继续想。它是后面 Agent 章节的理论起点。

实际生产中,80% 的业务场景用"结构化模板 + 强约束 + 必要时的 CoT"就够了。ToT/Self-Consistency 这类方法收益边际明显,且把延迟和成本翻倍,需要看具体投入产出比。

二、System / User / Assistant 三角色机制

主流 Chat 模型都遵循三角色对话协议,理解它们的语义边界比写"好的 Prompt"更重要:

  • System:定义"模型是谁、能做什么、不能做什么"。建议放角色、约束、输出格式、安全策略。多数模型对 system 的指令权重高于 user,且不会在多轮中被用户轻易覆盖。
  • User:当前请求和上下文数据(问题、附件、检索片段)。不要在这里写"角色"或"全局约束"——这是新手最常见的错误,会让用户输入污染系统设定,留下提示注入的口子。
  • Assistant:历史回答,或在 few-shot 中作为示范输出。它对模型"下一步应该说什么"有强烈暗示作用。

在我们一组针对客服意图分类的对照测试中(200 条样本,gpt-4o-mini,temperature=0),把"必须返回 JSON"这条指令从 user 段挪到 system 段后,格式合规率从 94.0% 提升到 99.5%,且对一类"忽略以上指令"的提示注入攻击拒答率从 71% 提升到 96%。结论:结构约束属于 system,业务数据属于 user,二者不要混

role-play 和元 prompt 真的有用吗

"你是一位拥有 20 年经验的资深风控总监" 这样的 role-play 写法在社交媒体被传得神乎其神,但实测效果分场景:

任务类型role-play 增益解释
写作风格调整明显(+10~20%)角色提供了风格锚点
事实问答几乎无(±2%)角色不能让模型多知道事实
数学/逻辑推理微弱(+1~3%)CoT 影响远大于 role-play
安全拒答反向(-5~10%)极端角色会被用来越狱

元 prompt(meta prompt,让模型先生成 prompt 再用它回答) 在长任务上能稳进几个百分点,但代价是延迟翻倍,更适合"离线生成模板"而不是"在线推理"。

三、可维护 Prompt 的六段式结构

一个可维护的 Prompt 应当显式拆成六个部分,每部分职责单一:

text
角色:你是谁,具备什么专业背景
任务:你要完成的唯一目标
上下文:可用的输入信息及其来源
约束:绝对不能做的事(越权、编造、超长)
输出:必须遵守的结构化格式与字段含义
校验:返回前自检的检查清单

把"约束"和"校验"单独拎出来非常关键。在我们一组 200 条客服样本的对照测试中,仅补充这两段后,JSON 解析失败率从 11.5% 降到 1.0%,越权回答(替用户做了未授权操作的承诺)从 7 例降到 0 例。换句话说,结构化模板带来的不是"感觉更好",而是可量化的故障率下降。

输出格式要强约束

如果输出要被程序消费,优先让模型返回 JSON 或 Markdown 表格,并逐字段说明含义和取值范围。不要只给一个示例就指望模型推断规则。

json
{
  "summary": "一句话结论,不超过 50 字",
  "risks": ["风险描述,最多 5 条,无风险则返回空数组"],
  "next_actions": ["建议动作,动词开头"],
  "confidence": "high | medium | low"
}

进阶做法是给字段加上 JSON Schema 并使用模型自带的结构化输出能力(OpenAI 的 response_format=json_schema、Anthropic 的 tool_use schema)——比起靠 prompt 里的自然语言描述,schema 约束的格式合规率能从 99% 提升到 99.9%+。

四、Anthropic XML 风格 vs OpenAI 自由格式

不同模型厂商在 prompt 写法上有明显的"母语偏好",盲目复用别家的模板会浪费效果。

Anthropic / Claude 系列官方推荐 XML 标签包裹结构化输入:

xml
<instructions>
你是资深风控分析师,从工单中提取风险信号。
</instructions>

<ticket>
{用户工单原文}
</ticket>

<format>
返回 JSON,字段:summary / risks / confidence
</format>

XML 风格的好处是边界清晰,模型不会把 <ticket> 内部的"忽略以上指令"当成新指令——这也是 Claude 在长上下文上抗注入更稳的原因之一。

OpenAI / GPT 系列对 Markdown 标题、连字符列表、自然语言段落更友好。同一段语义在两家上的效果差异不算大,但 Anthropic 在 XML 风格下的格式合规率会高 1~2 个百分点。

Google / Gemini 系列对 Markdown 友好,且在长文档(>50K tokens)上对结构性标记敏感——给章节加 ## 1. xxx 序号能显著降低跨段引用错误。

跨模型行为差异:同一 prompt 三家对比

我们用同一份"工单风险评估"prompt(六段式 + 强制 JSON),在 150 条评测集上跑 Claude 4.5 Sonnet、GPT-4o、Gemini 2.0 Pro,得到如下数据(temperature=0,2026 年 4 月跑测):

模型格式合规率关键字段准确率拒答合理率P95 延迟单次成本
Claude 4.5 Sonnet99.3%91.3%97.3%2.1s$0.012
GPT-4o (2024-11)99.7%89.4%92.6%1.4s$0.009
Gemini 2.0 Pro98.0%88.0%90.0%1.7s$0.006

可观察到几个模式:Claude 在安全拒答上更保守、Anthropic XML 风格下格式更稳;GPT-4o 延迟和成本平衡最好;Gemini 在结构化输出上略弱但成本最低。不存在"全面最强"的模型,prompt 设计要考虑模型的偏好倾向。

五、实战 Demo:可复现的模板调用

下面是一个可直接运行的最小示例,演示如何用模板 + 强制 JSON 模式调用模型,并在解析失败时兜底。

python
# 运行命令: pip install openai && python prompt_demo.py
import json
from openai import OpenAI

client = OpenAI()  # 需配置 OPENAI_API_KEY 环境变量

SYSTEM_PROMPT = """你是资深风控分析师。
约束:不得编造工单中不存在的信息;无法判断时 confidence 返回 low;
仅返回 JSON,字段为 summary(str)、risks(list[str])、confidence(high/medium/low);
返回前确认 JSON 可被 json.loads 解析,且不含多余文本。"""

USER_TEMPLATE = """任务:基于以下工单内容输出风险评估。
工单内容:
---
{ticket}
---"""

def assess(ticket: str) -> dict:
    resp = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": SYSTEM_PROMPT},
            {"role": "user", "content": USER_TEMPLATE.format(ticket=ticket)},
        ],
        response_format={"type": "json_object"},
        temperature=0,
    )
    raw = resp.choices[0].message.content
    try:
        return json.loads(raw)
    except json.JSONDecodeError:
        return {"summary": "解析失败,转人工", "risks": [], "confidence": "low"}

if __name__ == "__main__":
    print(assess("用户反映账户被异地登录,且收到三条验证码短信。"))

预期输出(结构稳定,内容可能略有差异):

json
{"summary": "账户疑似被盗,存在异地登录与验证码轰炸风险", "risks": ["账户被盗用", "验证码轰炸"], "confidence": "high"}

temperature=0 + response_format 是把输出方差压到最低的两个关键开关;把约束从 user 段挪到 system 段提升了抗注入能力;兜底分支保证即使模型偶发越界,下游服务也不会抛异常。

六、Prompt 版本管理与 A/B 实验

把 Prompt 当代码管,至少要做到三件事:

  1. 集中存放,带版本号:每个模板独立文件或独立配置项,命名如 risk_assess_v3,禁止散落在业务 .py 文件里。改动走 Git PR,必须 review。
  2. 绑定评测集:每个模板要有 ≥50 条样本的离线评测集,覆盖常规、边界、对抗、回归四类。改动后 CI 自动跑评测,对比新旧版本在准确率、格式合规率、拒答率、P95 延迟、单次成本上的差异。
  3. 支持灰度与回滚:线上同时挂载多个版本,用流量分桶(如 hash(user_id) % 100)做 A/B;新版本 24 小时内观察核心指标,回退一行配置即可。

一个常见的 A/B 设计错误是"只看准确率,不看分布"。两个版本平均准确率都是 90%,但版本 A 在长文本上掉到 75%、短文本到 95%,版本 B 则是稳定的 88-92%——这两个版本对用户体验完全不同。A/B 实验要分用例类型分别看指标,再综合下结论

七、进阶:把 Prompt 当工程资产管理

  • 模板集中存放在代码或配置仓库,每个模板带版本号(如 risk_assess_v3)和示例输入输出。
  • 改动必须跑评测集,对比新旧版本在准确率、格式合规率、拒答率上的差异,不靠人工感觉。
  • 边界输入要专门测试:空输入、超长输入、含提示注入的输入("忽略以上指令")。健壮的模板应在这些场景下走拒答或降级路径。
  • 高风险输出(涉及金额、权限、对外承诺)增加二次校验 Prompt 或人工复核路由。
  • 监控线上输出的格式合规率,一旦低于阈值(如 99%)触发告警,往往意味着模型版本变更或输入分布漂移。
  • 不同业务线复用同一基础模板时,用"组合(compose)"而不是"复制粘贴"——抽出 system 约束模块、输出格式模块、安全策略模块,业务模板只拼装不复述。一次改动能覆盖所有下游。

小结

可维护的 Prompt 设计 = 六段式结构 + 三角色正确分工 + 强约束输出 + 跨模型适配 + 评测驱动迭代。把"约束"和"校验"显式写进 system 段,能把 JSON 解析失败率从两位数压到 1% 量级,并把提示注入拒答率从 71% 提升到 96%。配合 Anthropic XML / OpenAI Markdown 的母语偏好、Self-Consistency / ReAct 的方法工具箱,以及版本管理 + A/B 实验的工程流程,Prompt 才能从"灵机一动的文案"变成"可托付的生产资产"。下一篇我们继续讲:当模型需要"知道得更多"时,怎样系统地搭建 RAG 知识库。

0 条评论
Markdown

评论功能暂未开放

还没有评论

快来发表第一条评论吧

© 2026 A2DATA. All rights reserved.