模块3:用示例教会 AI

难度:⭐⭐⭐ 中级 | 建议时长:3-4小时

目标:掌握少样本提示、角色设定和系统提示词,学会给 AI 更丰富的上下文


3.1 少样本提示:先做示范,再让 AI 干活

教新员工的方式

你不会只对新来的实习生说”把报表做好”就不管了。你会拿一份做好的报表说”照这个格式做”。

少样本提示就是这个逻辑:先给 AI 几个例子,让它”学会”你要的模式,再让它处理新任务。

基本格式

这是一个[任务描述]的任务。以下是一些例子:

输入:[示例输入1]
输出:[示例输出1]

输入:[示例输入2]
输出:[示例输出2]

现在请处理:
输入:[实际输入]
输出:

实战案例

案例1:情感分类

判断以下评论的情感倾向。

评论:"这个手机拍照效果太棒了,完全超出预期!"
情感:正面

评论:"等了两周才发货,包装还破了,太失望了"
情感:负面

评论:"手机收到了,外观一般,还没仔细用"
情感:中性

评论:"价格贵了点,但续航真的很给力,值了"
情感:

→ AI 根据前面的模式判断为”正面”

案例2:统一输出格式

将产品信息转换为营销文案。

产品:无线蓝牙耳机 | 续航30小时 | 降噪
文案:告别嘈杂,拥抱纯净音质。30小时超长续航,让好音乐陪你一整天。

产品:保温杯 | 316不锈钢 | 24小时保温
文案:清晨的热咖啡,午后依然温暖。316医用级不锈钢,24小时锁住温度。

产品:机械键盘 | 青轴 | RGB背光 | 全键无冲
文案:

→ AI 会模仿前面的风格和长度来写

少样本的黄金法则

1. 数量:2-5 个示例最佳
   太少 → AI 可能没学到模式
   太多 → 浪费 Token,可能引入噪声

2. 质量 > 数量
   3 个高质量示例 优于 10 个粗糙示例

3. 示例要有代表性
   覆盖不同情况(正面/负面/中性都要有)

4. 格式要统一
   每个示例的输入输出格式必须前后一致

5. 顺序有讲究
   把最相关的示例放在最后(靠近实际输入的位置)

什么时候用少样本?

场景推荐原因
特殊的输出格式强烈推荐示例比文字描述更清楚
分类/打标签强烈推荐让 AI 理解你的分类标准
风格模仿强烈推荐示例是传递风格的最佳方式
简单问答没必要零样本就够了
开放式创作看情况可能限制创造力

3.2 角色提示:给 AI 一个身份

穿白大褂和穿厨师服的区别

同一个人,穿上白大褂你问他”这个东西能吃吗”,他会从卫生安全角度回答;穿上厨师服你问同样的话,他会从烹饪角度回答。

给 AI 一个角色,就像给它”穿上制服”——它会从那个专业视角来思考和回答。

基本语法

你是一位[角色],具有[特点/经验]。
你的任务是[要做的事]。

同一问题,不同角色 → 不同回答

问题: “公司要不要采用微服务架构?“

【角色:技术总监】
你是一位有15年经验的技术总监,擅长架构决策。
→ 侧重技术可行性、团队能力、系统复杂度

【角色:CFO】
你是一位上市公司的CFO,关注投资回报率。
→ 侧重成本、ROI、人力投入、财务风险

【角色:一线开发者】
你是一位3年经验的后端开发者,正在维护一个单体应用。
→ 侧重开发体验、学习成本、日常痛点

高效角色设定模板

# 角色设定
你是[角色名称],[一句话描述背景]。

# 核心能力
- [能力1]
- [能力2]
- [能力3]

# 沟通风格
- [风格特点,如:专业但通俗、严谨、幽默...]

# 工作原则
- [原则1,如:始终以数据为依据]
- [原则2,如:先给结论再展开分析]

三个常见误区

❌ 误区1:角色太虚
   "你是一个很厉害的专家"  → 什么专家?哪方面厉害?
   ✅ "你是一位专注 React 生态的前端架构师,有5年大型项目经验"

