HelloAI
L4 第 6 篇 🐣 难度 🕒 11 分钟

In-Context Learning:为什么 LLM 看几个例子就会

GPT-3 让所有人惊讶的能力——不微调,只给几个例子就能学。它是怎么工作的?这一篇用研究解读。

阿莱
2026/8/1

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 应用栈:

  1. Prompt + ICL 做 80% 任务
  2. RAG 解决知识缺失
  3. LoRA 微调解决风格 / 格式

下一篇推荐:L4-07 Agent 工程实战L4-08 LLM 评估

📬

读到这里说明你认真在学 🎯

订阅每周精选 —— 下一篇新文章 / 新可视化第一时间送到邮箱。

💬

讨论区

· 用 GitHub 账号登录评论
⚠️ Giscus 评论未配置 —— 在 src/components/Comments.astro 顶部填入 仓库 ID 和分类 ID(见组件注释里的配置步骤)。