大模型根本不是“学会了”,它只是会“看例子”:一文讲透 In-context Learning(ICL)

大家好,我是舒一笑不秃头,喜欢分享和写作,更多精彩内容

大家第一次接触大模型时,往往会有一种错觉:

"这模型怎么这么聪明?我给它举两个例子,它居然就会做了。"

比如你对模型说:

  • 北京 -> China
  • 东京 -> Japan
  • 巴黎 -> ?

它立刻回答:

  • France

很多人会觉得:
哇,它是不是刚刚被我'训练'了?

其实不是。

这背后对应的是大模型里一个非常重要的能力:In-context Learning,简称 ICL

翻译成中文,就是:上下文学习

今天这篇文章,我尽量不用论文腔,带你真正搞懂:

  1. ICL 到底是什么
  2. 它和传统训练有什么区别
  3. 为什么 few-shot prompt 这么有效
  4. 为什么说它是大模型时代最重要的能力之一

一、什么是 ICL?一句话先讲明白

ICL 的核心思想非常简单:

不给模型重新训练,只在输入里放几个示例,模型就能"照着例子"完成新任务。

注意这句话里最关键的两个点:

  • 不重新训练
  • 只靠上下文中的示例

也就是说,模型不是通过梯度下降学会任务的,

而是通过你给它的例子,临时理解当前任务该怎么做

你可以把它理解成一种:

"现场看题、现场悟规则"的能力。


二、很多人真正没懂的点:ICL 不是训练

这是初学者最容易混淆的地方。

我们平时说"机器学习",默认是这种流程:

  1. 准备大量数据
  2. 标注数据
  3. 训练模型
  4. 更新参数
  5. 模型学会任务

比如你想让模型做"情感分类",传统做法就是喂给它几万条:

  • "这个产品太好用了" -> 正面
  • "物流慢得离谱" -> 负面

训练很多轮以后,它参数变了,能力也变了。

这叫监督学习/微调

但 ICL 完全不是这样。

在 ICL 里,你只是把示例写进 prompt:

复制代码
句子:这个电影太无聊了
情感:负面

句子:这家餐厅真的很不错
情感:正面

句子:这个手机续航一般
情感:

模型接着输出:

复制代码
中性

这个过程中,模型没有被重新训练 ,参数一动没动。

它只是根据你前面给的格式和规律,推断你想让它做"情感分类"这件事。

所以 ICL 的"学习",更准确地说,不是参数层面的学习 ,而是上下文中的模式识别与任务推断

这点非常重要。


三、一个特别好懂的类比:它不是"上课",而是"看例题"

怎么理解 ICL?

你把大模型想象成一个做题能力很强的学生。

传统训练

像是把学生送去上一个月补习班:

  • 系统讲知识点
  • 大量练习
  • 考试
  • 最后学会

ICL

像是考试前你只给他看 3 道例题:

  • 2 + 3 = 5
  • 4 + 1 = 5
  • 6 + 2 = ?

他马上知道你在考加法,然后答 8。

这不是"重新培养了他的数学能力",

而是他从上下文里识别了规则

所以 ICL 的本质可以理解为:

模型利用 prompt 中的例子,识别任务模式,并将该模式迁移到当前输入上。


四、为什么大模型能做到 ICL?

这件事放在传统小模型时代,其实很难想象。

因为以前的模型通常是:

  • 专门做一个任务
  • 必须训练后才能用
  • 泛化性比较弱

而大模型不一样。

它在海量语料上做了预训练之后,内部已经形成了非常强的:

  • 模式识别能力
  • 语言归纳能力
  • 任务抽象能力
  • 格式模仿能力

这就导致它在面对 prompt 时,不只是"读文字",

而是在做一件更高级的事:

判断你现在到底想让它扮演什么任务。

你给它几个翻译样例,它会推断是翻译。

你给它几个问答样例,它会推断是问答。

你给它几个标签样例,它会推断是分类。

你给它几个 JSON 输出样例,它会推断你要结构化输出。

所以很多时候,prompt 不是"命令",而像是"示范"。

而 ICL,就是模型对这种示范的理解能力。


