# M1.2 提示词进阶

> 目标：用 Few-shot、思维链、自我校正、结构化输出，让结果更稳定可靠。

## 1. 少样本（Few-shot）：给例子让模型照着做

当任务有"特定格式或风格"时，给 1–3 个例子比写一大段规则更管用。

```python
prompt = """
请把用户的话改写成"礼貌拒绝"的回复。

例1：
用户：你们能开发票吗？
回复：抱歉，本店暂不支持开具发票，感谢理解。

例2：
用户：能便宜点吗？
回复：价格已是成本价啦，确实没法再低，还请见谅。

现在改写：
用户：能把课程录屏发我吗？
"""
# 模型会"模仿"例子的语气和结构，而不是自由发挥
```

## 2. 思维链（CoT）：让模型"一步步想"

复杂问题直接要答案容易错，让它先推理再给结论。

```python
prompt = """
请解答下面应用题，并展示推理过程。

题目：仓库有 120 件商品，第一天卖出 1/3，第二天卖出剩下的 1/4，
第三天又进货 50 件，最后剩多少？

请用以下格式：
步骤1：...
步骤2：...
最终答案：...
"""
```

**进阶**：加一句"如果某一步不确定，请明确说明"，能显著降低瞎编。

## 3. 自我校正：让模型检查自己的答案

```python
# 两步法：先答，再让它当"审稿人"
answer = llm(f"问题：{q}\n请给出解答：")
review = llm(f"下面这个解答有错误吗？请指出并修正：\n{answer}")
```

适合：数学、代码、事实性内容。实战里常把"生成 + 校验"串成一个流水线。

## 4. 结构化输出：要求返回 JSON / 表格

模型默认输出自由文本，你要程序化处理就得要 JSON。

```python
import json

prompt = """
从简历文本中抽取信息，只返回 JSON，不要多余文字：
{
  "name": "",
  "years_of_exp": 0,
  "skills": []
}
简历：{resume_text}
"""
raw = llm(prompt)
data = json.loads(raw)   # 拿到结构化数据，方便入库/展示
```

**踩坑**：模型偶尔会夹带 ```json 标记。用这招兜底：

```python
import re
m = re.search(r"\{.*\}", raw, re.S)   # 贪婪匹配第一个 { 到最后一个 }
data = json.loads(m.group(0)) if m else None
```

## 动手练习

1. 用 Few-shot 写一段"把顾客差评改写成内部工单"的提示词（给 2 个例子）。
2. 用 CoT 让模型解一道你工作里的真实计算题，看推理是否可信。
3. 用"结构化输出"把一段会议纪要抽成 JSON（含 待办 / 负责人 / 截止日）。

## 自测

1. Few-shot 适合什么场景？什么时候反而该少给例子？
2. CoT 为什么能提升复杂题准确率？它的代价是什么（慢/贵）？
3. 为什么要求 JSON 输出时，最好加一段"容错解析"代码？