❌ 误区2:角色和任务不匹配
   "你是一位诗人,请分析这段代码的 Bug"
   ✅ 角色的专业领域要和任务对齐

❌ 误区3:同时扮演多个角色
   "你同时是设计师、产品经理和程序员"
   ✅ 一次一个角色。如需多视角,分多次对话

原理:先定义角色 = 在 prompt 开头收窄问题域

为什么”先说你是什么角色”这个小动作效果这么好?两个原因,第一个表层、第二个底层:

表层原因:角色定义把问题域收窄,二义性下降

没角色:"这个东西能吃吗?"        ← AI 不知道你想从什么角度评判(卫生?营养?文化?)
有角色:"你是营养师。这个东西能吃吗?"  ← 问题域被锁定到「营养角度」,回答自然聚焦

收窄问题域 = 减少模型在生成时的”分支选择”,输出更稳定、更专业。

底层原因:模型对 prompt 开头位置最敏感(Lost in the Middle)

模型对 prompt 不同位置的关注度并不均匀——开头和结尾最敏感,中间最容易被”看漏”。这是 Stanford 论文 Lost in the Middle 实验证明的现象。

prompt 结构:[开头] ........ [中间] ........ [结尾]
          ↑高敏感         ↑低敏感        ↑高敏感

把”角色定义”放在 prompt 最开头,相当于在模型注意力最集中的位置打下”问题域锚点”,整段 prompt 之后的内容都会被这个锚点引导。

💡 延伸:这条规律不只对角色提示有效。任何关键约束(输出格式、禁止事项、领域限定)都该往开头/结尾靠,别埋在中间。

详见 01_AI对话的底层逻辑.md § 1.7 大模型对”位置”的敏感


3.3 系统提示词:给 AI 定规矩

公司的《员工手册》

新员工入职第一天会收到一本员工手册——不是每次开会都念,但所有人都得照着做。系统提示词就是 AI 的”员工手册”,定义它在整个对话中的行为基线。

API 中的三种消息类型

如果你通过 API 调用 AI,会遇到三种消息角色:

system(系统消息)→ 公司规章制度(AI 始终遵守的规则)
user(用户消息)  → 客户的需求(你每次发的内容)
assistant(助手消息)→ 员工之前的回复记录

类比理解:
system = 入职培训手册:"你是XX公司客服,说话要礼貌..."
user = 客户来电:"我想退货"
assistant = 你之前的回复记录:"好的,请提供订单号..."

日常聊天用户:你在 ChatGPT/Claude 网页上对话时, 第一条消息里的”角色设定”就相当于简易版的 system 消息。

系统提示词的五层结构

┌──────────────────────────────────────┐
│         系统提示词的层次结构          │
│                                      │
│  1. 身份定义 ─── 你是谁              │
│  2. 能力边界 ─── 你能做什么/不能做什么 │
│  3. 行为准则 ─── 怎么做              │
│  4. 输出规范 ─── 输出格式和风格       │
│  5. 交互规则 ─── 如何与用户互动       │
└──────────────────────────────────────┘

完整示例:编程学习助手”小智”

# 身份
你是"小智",一位友好的编程学习助手,
专门帮助编程零基础的成年学习者入门 Python。

# 能力
- 精通 Python 基础语法和常用库
- 擅长用生活中的例子解释编程概念
- 能根据学习者的水平调整讲解深度

# 行为准则
1. 始终保持耐心和鼓励的态度
2. 每个概念先用"生活比喻"解释,再给代码示例
3. 代码示例必须附带逐行注释
4. 超出 Python 基础范畴的问题,诚实说明并建议学习路径
5. 不要一次给太多信息,让学习者消化后再继续

# 输出规范
- 每次回复控制在 300 字以内(代码除外)
- 使用中文,技术术语附带英文原文
- 代码使用 markdown 代码块
- 重要概念用**加粗**标注

# 交互规则
- 每次讲解后给一个小练习
- 如果学习者说"不懂",换一种方式重新解释
- 定期确认:"你理解了吗?有什么疑问?"