五、Zero-shot、One-shot、Few-shot,到底啥区别?

ICL 经常和这几个词一起出现,很多人一开始看得头大。其实特别简单。

1. Zero-shot

不给示例,只直接说要求。

比如:

复制代码
请判断下面句子的情感倾向:
"这个耳机音质不错,但有点贵。"

模型直接做。

这叫 zero-shot


2. One-shot

给 1 个例子,再让模型做。

复制代码
句子:这个电影很精彩
情感:正面

句子:这个耳机音质不错,但有点贵
情感:

这叫 one-shot


3. Few-shot

给少量几个例子,通常是 2~10 个,再让模型完成。

复制代码
句子:这个电影很精彩
情感:正面

句子:快递太慢了
情感:负面

句子:外观还行,性能一般
情感:中性

句子:这个耳机音质不错,但有点贵
情感:

这就是 few-shot learning,也是 ICL 最经典的使用方式。

所以你可以这么记:

  • zero-shot:不给样例
  • one-shot:给 1 个样例
  • few-shot:给几个样例
  • 它们本质上都属于:通过上下文引导模型完成任务

六、ICL 为什么这么重要?

因为它几乎改变了我们使用模型的方式。

在传统 NLP 时代,一个任务对应一个模型:

  • 情感分析一个模型
  • 命名实体识别一个模型
  • 机器翻译一个模型
  • 摘要一个模型

想做新任务?

重新收集数据、重新训练。

成本非常高。

但 ICL 让事情变了。

1. 极大降低使用门槛

你不一定非要训练。

很多任务只要写好 prompt、给好例子,直接就能跑。

2. 非常适合数据少的场景

现实里很多任务拿不到大规模标注数据。

但你通常可以手写 3~5 个高质量示例。

这时候 ICL 就特别有用。

3. 任务切换非常灵活

同一个模型,上一秒做翻译,下一秒做抽取,再下一秒做分类。

你只要换一下上下文示例就行。

4. 更符合"自然语言编程"

以前我们是"训练模型";

现在越来越像是"通过提示词和示例编排模型行为"。

这也是为什么很多人说:

Prompt engineering 本质上就是在利用模型的 ICL 能力。


七、一个经典误区:模型真的"理解规则"了吗?

这里要泼一盆冷水。

虽然 ICL 看起来很像"学会了",

但很多时候,它并不是像人类一样真正理解抽象规则。

它更像是在做:

  • 模式匹配
  • 概率推断
  • 格式续写
  • 基于上下文的类比生成

这意味着什么?

意味着 ICL 很强,但也有局限。

它可能会:

  • 被坏例子带偏
  • 对示例顺序敏感
  • 对格式非常敏感
  • 看起来懂了,其实只是模仿得像
  • 示例一换,效果就波动

这也是为什么在实际开发中,例子的质量经常决定效果上限。

很多时候,不是模型不行,

而是你给它的 demonstration 不行。


八、怎么写出有效的 ICL 示例?

这一段很实战。

如果你在业务里想用好 ICL,少走弯路,记住下面几个原则。

1. 示例要有代表性

别随手举两个最简单的例子。

你给的例子,最好覆盖真实任务中的典型情况。

比如做情感分类,不能全给"特别明显"的正负面,

最好也包含模糊、混合、中性表达。


2. 输入输出格式要统一

模型非常吃格式。

比如你前面都写的是:

复制代码
问题:
答案:

后面就别突然改成:

makefile 复制代码
Q:
A:

统一格式,模型更容易稳定识别模式。


3. 示例越清晰越好

不要让示例本身含糊不清。

如果标签都容易引起争议,模型自然也学不明白。


4. 尽量贴近真实数据分布

你线上遇到的输入长什么样,示例就尽量长什么样。

不要拿特别规整的 toy example 去教模型做复杂真实任务。


5. 重要任务要测试示例顺序

有些模型对 example order 很敏感。

同样 4 个例子,顺序一换,结果可能就变了。

这是很多人没注意到的细节。


九、为什么"提示词工程"其实离不开 ICL?

