跳转至

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:默认起点

把这句话翻译成中文:
"The quick brown fox jumps over the lazy dog."

模型基于训练知识直接做。简单、常见、有标准答案的任务用 Zero-shot 就行。

Zero-shot 的局限

  • 输出风格不稳定(每次格式可能不同)
  • 主观任务无法对齐你的偏好
  • 复杂格式容易失败

3. Few-shot:给模型"打样"

什么时候用

  • 输出格式有特殊要求
  • 需要某种风格、口吻
  • 任务相对小众,模型理解可能偏差
  • Zero-shot 试过效果不稳定

写法

任务说明。

例子:
输入:xxx
输出:yyy

输入:xxx
输出:yyy

现在:
输入:xxx
输出:

例子:情感分类

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

小明有 5 个苹果,吃了 2 个,又买了 3 个,最后送了一半给朋友,
他还剩几个?

模型可能直接给"3 个"或"4 个",正确率取决于运气。

✅ 用 CoT

小明有 5 个苹果,吃了 2 个,又买了 3 个,最后送了一半给朋友,
他还剩几个?

请一步一步推理:
1. 初始有几个?
2. 吃掉后剩几个?
3. 买入后是几个?
4. 送出一半后剩几个?

最后给出答案。

模型会显式列出每步:

  1. 初始:5 个
  2. 吃掉 2 个:5 - 2 = 3 个
  3. 买入 3 个:3 + 3 = 6 个
  4. 送出一半: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

让模型对同一问题生成多个推理路径,取多数答案。

{问题}

请生成 5 个独立的推理思路,每个都给出答案。
最后统计哪个答案出现次数最多。

适合:数学、推理类、有标准答案的题。单次推理可能错,多次推理后多数答案大概率对

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)

让模型探索多条推理路径,每步评估各路径优劣,回溯择优。

我要做一个 X,请按以下步骤思考:

1. 列出 3 种可能的方案
2. 对每种方案:
   - 列出优点
   - 列出缺点
   - 评估可行性 (1-10)
3. 选出最优方案
4. 详细展开最优方案的实现

ToT 适合开放性、决策性任务。比 CoT 更"重",但效果更好。

12. CoT 的反模式

反模式 1:CoT 用错场景

简单任务硬上 CoT,输出会很啰嗦:

1 + 1 等于几?请一步一步思考。

模型可能用 200 字解释"加法的定义"。

反模式 2:模糊的"思考步骤"

请一步一步思考这个商业问题。

太空泛,模型不知道怎么"思考"。给具体步骤

请按以下步骤分析:
1. 用 SWOT 列出优劣势
2. 估算市场规模
3. 列出竞争者
4. 给出战略建议

反模式 3:CoT + 强格式约束冲突

请一步一步思考,最后只输出 JSON。

CoT 要文字推理,JSON 要结构化输出,两者冲突

解法:让 CoT 写在 JSON 字段里

{
  "reasoning": "string,推理过程",
  "answer": "最终答案"
}

或:先用 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 强约束冲突要分阶段处理

评论