Few-shot与思维链
Few-shot 和 Chain-of-Thought(CoT)是提示词工程中最重要的两类技巧。前者解决"形式问题",后者解决"推理问题"。本篇深入讲解二者的原理、用法和组合。
1. Zero-shot、Few-shot、Many-shot 的概念
| 概念 | 含义 | 示例数量 |
|---|---|---|
| Zero-shot | 不给示例,直接让模型做 | 0 |
| One-shot | 给 1 个示例 | 1 |
| Few-shot | 给少量示例 | 2-10 |
| Many-shot | 给大量示例 | 10+ |
注意:这里的"shot"是机器学习术语,指提供给模型的训练样例。在提示词上下文里,就是写在 prompt 里的输入-输出对。
2. Zero-shot:默认起点
模型基于训练知识直接做。简单、常见、有标准答案的任务用 Zero-shot 就行。
Zero-shot 的局限
- 输出风格不稳定(每次格式可能不同)
- 主观任务无法对齐你的偏好
- 复杂格式容易失败
3. Few-shot:给模型"打样"
什么时候用
- 输出格式有特殊要求
- 需要某种风格、口吻
- 任务相对小众,模型理解可能偏差
- Zero-shot 试过效果不稳定
写法
例子:情感分类
Zero-shot 版本:
输出:可能是"中性"、可能是"混合"、可能附一段解释。
Few-shot 版本:
判断下面句子的情感,只输出"正面"、"负面"、"中性"之一。
"这家餐厅的菜真好吃" → 正面
"等了一个小时菜还没上" → 负面
"店员态度一般般" → 中性
"环境优雅,但价格偏贵" → 中性
"这家餐厅的菜味道一般,但服务还行" →
输出稳定为"中性"。
4. Few-shot 的注意事项
示例数量
通常 2-5 个最佳: - 1 个:可能让模型过拟合到这个例子 - 2-3 个:覆盖主要变化 - 5+ 个:边际收益降低,浪费 token
示例多样性
要覆盖不同情况,不要 5 个例子都是同一类。
❌ 5 个全是正面情感的例子 ✅ 正/负/中各 1-2 个,且复杂度有差异
示例顺序
实验发现:模型对最近的示例最敏感(近因效应)。如果有"最重要的格式",放在最后。
示例正确性
示例的输出必须 100% 正确。模型会把它当标准学习。如果示例本身有错,模型也会照样错。
5. 一个进阶 Few-shot:风格迁移
任务:把技术博客改写成"小红书风格"。
请把下面的技术段落改写成"小红书风格"。
示例:
【原文】
React 18 引入了并发渲染,使得应用可以更流畅地响应用户输入。
【改写】
姐妹们,React 18 真的太爱了!🌟 这个并发渲染简直绝绝子,
卡顿什么的统统拜拜~再也不用担心点按钮没反应啦!
【原文】
Tailwind CSS 是一个 utility-first 的 CSS 框架。
【改写】
你们绝对绝对要试试 Tailwind!💕 不用写一堆 class,
直接组合就完事,写 UI 速度直接起飞 ✈️
现在请改写:
【原文】
TypeScript 是 JavaScript 的超集,添加了静态类型检查。
【改写】
模型会模仿"emoji + 网络用语 + 感叹"的风格输出。
6. Chain-of-Thought(CoT):让模型"思考"
原理
复杂推理任务,让模型展示推理过程比直接给答案准确率高很多。这是 2022 年 Google 论文 Chain-of-Thought Prompting Elicits Reasoning in Large Language Models 提出的方法。
经典对照
❌ 不用 CoT:
模型可能直接给"3 个"或"4 个",正确率取决于运气。
✅ 用 CoT:
小明有 5 个苹果,吃了 2 个,又买了 3 个,最后送了一半给朋友,
他还剩几个?
请一步一步推理:
1. 初始有几个?
2. 吃掉后剩几个?
3. 买入后是几个?
4. 送出一半后剩几个?
最后给出答案。
模型会显式列出每步:
- 初始:5 个
- 吃掉 2 个:5 - 2 = 3 个
- 买入 3 个:3 + 3 = 6 个
- 送出一半:6 / 2 = 3 个
答案:3 个
正确率显著提升。
7. CoT 的两种触发方式
Zero-shot CoT
不给推理示例,只用一句"魔法咒语"触发:
英文版:"Let's think step by step." 是经典咒语,效果显著。
Few-shot CoT
把"问题 → 推理过程 → 答案"作为示例:
问:餐馆有 23 个苹果,做菜用了 20 个,又买了 6 个,现在有几个?
推理:
- 开始:23 个
- 用了 20 个:23 - 20 = 3 个
- 买了 6 个:3 + 6 = 9 个
答:9 个
问:小明 12 岁,他爸爸比他大 28 岁,10 年后他爸爸多少岁?
推理:
模型会模仿"分步推理 + 给答案"的格式。
8. CoT 的适用场景
✅ 强烈推荐用 CoT:
- 数学题、计算题
- 多步骤逻辑推理
- 复杂规则判断
- 需要权衡的决策
- 代码 debug 分析
❌ 不需要 CoT:
- 简单事实查询("中国首都是?")
- 翻译、改写
- 格式转换
CoT 会增加 token 消耗,短任务用 CoT 反而冗余。
9. CoT 的进阶:Self-consistency
让模型对同一问题生成多个推理路径,取多数答案。
适合:数学、推理类、有标准答案的题。单次推理可能错,多次推理后多数答案大概率对。
10. ReAct:CoT + 行动
ReAct 是 Reasoning + Acting 的缩写,让模型在"思考 → 行动 → 观察"的循环中工作,是 Agent 的核心模式。
模板
Question: {用户问题}
Thought: {模型的思考}
Action: {模型决定调用什么工具}
Observation: {工具返回的结果}
Thought: {模型继续思考}
Action: {继续动作 或 Finish}
Answer: {最终答案}
例子
Question: 北京今天的天气怎么样?
Thought: 我需要查询实时天气,用 search_weather 工具
Action: search_weather("北京")
Observation: 25℃ 晴
Thought: 已经获取,可以回答
Action: Finish
Answer: 北京今天 25℃,晴
ReAct 把 CoT 和 Tool Use 结合,是 LangChain Agent、Claude Tools、OpenAI Function Calling 的核心思想。
11. Tree-of-Thoughts(ToT)
让模型探索多条推理路径,每步评估各路径优劣,回溯择优。
ToT 适合开放性、决策性任务。比 CoT 更"重",但效果更好。
12. CoT 的反模式
反模式 1:CoT 用错场景
简单任务硬上 CoT,输出会很啰嗦:
模型可能用 200 字解释"加法的定义"。
反模式 2:模糊的"思考步骤"
太空泛,模型不知道怎么"思考"。给具体步骤:
反模式 3:CoT + 强格式约束冲突
CoT 要文字推理,JSON 要结构化输出,两者冲突。
解法:让 CoT 写在 JSON 字段里:
或:先用 CoT 思考一遍,再让模型整理成 JSON(两轮调用)。
13. 实战:Few-shot + CoT 组合
任务:判断一段代码改动是否可能引入 bug。
你是资深代码审查者。
请按以下流程分析每段 diff:
【流程】
1. 读懂改动做了什么
2. 列出可能的影响范围
3. 对每个影响,评估风险(高/中/低)
4. 综合评估是否安全
【示例】
diff:
- return user.password == password
+ return bcrypt.checkpw(password.encode(), user.password_hash)
分析:
1. 改动:把明文密码比对改成 bcrypt 验证
2. 影响范围:
- 登录逻辑
- 已有用户的密码字段格式
3. 风险评估:
- 登录逻辑(高):如果存量数据还是明文,所有用户登录失败
- 字段格式(高):需要数据迁移
4. 综合:⚠️ 不安全,需要先迁移数据再上线
【现在分析】
diff:
- def get_user(uid):
- return cache.get(f"user:{uid}")
+ def get_user(uid):
+ user = cache.get(f"user:{uid}")
+ if user is None:
+ user = db.query("SELECT * FROM users WHERE id=?", uid)
+ cache.set(f"user:{uid}", user)
+ return user
分析:
模型会按相同格式输出,准确性大幅提升。
14. 选择决策树
什么时候用什么技巧?
任务类型?
├─ 简单事实/翻译 → Zero-shot
├─ 格式有特殊要求 → Few-shot
├─ 复杂推理 → CoT
├─ 高确定性需求 → Self-consistency
├─ 需要调用工具 → ReAct
└─ 开放决策 → Tree-of-Thoughts
复杂任务通常组合使用:Few-shot + CoT,或 Few-shot + ReAct。
总结
- Zero-shot:简单任务的默认选择
- Few-shot:2-5 个高质量示例,覆盖多样情况,能稳定输出格式和风格
- CoT:让模型一步一步推理,复杂推理任务准确率显著提升
- Zero-shot CoT 用一句"请一步一步思考"触发,Few-shot CoT 给推理过程示例
- Self-consistency:生成多次取多数,适合有标准答案的题
- ReAct:CoT + 工具调用,是 Agent 的核心模式
- Tree-of-Thoughts:多路径探索 + 评估,适合开放决策
- 实战中常组合使用:Few-shot + CoT 是黄金搭档
- 反模式:简单任务用 CoT 浪费、CoT 与 JSON 强约束冲突要分阶段处理