四个构件:角色、任务、约束、输出格式
把提示词拆成四块,比堆形容词有效。OpenAI 建议 语气与身份放 system,具体任务与材料放 user。Anthropic 建议 直接说要做什么,不要指望模型从暗示里猜。
1. 角色(Role)
角色回答:以什么专业身份、对谁说话、成功长什么样。空角色(「有帮助的助手」)几乎不加信息。有用的角色带上 读者 和 标准:
角色不是人设游戏。过长的「你是拥有 20 年经验的…」通常浪费 token。一句职能 + 读者 + 质量条就够。
2. 任务(Task)
任务必须是 动词 + 对象 + 完成定义。把「帮我看看」改成可勾选的交付物:
把 真正要做的那一步 放在靠前的位置。长文末尾才出现「请只输出 JSON」,模型更容易先按散文习惯写。
一次只交一件主任务。需要「先抽取再改写」时,写成编号步骤,或拆成两次调用(见 Few-shot 与 结构化输出)。
3. 约束(Constraints)
约束是 负面空间:范围、禁区、资源、语气。没有约束,模型会补全它训练里最常见的那类回答。
常见约束类型:
- 范围: 只改
src/auth/;不要动migrations/ - 证据: 只能根据
<doc>里的原文;原文没有就说不知道 - 安全与合规: 不要编造法律结论;不要输出密钥
- 风格: 用「你」;不要营销套话;中文用书面语
- 预算: 最多 8 条子弹;代码块不超过 40 行
约束要可检查。「写得好一点」无法验收;「禁止使用『赋能』『闭环』」可以。
4. 输出格式(Output format)
格式是给 下一个读者 的:人、另一个模型、或解析器。人读可以用 Markdown 标题;程序读要用 JSON / schema(下一章 结构化输出)。
把格式写到 指令末尾或单独一节,并用示例钉死(Few-shot)。若格式与任务打架(「详细分析」+「只回一个词」),模型会随机牺牲一边——这是 陷阱 里的典型病。
一次改写
之前:
之后:
四块不必每次都写成标签,但你心里要能指出来缺了哪一块。聊天探索可以短;进规则、进 Dify 节点、进 system_prompt 时,四块写全。
清单
写完问自己:
- 读者是谁?失败时模型该承认无知还是继续猜?
- 交付物能否用一句话验收?
- 有没有明确的「不要」?
- 下一位消费者(人或代码)能否不靠猜来解析?