In-Context Learning:为什么 LLM 看几个例子就会
GPT-3 让所有人惊讶的能力——不微调,只给几个例子就能学。它是怎么工作的?这一篇用研究解读。
L0-05 教过你写 prompt 时用 few-shot。L4-02 介绍了进阶技巧。 这一篇讲为什么 LLM 能”在情境中学习” —— 这是 LLM 最神奇的能力之一。
In-Context Learning 是什么
ICL(In-Context Learning):
不更新模型参数,只在 prompt 里提供例子,模型就能学会新任务。
英中翻译:
hello → 你好
goodbye → 再见
thank you → ???
GPT-3 输出”谢谢”—— 它从来没专门训练过翻译,但靠 prompt 里的 2 个例子就学会了。
2020 年 GPT-3 论文里第一次系统展示了这种能力—— 让 ML 社区”卧槽”——这从未在其它范式里见过。
ICL 的 3 种形态
1. Zero-shot
不给例子,直接问:
将以下英文翻译成中文:
"thank you"
→ 谢谢
模型只靠指令本身完成任务。
2. One-shot
给 1 个例子:
hello → 你好
thank you → ???
→ 谢谢
3. Few-shot
给 2-10 个例子:
hello → 你好
goodbye → 再见
sorry → 对不起
thank you → ???
→ 谢谢
通常 few-shot 比 zero-shot 准确率高 20-30%。
为什么 ICL 这么”神奇”
朴素直觉:模型像 SQL 查询
给几个 (输入, 输出) 例子—— 模型”理解模式”,应用到新输入。
但这忽略了一件事——ICL 不是查询,模型真的”学到了新东西”。
学术解释 1:模型在”模拟梯度下降”
2022 年 Google Research 提出: LLM 内部的注意力层,可能在做某种形式的梯度下降。
ICL 的例子相当于”虚拟训练数据”—— 模型用注意力机制在内部对它们做”虚拟微调”,更新一个隐含的”内部模型”。
这是个数学激进的假说——还在争论。
学术解释 2:贝叶斯推断
另一派观点: LLM 学到了一个”任务先验”—— ICL 例子让模型收紧后验分布,聚焦到具体任务。
看到 "hello → 你好"
模型贝叶斯推断:"哦,这是个翻译任务"
后续按"翻译任务的概率分布"输出
学术解释 3:组合泛化
预训练时,LLM 见过大量结构化模式—— “X → Y” 这种”输入 → 输出”格式。 ICL 的例子激活了对应的”任务模板”。
三种解释互不矛盾——可能都对一部分。
ICL 的特点
1. 不更新参数
最关键的事——ICL 不改变模型权重。 “学” 完一个任务,对话结束就忘。
这既是优点(灵活)也是局限(不能累积”长期记忆”)。
2. 涌现性(Emergence)
ICL 在小模型上几乎不工作:
- GPT-2(1.5B):ICL 弱
- GPT-3(175B):ICL 强
- 中间没有平滑过渡
这是 LLM “涌现能力” 的最早例子—— 能力突然在某个规模出现。
这也是为什么 OpenAI 坚持”Scale Is All You Need”——观察到 ICL 这种涌现。
3. 上下文依赖
ICL 效果取决于例子的具体写法:
- 例子选错 → 模型学错任务
- 例子顺序 → 影响输出(最近的例子权重大)
- 例子格式 → 必须一致
研究发现:随机交换例子的输入-输出对仍然有效—— 意味着模型可能不只在学”映射”,更在学”任务的格式”。
提高 ICL 效果的招数
1. 多样性
例子要覆盖不同情况:
✗ good morning → 早上好
good evening → 晚上好
good night → 晚安
thank you → ??? (都是"good X"或致谢,模型只学到这一类)
✓ hello → 你好
thank you → 谢谢
the cat is cute → 猫很可爱
I love you → 我爱你
sorry → ??? (覆盖问候/情感/陈述,更通用)
2. 典型性
选最经典、模板化的例子—— 避免边角案例。
3. 难度梯度
从简单到复杂排序——让模型”渐进理解”。
4. 数量
3-5 个通常够;10-20 个对复杂任务更好;超过 50 个收益递减。
5. 动态选择
更高级——根据用户问题动态选最相关的例子:
def dynamic_few_shot(query, example_pool, k=5):
query_emb = embed(query)
sorted_examples = sorted(
example_pool,
key=lambda e: cos_sim(query_emb, e.emb),
reverse=True
)
return sorted_examples[:k]
结合 RAG 思想——动态构建 prompt。
ICL vs Fine-tuning
经典对比——什么时候用哪个?
| 场景 | ICL(few-shot prompt) | Fine-tuning |
|---|---|---|
| 数据量 | 几十-几百条 | 几千-几万条 |
| 部署成本 | 0(用 API) | 训练 + 维护 |
| 灵活性 | 改 prompt 即可 | 改了要重训 |
| 准确率上限 | 中等 | 高 |
| 推理成本 | 每次都带 prompt | 一次性 |
| 适合场景 | 快速原型、小数据 | 生产 + 大数据 |
经验法则:
- 数据 < 100 条 → ICL
- 数据 100-1000 → 比一比再选
- 数据 > 1000 → Fine-tuning(LoRA)
ICL 的局限
1. 上下文长度限制
例子越多,prompt 越长——消耗 token、占用上下文窗口。
现代 LLM 上下文 128k-2M——但塞太多例子仍然贵。
2. 难以”教深层逻辑”
ICL 适合”模式映射”—— 不适合教模型”为什么”。
复杂推理任务上,ICL 不如 fine-tuning 效果好。
3. 不可累积
ICL 对话结束就忘—— 没法逐步学习新知识。
实际场景需要长期记忆——这是 Agent 和向量数据库要解决的问题。
4. 对例子敏感
例子选错——整个任务定义被歪曲。 Prompt Engineering 是个体力活。
一个研究里有意思的发现
Chain of Thought(CoT)是 ICL 的”超能力”
CoT prompt:
Q: 罗杰有 5 个网球,又买了 2 罐每罐 3 个。共多少?
A: 让我们一步步推理。罗杰有 5 个。2 × 3 = 6 个新球。
5 + 6 = 11 个。答案是 11。
Q: 商店有 10 个苹果,卖出 3 个,又进 5 个。共多少?
A: ???
加了”让我们一步步推理”的例子—— 模型也学会了推理风格。
这放大了 ICL 的能力——从”模式映射”扩展到”推理过程”。
详见 L4-02 Prompt 进阶。
一个反直觉
”ICL 真的没学吗”
研究表明—— 给随机标签 ICL 也能工作:
hello → 黄色
thank you → 紫色
sorry → 蓝色
goodbye → ???
模型可能输出"红色"——它在"模仿格式",不一定在学语义。
这意味着——ICL 部分依赖”任务格式”而非”具体内容”。 模型从预训练学到了大量任务模式,ICL 只是激活它们。
怎么验证你的 ICL 在工作
实战中,如果你的 ICL 看起来”工作”—— 也可能只是模型本来就能做这事。
测试方法:
# 1. 直接 zero-shot
"Translate 'thank you' to Chinese." → 谢谢
# 2. 用 few-shot 同一题
"Examples:
hello → 你好
goodbye → 再见
Translate 'thank you' to Chinese." → 谢谢
# 3. 用故意错的 few-shot
"Examples:
hello → APPLE
goodbye → BANANA
Translate 'thank you' to Chinese."
# 如果模型仍然输出"谢谢",意味着 zero-shot 已经会,ICL 没加价值
# 如果模型输出"PEAR"等水果,意味着 ICL 真的影响输出
推荐配套阅读
- HelloAI: L0-05 Prompt 基础 + L4-02 Prompt 进阶
- GPT-3 论文 —— ICL 的最早系统展示
- “Why Can GPT Learn In-Context?” (Google Research 2022)
- Anthropic “Sparks of Reasoning” —— ICL 与推理涌现
- “Rethinking ICL” —— ICL 的局限性研究
ICL 是 LLM 应用的”瑞士军刀”:
- 不用训练
- 改个 prompt 就换任务
- 几小时就能上线 prototype
但别迷信它—— 真正生产级应用通常用 ICL + RAG + Fine-tuning 组合。
实战 90% 的 LLM 应用栈:
- Prompt + ICL 做 80% 任务
- RAG 解决知识缺失
- LoRA 微调解决风格 / 格式
下一篇推荐:L4-07 Agent 工程实战 或 L4-08 LLM 评估。
读到这里说明你认真在学 🎯
订阅每周精选 —— 下一篇新文章 / 新可视化第一时间送到邮箱。
讨论区
· 用 GitHub 账号登录评论src/components/Comments.astro 顶部填入
仓库 ID 和分类 ID(见组件注释里的配置步骤)。