很多人把 prompt engineering 理解成:

  • 会写"你是一个专业助手"
  • 会加"请一步一步思考"
  • 会让模型输出 Markdown

但真正决定任务效果的,很多时候不是这些花活,

而是你有没有用好 ICL 示例

因为对于大模型来说:

最强的约束之一,不是你怎么命令它,而是你怎么示范它。

命令告诉它"做什么",

示例告诉它"怎么做"。

这就是为什么在很多复杂任务中:

  • 一句模糊要求,效果一般
  • 加 3 个高质量示例,效果立刻提升

很多工程优化,本质上不是改模型,而是在改上下文。


十、ICL 最神奇的地方:它让"推理时学习"成为可能

ICL 最有意思的一点在于:

学习和使用发生在同一个时刻。

传统机器学习里:

  • 训练是训练
  • 推理是推理

两件事分得很开。

但 ICL 有点像:

  • 你在推理时给它示例
  • 它在推理时"临时适应"任务
  • 然后马上输出结果

这让大模型展现出一种很新的范式:

不是先学再用,而是在用的时候边看边学。

当然,这种"学"不是参数更新意义上的学,

但从使用体验上,它已经非常接近"教一下就会"。

这也是 ICL 为什么会被认为是大模型时代一个标志性能力。


十一、用一句最通俗的话总结 ICL

如果让我用一句最接地气的话解释 ICL,我会这么说:

ICL 就是:你不用重新训练模型,只要先给它看几个例子,它就能猜到你要它干什么,并照着做。

再简单一点:

不是把模型教会,而是让模型看懂。


十二、最后聊聊:为什么你一开始会觉得"没懂"?

因为很多资料写 ICL,都喜欢一上来就说:

  • 范式
  • 涌现能力
  • 条件概率建模
  • 少样本泛化
  • 上下文归纳

这些词没错,但对初学者特别不友好。

其实 ICL 的直觉理解一点都不复杂:

你只需要抓住三件事:

  1. 给例子
  2. 不训练
  3. 模型根据例子临时完成任务

抓住这三点,你就已经理解 80% 了。

剩下的 20%,才是更深入的研究问题,比如:

  • ICL 为什么会在大模型中涌现?
  • 它到底是模式匹配还是隐式贝叶斯推断?
  • 示例数量、顺序、标签空间为什么会影响表现?
  • ICL 和 fine-tuning 的能力边界在哪里?

但那已经是进阶层面的事了。

对大多数工程实践来说,先把这个本质吃透就够了。


结尾

大模型时代,一个特别大的变化是:

我们不再总是通过"训练"来让模型变强,而是越来越多地通过"上下文"来让模型进入状态。

而 ICL,正是这件事最核心的能力之一。

它让模型看起来像是"被当场教会了",

也让人机交互第一次真正接近:

"你给我举个例子,我就知道你想要什么。"

这可能才是大模型最迷人的地方。

相关推荐
小毕超10 小时前
Super Agent Harness 框架 DeerFlow 2.0 源码分析解读
langchain·harness·deerflow2.0
新知图书12 小时前
用于 HR FAQ 场景的AI Agent原型演示
人工智能·langchain
AskHarries12 小时前
我用 AI 写了一首歌,并把它上传到了 QQ 音乐、酷狗音乐、酷我音乐
openai·ai编程
.柒宇.12 小时前
AI-Agent入门实战-AI私厨
人工智能·python·langchain·agent·fastapi
默子昂12 小时前
langchain 基本使用
开发语言·python·langchain
悟空码字13 小时前
基于OpenBuddy搭建私域客服助手,告别数据上传焦虑的实战方案
aigc·openai
网络工程小王13 小时前
【LangGraph 子图(Subgraph)详解】学习笔记
java·服务器·数据库·人工智能·langchain
故事还在继续吗14 小时前
Mac 本地部署大模型
macos·llm·qwen
狐狐生风14 小时前
LangGraph 工具调用集成
python·langchain·prompt·agent·langgraph
swipe14 小时前
别把 Agent 写成一团 Prompt:用 LangGraph 把多 Agent 系统变成可控状态机
后端·langchain·llm