第 2 课 · 它凭什么听得懂人话
读这一课前你需要会什么:读过第 1 课。 你需要知道那三件事:它一圈一圈地写、它脑子里什么都不存、它自己不会重复这个动作。 出现的每一个新词都会当场用大白话讲清。讲不清楚的地方就是我的问题,请直接标出来。
这一课结束时你 会
- 说得出「它听得懂人话」这件事是从哪儿来的——不是天生的,是训出来的;
- 说得出为什么我们能靠「往它眼前那段文字里塞东西」改变它的行为,而不用碰模型;
- 说得出这整个课题为什么可能成立——以及它建立在哪一条能力上,那条能力靠不靠得住。
1. 先看第 1 课留下的那个洞
第 1 课说:它只会照着前面接着往下写。
那就有个问题。 你打进去的是:
北京今天天气怎么样?
照「接着往下写」这个规矩,它完全可以接一句:
北京今天天气怎么样?上海呢?深圳呢?
这才是「接着往下写」啊。 在它读过的海量文字里,一个问句后面跟着另一个问句, 是再常见不过的写法。
可它没有。它回答了你。
这一课就讲这一件事:它凭什么把那句话当成「要我答」,而不是「接着往下编」。
2. 先还第 1 课欠的一笔:「大」到底多大
第 1 课说,「大模型」里的「大」指的是它内部可调的数特别多,还说第 2 课再讲。先还这笔账。
一个参照:
| 数量级 | |
|---|---|
| 人脑 | 约 1000 亿个神经元、约 100 万亿条连接 |
| 一个早期的大模型 | 约 1750 亿个可调的数 |
这个对照就是那本书觉得值得惊讶的地方:一个可调的数的个数和人脑神经元数量相当的程序, 就能出色地生成人类语言(依据:04-making-it-work/what-is-chatgpt-doing)。
那个 1750 亿是当时那一代的数,今天早就不是了。 引用这类数字时要连年份一起记, 有量感的是那个对照关系,不是具体数值。
多大算「大」,并没有硬门槛。 一份资料给的口径是:狭义指数百亿以上, 广义从十几亿到几千亿都算;而它给的真正判据是「只要展现出涌现能力就算」 (依据:04-making-it-work/happy-llm)——涌现是什么、以及它为什么要打问号,§5.4 讲。
那些数是干嘛的? 一句话:它们决定了第 1 课那张「下一个该写什么」的清单怎么算出来。 调这些数的过程叫训练,而训练分三段——这就是下一节。
3. 顶层全景:它是分三段训出来的
一句话:今天你用的那个 AI,是同一个模型被分三段调教出来的,三段各管一件事。
① 预训练 海量文字上做接龙:给前面,猜后面
│ → 拿到的是知识和语感。这一段结束时,它只会接话。
▼
② 微调 喂成对的「这样问 → 该这样答」
│ → 这一段结束时,它开始照办。
▼
③ 让人打分再调 人给它的回答排好坏,拿这些排序去调它
→ 这一段结束时,它答得让人舒服。
图说:三段各管一件事——① 懂多少,② 听不听得懂指令,③ 答得合不合人意。
缺哪一段就缺哪一样,顺序不能换。
有一份资料给了个特别好记的说法(依据:04-making-it-work/happy-llm):
第一段 = 把所有基础知识教给这个学生; 第二段 = 教他怎么读题、怎么解题; 第三段 = 让他真的做练习,老师批改,反思错的、强化对的。
我们这个课题,吃的全是第二段的饭。 下面拆开讲。
4. 全程例子:同一句话,在三段前后各是什么下场
盯住第 1 课那句话,看它在三段训练的不同阶段会得到什么。
北京今天天气怎么样?
只做完第 ① 段的时候
第 ① 段的练习题就是接龙:给它一段文字的前半截,让它猜后半截,猜错了就调一调。 做几万亿次。(依据:04-making-it-work/happy-llm)
做完这一段,它满肚子知识,但没人教过它「被问了要答」这条规矩。
它会接着往下写。写出什么取决于它读过的文字里这句话后面常跟着什么—— 可能是另一个问句,可能是一段天气预报的模板,可能是一篇游记的开头。
下面这几种续写是我编的演示,不是某次真实运行的记录。 拿来说明「只会接话」是什么意思:
北京今天天气怎么样?上海呢?广州呢?北京今天天气怎么样?——多云转晴,最高气温 28℃。以上信息来自……北京今天天气怎么样?我站在什刹海边上,想起十年前的那个秋天。三种都是合格的「接着往下写」。它没有理由偏爱第二种。
做完第 ② 段之后
第 ② 段喂给它的是成对的东西:一句人写的要求,配一句该有的回答。喂很多对、很多种类。
做完这一段,同样这句话进去,它开始答了。
关键在这一段的效果不止于「教过的那些」。 这一点下面第 5.2 节细讲, 现在只记住一句:教过它几十种任务之后,它对第几百种任务也能上手。
做完第 ③ 段之后
第 ③ 段调的不是「答不答」,是「答得好不好」——是不是啰嗦、有没有摆架子、会不会答一半。
这一段对我们这个课题影响最小。 它决定的是语气和分寸,不决定它会不会照办。
停一下:我们要造的东西站在哪一段上
| 段 | 给了我们什么 | 我们的课题用不用得上 |
|---|---|---|
| ① 预训练 | 它知道天气是什么、北京在哪 | 背景,用不着我们管 |
| ② 微调 | 它会照着你的要求办事 | 全部指望在这一段 |
| ③ 让人打分 | 它答得像个人 | 影响体验,不影响机制 |
5. 拆开看:第 ② 段到底给了什么
这一节讲四条能力。 它们是同一段训练的产物,但对我们这个课题的用处很不一样。
5.1 指令遵循:这一条是整个课题的地基
先给这个词:
指令遵循 = 你用大白话写一句要求,它就照办;而且这句要求可以是它训练时没见过的。
「没见过的」这三个字是关键。 不是「你教它写周报它就会写周报」, 而是教过它几十种任务之后,它对第几百种任务也能上手(依据:04-making-it-work/happy-llm)。
为什么这一条是地基? 那份资料把话说死了:
今天的智能体,乃至未来可能出现的全能助理,本质上依赖的都是指令遵循能力。 (依据:04-making-it-work/happy-llm)
把这句话摊开是这样的:
- 我们要造的东西,靠的是在那段文字里写规矩——「你可以用这几个工具」「要用就按这个格式写」;
- 它照不照这些规矩,全看它的指令遵循能力强不强;
- 这条能力不是模型天生的,是第 ② 段训出来的;
- 所以它有强弱之分。
第 4 条有一个很实的后果:同一套代码换个模型,可能就跑不动了。
这不是猜的。有的实现专门为此写了两条路: 原生的那条路在运行时报「不支持」,就当场切回一条纯文字的备用协议,不让整次执行失败 (依据:04-making-it-work/crewai)。 还有的实现走得更远——按模型不同,把整个请求塑形成它最熟悉的那副样子, 理由是那些便宜模型分别是在各自厂商的工具格式上调优过的, 直接塞进另一家的格式会水土不服(依据:04-making-it-work/open-interpreter)。
5.2 上下文学习:我们凭什么能靠「写字」改变它
先给这个词:
上下文学习 = 你在给它的那段文字里塞几个例子或一句说明,它就照着做, 而模型本身一个数都没改。
这件事在几年前是不成立的。 对照着看最清楚(依据:04-making-it-work/happy-llm):
| 老办法 | 上下文学习 | |
|---|---|---|
| 做一个新任务要什么 | 标注一千到几万条数据,再训一次 | 写一段话 |
| 要多少算力 | 就算五亿参数的小模型,训一次也要 10GB 以上显存 | 零 |
| 模型参数 | 被改动 | 一个不改 |
这一条是我们整个课题在技术上成立的原因。
台阶一级一级走:
- 我们没有能力去改模型——那要海量数据和一屋子显卡;
- 但我们能改每次送进去的那段文字;
- 上下文学习意味着:改那段文字,就能改它的行为;
- 于是「告诉它有哪些工具可用」这件事,写进那段文字里就行了;
- 这就是后面四课全部工作的着力点。
顺带把一个你到处会看到的词定死:
prompt = 你交给模型的那一整段输入文字。 包括你的问题、你给的例子、你提的要求,全都算在里面。 (依据:04-making-it-work/happy-llm)
这个词中文有时候译成「提示」,但业界口语和文档里写 prompt 的更多,后面全文用 prompt。
「怎么调整这段文字把它的能力激发出来」这件事有个名字,叫提示工程。 第 6 课整整一课都在讲这个——因为同一句话摆在这段文字的开头还是结尾,效果差得很远。