深入理解三种消息角色

上面用”员工手册/客户来电/回复记录”做了类比,这里展开讲清楚每个角色的真实含义和使用细节。

三种角色一览

角色谁在说话类比核心作用
system开发者/设计者公司规章制度定义 AI 的身份、能力边界、行为准则
user终端用户客户来电提出具体需求和问题
assistantAI 自己员工之前的回复记录 AI 的历史回答,维持对话连贯

API 调用的真实结构

当你通过代码调用 AI 时,发送的是一个消息列表

messages = [
    {"role": "system", "content": "你是一位资深Python工程师..."},
    {"role": "user", "content": "帮我写一个快速排序"},
    {"role": "assistant", "content": "好的,这是快速排序的实现..."},
    {"role": "user", "content": "能加上注释吗?"}
]

AI 看到的不是”一段对话”,而是这个结构化的消息列表。它根据每条消息的 role 标签来理解”谁说了什么”。

每种角色的特点

system(系统消息)

  • 优先级最高:当 user 消息和 system 消息冲突时,AI 倾向于遵守 system
  • 全局生效:不管对话进行到第几轮,system 的规则始终有效
  • 用户不可见:在产品界面中,system 消息通常对终端用户隐藏
  • 典型内容:身份设定、输出格式要求、安全限制、行为边界

user(用户消息)

  • 每一轮对话的输入:你发的每条消息都是一条 user 消息
  • 可以包含任何内容:问题、指令、数据、反馈、追问
  • 是 AI 回复的直接触发器

assistant(助手消息)

  • AI 的历史回复:每次 AI 回答后,这条回答会被记录为 assistant 消息
  • 维持记忆:AI 通过回看 assistant 消息来”记住”自己之前说了什么
  • 可以人为构造:开发者可以手动插入一条 assistant 消息,让 AI 以为自己之前说过某句话(这就是 prefill 技巧,下面详讲)

关于”固定”和”灵活”

一个常见疑问:这三种角色是写死的吗?

固定的部分:
- 角色名称只有三种:system、user、assistant(不能自创新角色)
- 每条消息必须标注其中一种角色

灵活的部分:
- 每种角色的内容完全自由,你想写什么都行
- 消息数量不限:可以有多条 system、多条 user
- 顺序基本自由:通常 system 在最前面,但 user 和 assistant 可以交替多轮
- 多轮对话的"记忆"本质上就是把历史消息全部重新发送一遍

换句话说:AI 没有真正的”记忆”。每次你发新消息时,客户端会把之前所有的 system + user + assistant 消息打包重新发给 AI。AI 每次都是”从头读完整段对话”再回复。


Prefill 技巧:替 AI 开个头

什么是 Prefill

Prefill(预填充)是指在发送请求时,人为构造一条未完成的 assistant 消息,让 AI 从你指定的开头继续写下去。

messages = [
    {"role": "system", "content": "你是翻译助手"},
    {"role": "user", "content": "翻译:今天天气真好"},
    {"role": "assistant", "content": "The weather"}  # ← 预填充:替AI开了个头
]

AI 收到后会认为自己已经写了 “The weather”,然后接着往下写,比如补全为 “The weather is really nice today.”

为什么有效

AI 的工作方式是”续写”——给它前文,它生成后文。Prefill 利用了这个机制:你把 assistant 的开头写好,AI 就会顺着你的开头继续,而不是自己重新组织开头。

四种典型用法

用法1:强制输出格式

# 不用 prefill → AI 可能先寒暄再给 JSON
{"role": "user", "content": "列出三种水果及其颜色,用JSON格式"}
 
# 用 prefill → AI 直接输出 JSON,不废话
{"role": "user", "content": "列出三种水果及其颜色,用JSON格式"},
{"role": "assistant", "content": "```json\n{"}

用法2:控制回复语言

# 用户用中文提问,但你想让 AI 用英文回答
{"role": "user", "content": "解释什么是递归"},
{"role": "assistant", "content": "Recursion is"}

