第一原则:写得像给同事的指令

模糊的提示得到模糊的回答:

❌ 帮我看看这段代码
✓ 你是 Python 资深开发。请审查下面代码,按"潜在 bug / 性能问题 / 可读性"三类列出问题,每条不超过 50 字。代码:

模板 1:System Prompt 三段式

你是 [角色],专长 [领域]。
你的回答规则:
- [规则 1]
- [规则 2]
- [规则 3]
不擅长的事:[范围],遇到时回答"不在我的能力范围"。

例:

system = """你是 Python 代码审查员。
回答规则:
- 总是用中文
- 先指出主要问题(最多 3 条),再说改进方向
- 代码用 ```python ``` 包起来
- 不超过 200 字
不擅长的事:除 Python 外的语言,遇到回答"不在我的能力范围"。"""

模板 2:Few-Shot(少样本)

模型不会的格式或风格 → 先给几个例子:

任务:把口语句子改成正式商业英语。

例 1:
口语:can u send me the report
正式:Could you please send me the report?

例 2:
口语:thx, looks good!
正式:Thank you, this looks good!

现在:
口语:[用户输入]
正式:

5 个例子比 50 字描述更管用。

模板 3:思维链(Chain of Thought)

让模型先思考再回答——解题准确率显著上升:

问题:[复杂问题]

请按以下步骤回答:
1. 列出已知条件
2. 分析需要解决的子问题
3. 逐步推导
4. 给出最终答案

让我们一步步来。

或更简单:

[问题]

请一步步思考,然后给出答案。

Claude 模型的"扩展思考"模式(extended thinking)是这条规则的内置版。

模板 4:结构化输出

要 JSON 用 system 限定 + 给 schema:

你必须严格按以下 JSON 格式返回,除 JSON 外不要任何其他文字:
{
  "sentiment": "positive" | "neutral" | "negative",
  "score": 0~1 浮点数,
  "keywords": ["最多 3 个关键词"]
}

OpenAI 用 response_format={"type":"json_object"},Claude 用 prefill 技巧:

messages=[
    {"role": "user", "content": "..."},
    {"role": "assistant", "content": "{"},     # 强制以 { 开始
]

返回开头会接着 { 继续——避免开头废话。

模板 5:避免 hallucination

任务:根据下面的文档回答用户问题。

规则:
- 答案必须来源于文档
- 文档里没有的信息,回答"文档中未提及"
- 引用时标注 [文档行号]

文档:
"""
[文档内容]
"""

问题:[用户问题]

RAG 系统的核心提示就是这种结构。

XML / Markdown 标签划分

Claude 特别喜欢 XML 标签:

<context>
[长文档]
</context>

<task>
请基于上面的 context 回答以下问题。
</task>

<question>
[问题]
</question>

清晰的边界让模型不会混淆。

减少废话

❌ 直接回答,不要解释。
✓ 回答应该 ≤ 30 字,不要前置废话("好的,我来帮你...")。

明确长度上限比"简洁"管用。

实战:评论分类

prompt = """你是评论分类员。给定一条电商评论,返回 JSON:
{"category": "质量"|"物流"|"价格"|"服务"|"其他",
 "sentiment": "positive"|"neutral"|"negative"}

例:
评论:东西很好,发货也快
{"category":"质量","sentiment":"positive"}

评论:包装太烂,物流慢
{"category":"物流","sentiment":"negative"}

现在:
评论:客服回复很及时
"""

# Claude API 调用
msg = client.messages.create(
    model="claude-haiku-4-5",
    max_tokens=100,
    messages=[
        {"role": "user", "content": prompt},
        {"role": "assistant", "content": "{"},     # prefill
    ],
)

调 prompt 的循环

  1. 写第一版
  2. 跑 10 个样本,看哪些不对
  3. 看错例的共同点 → 加规则 / 加例子
  4. 再跑 10 个新样本
  5. 重复

记得保留每版——用 git 管理 prompt。

别迷信 prompt

如果调了一周还不行——换个思路:

  • 任务是不是太难,要不要拆?
  • 用 RAG 给上下文?
  • 微调更靠谱?
  • 干脆换个模型?

下一篇讲 embeddings——RAG 的基础。