AI 看到自己”已经开始用英文回答了”,就会继续用英文。

用法3:跳过客套话

# 不用 prefill → "好的!我来帮你分析这个问题。首先..."
# 用 prefill → 直接进入正题
{"role": "user", "content": "分析这段代码的性能瓶颈"},
{"role": "assistant", "content": "性能瓶颈分析:\n1."}

用法4:引导推理方向

{"role": "user", "content": "这个 Bug 的原因是什么?[代码片段]"},
{"role": "assistant", "content": "让我从内存管理的角度分析:"}

AI 会顺着”内存管理”这个方向深入分析,而不是泛泛而谈。

使用注意

1. 不是所有 API 都支持:OpenAI 和 Anthropic 的 API 支持 prefill,
   但网页聊天界面通常不支持(因为你只能发 user 消息)

2. 开头要自然:prefill 的内容要像 AI 真的会这么开头,
   否则 AI 可能会"纠正"你的开头

3. 不要太长:prefill 只需要几个词到一句话,
   写太多反而限制了 AI 的发挥空间

4. 配合 system 使用效果更好:
   system 定义"怎么做",prefill 定义"从哪开始"

日常聊天中的”穷人版 Prefill”

如果你用的是网页聊天界面(没有 API),可以用这种方式模拟 prefill 效果:

请直接以"## 分析结论"开头回答,不要任何开场白。

或者:

请用以下格式开头你的回答:
"根据代码分析,问题出在..."

虽然不如真正的 prefill 精确,但能达到类似的”跳过废话、直奔主题”的效果。


3.4 上下文控制:让 AI 站在对的位置看问题

同一个问题,不同上下文 = 不同答案

问题:"苹果怎么样?"

上下文A(水果店)→ "这批苹果很新鲜,甜度高..."
上下文B(科技圈)→ "苹果公司最近发布了..."
上下文C(健身饮食)→ "苹果富含膳食纤维,适合减脂期..."

四种设置上下文的方法

方法1:开头声明背景

"我是一名刚入职3个月的产品经理,
正在准备第一次独立负责的项目立项报告。请帮我..."

方法2:定义受众

"用一个8岁小朋友能理解的方式解释..."
"假设读者是有3年经验的 Java 开发者..."

方法3:限定范围

"仅从中国市场的角度分析..."
"只考虑 2024 年以后的数据..."

方法4:提供参考材料

"基于以下信息回答问题:
[粘贴相关文档/数据]

问题:..."

上下文太长怎么办?

内容超出窗口限制时的三种策略:

1. 分批喂:把长文档分成几段,每段单独处理
   "这是第1部分(共3部分),请先阅读,我发完再请你分析"

2. 先摘要再处理:让 AI 先总结长文档,再基于摘要回答
   "请先将这篇文章总结为500字,然后基于总结回答我的问题"

3. 只给相关部分:不要塞整篇文档,只粘贴与问题相关的段落

3.5 动手练习

练习1:零样本 vs 少样本对比

用零样本和少样本两种方式让 AI 把以下公司名翻译为中文,对比输出差异:

  • Google、Microsoft、Amazon、Netflix

练习2:设计一个角色提示

为以下场景设计完整的角色提示(包含身份、能力、风格、原则):

  • 场景:你需要一个”英语口语教练”帮你练习日常对话

练习3:写一个系统提示词

设计一个”个人理财顾问”的完整系统提示词,参照 3.3 节的五层结构。


本章小结

✅ 少样本提示:先给例子再让 AI 干活,格式/分类/风格模仿必备
✅ 角色提示:给 AI 穿上"专业制服",获得专业视角的回答
✅ 系统提示词:AI 的"员工手册",定义行为基线
✅ 三种 API 消息:system(规矩)、user(需求)、assistant(记录)
✅ Prefill 技巧:替 AI 开个头,控制输出格式/语言/方向
✅ 上下文控制:背景、受众、范围、参考材料
✅ 长内容处理:分批喂、先摘要、只给相关部分

下一步04_让AI深度思考.md