2022年之前
- 1: 2022年之前的概述
- 2: 早期概念
- 2.1: STRIPS(1971)
- 2.2: Contract Net Protocol(1980)
- 2.3: Brooks 包容架构(1986)
- 2.4: BDI(1991)
- 2.5: Wooldridge & Jennings(1995)
- 2.6: Russell & Norvig《人工智能:一种现代方法》(1995)
- 2.7: FIPA 与 ACL(1996 起)
- 2.8: Siri / Alexa / 任务型对话(2011–2014)
- 3: Transformer
- 3.1: Attention Is All You Need(论文)
- 3.2: Transformer 讲解
- 4: GPT-3
- 5: RAG
- 5.1: Retrieval-Augmented Generation(论文)
- 5.2: RAG 讲解
- 6: GitHub Copilot
- 6.1: GitHub Copilot 技术预览(材料)
- 6.2: GitHub Copilot 讲解
- 7: Codex
- 8: HumanEval
- 8.1: HumanEval(论文)
- 8.2: HumanEval 讲解
- 9: WebGPT
- 9.1: WebGPT(论文)
- 9.2: WebGPT 讲解
1 - 2022年之前的概述
主线判断: Agent 作为研究纲领,比大语言模型早几十年;规划、工具、多 Agent 通信这些概念都不是 2023 年发明的。真正缺少的,是一个能在开放语言空间里做出决策的核心。2017 至 2021 年,Transformer、GPT-3 与 Codex 把底层能力铺好,但循环、对话接口与可靠的调用解析都还没有齐备——符合 AI Agent 定义的系统,此时并不存在。
我在这一页有意写得比一部 AI 通史短。专家系统、具身机器人、自动驾驶不进入主线;强化学习游戏 Agent 只用于指出词汇上的重叠。需要核对的是两段:经典 Agent 留下了哪些概念,以及 LLM 在跨过 2022 年之前已经具备哪些前提、仍然缺少哪些。
与 LLM 的关系
2022 年之前,这段关系要拆成两截,不能混在一起讲。
1990 年代到 2010 年代:决策核心不是语言模型。 经典 Agent 用符号规划器、产生式规则、BDI(信念—愿望—意图)或强化学习策略来选择下一步动作。环境是结构化的(棋盘、传感器、API 表、对话槽位),不是自由文本。它们完全符合「感知—决策—行动」的教科书定义,也因此占用了 Agent 这个词;但按 AI Agent 的定义,它们不是 LLM Agent,因为缺少第一条:以 LLM 作为决策核心。
2017 至 2021 年:底层能力开始出现,产品形态仍不是 Agent。 Transformer(2017)与 GPT-3(2020)证明,足够大的语言模型可以在上下文里完成从未见过的任务。Codex(2021)把这种能力接到代码上,GitHub Copilot 把它做成行级补全。WebGPT(2021)让模型在文本浏览器里检索、点击、引用之后再作答。这些都是后来 Agent 循环的零件——生成、工具、检索、代码,但当时仍是单次或短链调用,不是「给出一个目标,自行迭代到完成」。指令跟随(InstructGPT)的工作贯穿 2021 年,其论文与默认 API 跨入 2022 年初;真正把「听话的对话模型」送到大众面前的,是 2022 年 11 月的 ChatGPT。
因此前传要回答的不是「Agent 诞生于哪一年」,而是:概念库存早已齐备,缺少的是一个能读自然语言、选择工具、并依据回执改变主意的决策核心;这个决策核心在 2021 年底仍只能完成短任务。 决策核心尚未就绪,控制流、schema 与沙箱都无从挂载。
里程碑
分两段记录。第一段是概念库存,第二段是 LLM 底层能力。两段都给出分类与标签(六类历史角色),标签可多,也可无。经典文献多数属于首证,或为后来提供了词汇,不应写成 LLM Agent 的祖先产品。
概念库存:词汇的来源
各条分别写在 早期概念 中,本表只保留判断。
| 时间 | 事件 | 分类 | 标签 | 为什么记录 |
|---|---|---|---|---|
| 1971 | STRIPS(Fikes & Nilsson) | 论文 | 首证 | 把世界写成谓词,用算子搜出计划。它给每个动作附效果清单,规划器因此能在动手之前推演 |
| 1980 | Contract Net Protocol(Smith) | 协议 | 首证 | 任务招标、投标、授予:多 Agent 分工的早期协议。它与 A2A 处理同一类问题:独立的 Agent 之间如何连接 |
| 1986 | Brooks 包容架构 | 论文 | 首证、范式更替 | 按对外行为分层的机器人控制:高层抑制下层。它改写了「智能系统按功能还是按行为分解」这条前提 |
| 1991 | BDI(Rao & Georgeff) | 论文 | 首证 | 用信念、愿望、意图描述理性 Agent。今日的 goal、plan、memory 是这套词汇的通俗版,实现已换 |
| 1995 | Wooldridge & Jennings, Intelligent Agents: Theory and Practice | 论文 | — | 把 Agent 研究分为理论、架构、语言三块,给出弱四条口径。本站的栏目分工与之对应 |
| 1995 | Russell & Norvig《人工智能:一种现代方法》第一版 | 文献 | — | 教材用理性 Agent 统摄 AI:感知、行动、环境、性能度量。「人人会说 Agent」,多来自这里 |
| 1996 起 | FIPA 与 ACL | 协议 | 警示 | 为异构 Agent 规定平台、通信语言与交互协议,是 Agent 互操作最早的系统尝试。规范完成,但未成为业界默认 |
| 2011–2014 | Siri / Alexa / 任务型对话 | 产品 | 工程化 | 封闭任务上填槽、调用后端。「助手调服务」这条流水线,后来接上了 LLM 的工具选择 |
刻意不展开的有:ELIZA(1966,对话幻觉的前史)、办公助手、语义网 Agent,以及绝大多数专家系统。它们可以说明「会说话不等于 Agent」,但带不走本站的主线。
相邻领域,仅作消歧
| 时间 | 事件 | 为什么只点名 |
|---|---|---|
| 2013–2019 | DQN、AlphaGo、OpenAI Five、AlphaStar | 媒体也称它们为 Agent。决策核心是 RL 策略,环境是游戏或棋局。体系与软件 LLM Agent 不同,不进入主叙事 |
| 机器人 / 自动驾驶 | 感知—控制闭环 | 调研方法 已划为相邻领域 |
判定标准只有一条:决策核心是否为语言模型。不是,则不进入主叙事。
LLM 底层能力:零件出现,循环未成
| 时间 | 事件 | 分类 | 标签 | 为什么记录 |
|---|---|---|---|---|
| 2017-06 | Transformer(论文、讲解) | 论文 | 范式更替 | 用自注意力替代循环与卷积,成为后续 LLM 的骨架。没有可扩展的条件生成器,后面就没有可讨论的决策核心 |
| 2020-05 | GPT-3(论文、讲解) | 模型 | 首证 | 上下文学习:不更新权重也能做新任务。Agent 后来把 Observation 当作工作集,其前提从这里开始 |
| 2020-05 | RAG(论文、讲解) | 论文 | 工程化 | 生成之前先检索。后来几乎所有「带外部知识的 Agent」都要先经过这一步,外部知识从此可以更换而不用重训 |
| 2021-06 | GitHub Copilot(材料、讲解) | 产品 | 工程化 | 把 Codex 的能力做成 IDE 补全。「Copilot → Agent」这条演化的起点;副作用在编辑器缓冲区,接受与拒绝都发生在那里 |
| 2021-07 | Codex(论文、讲解) | 模型 | 首证 | 语言模型写出可运行的代码。没有代码生成,就不会有后来的编码 Agent;生产版本驱动 GitHub Copilot |
| 2021-07 | HumanEval(论文、讲解) | 评测 | 首证、标准 | 用单元测试衡量函数级合成。完成谓词第一次可以不靠人判:看执行结果,不看流畅度;这条路一直走到 2023 年的 SWE-bench |
| 2021-12 | WebGPT(论文、讲解) | 产品 | 首证 | GPT-3 在文本浏览器里检索、导航、带引用作答,并用人类反馈优化。这是「模型加环境加工具」第一次接成一个循环;后来的工具调用与引用评测都从这条实验室形态上取经 |
这一段的共同限度:上下文窗口大约 2k–4k,指令跟随尚不稳定,没有结构化的 function calling schema,也没有工具描述的可移植格式——WebGPT 的动作表写在论文里,不是可传递的产物;更没有大众可用的多轮对话产品。零件齐备,控制循环、可解析接线与可对话接口都未齐备。
能力栈切片
用本站的四层结构去看「当时有什么、没有什么」,避免把 2023 年的分层倒灌回去。
模型层
经典 Agent 没有「模型层」这一说,决策是规则或学到的策略。LLM 出现之后,2021 年底的能力边界大致是:能补全,能少样本模仿,能写短函数,能在受控浏览器里查资料。不能稳定地拆解开放目标,不能在失败之后修改计划,不能把工具调用解析成可靠的 JSON。思维链要到 2022 年才被当作可复现的推理协议。核心是条件生成器,还不是规划器。
框架 / 协议层
经典一侧有规划语言(STRIPS 及后来的 PDDL)、Agent 通信语言(FIPA ACL)、BDI 解释器。它们假设世界模型与言语行为可以被形式化。LLM 一侧在 2021 年还没有编排框架:没有 LangChain,没有 MCP,没有 Assistants API。WebGPT 的浏览器是论文里的环境,不是可插拔协议。
一个对后面有用的对照:FIPA 证明「先写协议、再等生态」可以失败;2024 至 2025 年的 MCP 与 A2A 走的是「先有模型产品,再收敛为事实标准」。Framework、Runtime 与 Protocol 三者此时在 LLM 一侧都还不存在。
应用层
能够规模化的是助手,不是自主执行。任务型对话(订机票、查天气)与 Copilot 补全都是人在环路、一步一确认。WebGPT 与 Codex 停留在研究或开发者工具。没有「给出一个目标,让它在工具与环境里自行运转到完成」的产品,而那正是 2023 年 AutoGPT 所宣称要占据的位置。
基础设施层
沙箱、长任务调度、组织级身份都不存在,因为还没有会乱执行命令的 LLM 循环需要被约束。评测停留在语言任务、HumanEval 与检索问答。记忆等于对话状态机或数据库槽位,不是窗口加向量库那一套。站点中后来的记忆、沙箱栏目,都是 2023 年之后才成为 Agent 基础设施的。主体(principal)无从谈起。
当时还做不到什么
到 2021 年 12 月 31 日,按 AI Agent 的定义,下面这些都不成立:
- 以 LLM 作为循环里的决策核心。 模型能生成下一步文本,但不能稳定地「想—做—看—再想」。控制流不在模型的输出里。
- 开放目标上的自主执行。 助手能填槽,Copilot 能补一行;没有系统在无人看管时把一件事做到可交付。缺少目标终止条件。
- 可对话的通用接口。 GPT-3 是 playground 与 API,不是后来那种人人会用的 Chat。
- 结构化的工具调用。 要让模型使用工具,就得在 prompt 里依赖它吐出可解析的格式。没有 schema,就没有稳定的接线。
- 支撑长任务的上下文。 窗口太短,「当前观察」装不进多少环境回执。工作集不足。
- 任务型评测。 没有 SWE-bench、GAIA、OSWorld;HumanEval 只覆盖函数级合成。完成谓词尚未接到仓库或桌面。
当时若有人宣称「自主 Agent」,多半是在说 BDI、机器人或强化学习,而不是在说 LLM。
2 - 早期概念
大语言模型出现之前,Agent 已有完整的研究传统。这一栏交代概念库存:世界怎么写、任务怎么分、控制怎么切、心智状态怎么形式化、异构节点怎么通信、消费级助手实际跑的是哪条流水线。
这些系统可以具备循环、对环境的动作,以及观察写回。缺少的是工作定义的第一条:下一步由 LLM 选择。与 AI Agent 的对照放在各页后部,不代替对机制本身的说明。它们不是 2022 至 2025 年产品的祖先。
学习内容
按时间顺序,八个节点覆盖四类问题:
| 时间 | 概念 | 要搞清楚的问题 |
|---|---|---|
| 1971 | STRIPS | 经典规划里,世界、动作、计划分别是什么 |
| 1980 | Contract Net | 多个求解节点如何用协商分配任务 |
| 1986 | Brooks 包容架构 | 不建立完整世界模型的控制结构如何工作 |
| 1991 | BDI | 信念、愿望、意图在形式化里各指什么 |
| 1995 | Wooldridge & Jennings | 1990 年代如何给 Agent 下定义、如何分类架构 |
| 1995 | Russell & Norvig | 教材里的理性 Agent 覆盖到多宽 |
| 1996 起 | FIPA 与 ACL | Agent 通信标准规定了哪些消息与平台组件 |
| 2011–2014 | Siri / Alexa / 任务型对话 | 大规模语音助手的流水线实际是什么 |
组织方式
每页固定三块:
- 这个概念是什么:不预设 LLM 背景,先给定义。
- 论文或材料的主要内容:问题、机制、例子,以及作者自己给出的限度。
- 关键术语:后面年份还会遇到的词,先在原文语境里明确。
与 AI Agent 的对照放在各页后部。循环可以早已存在;决策核心是换核心,不是同一条产品线的延续。
2.1 - STRIPS(1971)
原文:Fikes & Nilsson, 1971,STRIPS: A New Approach to the Application of Theorem Proving to Problem Solving,Artificial Intelligence 2: 189–208。IJCAI-71 报告,实现用 LISP 运行在 PDP-10 上,服务于 SRI 的机器人研究(Shakey)。
这个概念是什么
STRIPS(Stanford Research Institute Problem Solver)是一个符号规划器。给定当前世界的描述、一组可执行动作和一个目标条件,它要找出一串动作,使执行之后目标成立。
它处理的不是自然语言,也不是从数据里学到的策略。世界写成一阶谓词演算中的合式公式(wff);每个动作对应一个算子,算子增删公式;计划是算子的有序列表。论文明确区分:对世界模型应用算子发生在规划阶段,执行动作例程才改变物理世界。
经典人工智能称这一支为 planning。1998 年以后的 PDDL 把 STRIPS 风格的领域写成标准输入,仍是同一条技术路线。
关键术语:谓词
谓词是从一组对象到真值的函数。它不返回一个值,而是返回「成立 / 不成立」。
这一节里的三个例子,用的是两种元数:
| 写法 | 谓词符号 | 元数 | 读法 |
|---|---|---|---|
ATR(a) |
ATR |
1 | 机器人在位置 a |
AT(B, b) |
AT |
2 | 物体 B 位于位置 b |
AT(C, c) |
AT |
2 | 物体 C 位于位置 c |
B、b、a 这些叫常量,换成变量就是 AT(x, y)。谓词符号加实参构成的整体 AT(B, b) 叫原子公式。前面说「世界写成一阶谓词演算中的合式公式」,指的是这些原子公式用逻辑联结词(∧、∨、¬)组合后的式子;目标是 AT(B, a) ∧ AT(C, a),就是一个合式公式。
所以「世界是谓词集合」的准确含义是:世界模型是一组为真的公式,每条公式说的是某几个对象之间某个关系成立。
谓词对应的英文单词是 predicate。STRIPS 论文里的原话是 first order predicate calculus,对应中文的「一阶谓词演算」,也就是一阶逻辑。读原文时会遇到的相关英文术语如下:
| 中文 | 英文 | 说明 |
|---|---|---|
| 谓词 | predicate | 从对象元组到真值的函数 |
| 谓词符号 | predicate symbol | AT、ATR 本身,不带实参 |
| 命题 | proposition | 不可再分、没有内部结构 |
| 原子公式 | atomic formula / atom | AT(B, b) 这样的完整式子 |
| 合式公式 | well-formed formula (wff) | 原子公式用联结词组合后的式子 |
| 基公式 | ground formula / ground atom | 不含变量、全部由常量构成 |
| 元数 | arity | 谓词接受几个参数 |
| 项 | term | 常量、变量或函数应用 |
| 算子模式 | operator schema | 带变量的动作模板,如 goto(m, n) |
| 前提 | precondition | 应用算子前要证明的 wff 模式 |
| 增列表 / 删列表 | add list / delete list | 算子的效果 |
补充:predicate 在语法学里是「谓语」,与逻辑学里的这个「谓词」是同一个词、不同的领域,读英文材料时靠上下文区分。
关键术语:模型
论文里说的 model(世界模型)指的是「一组为真的公式」,不是机器学习里的那个模型,也不是大语言模型中的模型。
这个词在 1971 年的语境里是逻辑学的用法,与 2023 年说的 model 无关。读原文时,这一处最容易产生错觉。
论文的主要内容
要解决的问题
在「世界模型」的空间里搜索,直到找到一个能满足目标的模型。对任意世界模型,都存在一组可应用的算子;求解器寻找算子的复合,把初始模型变成满足目标的模型。对象是机器人重排物体、在房间之间导航。世界必须容纳大量事实,因此用一阶谓词演算的公式集合,而不是矩阵或表。
直接前驱是 Green 的系统:把「寻找动作序列」完全交给形式定理证明。这条路线受制于框架问题:必须显式说明「这个动作没有改变哪些事实」。STRIPS 把两件事分开:
- 定理证明只在一个固定的世界模型内部进行,用来回答「某个算子当前是否可用」「目标当前是否成立」。
- 在世界模型之间搜索用类似 GPS 的手段—目的分析,用来挑选下一个相关算子。
问题空间的三个要素
论文第 2.1 节把问题空间定义为三元组:
-
初始世界模型 (M_0):一组 wff。例如机器人在位置 (a)、箱子 B、C 分别在 (b)、(c):
ATR(a) AT(B, b) AT(C, c)也可以写入一般规则,例如「一个物体不能同时在两个不同位置」。
-
算子:按族写成模式(schema)。例如
goto(m, n)表示从地板上一点 (m) 走到 (n);代入具体常量后才得到可应用的算子实例。每个算子描述包含:- 前提(precondition):一个 wff 模式。要从当前模型证明它的某个实例,算子才能使用。
- 效果:必须加入模型的公式列表,以及不再为真、必须删除的公式列表。
-
目标 (G_0):一个 wff。例如「把箱子 B 和 C 都弄到位置 (a)」写成
AT(B, a) ∧ AT(C, a)。
当某个世界模型能够证明目标公式时,问题求解结束。
搜索策略:手段—目的分析
若对每个模型盲目应用全部可用算子,后继树会大到无法处理。STRIPS 采用 GPS 策略:
- 用定理证明器尝试从当前模型 (M) 证明当前目标 (G)。
- 若证明成功,这一层目标完成。若失败,把未完成的证明当作 (M) 与 (G) 之间的差(difference)。
- 寻找效果能够推进该证明的相关算子;其前提成为子目标。
- 对子目标重复同一过程。子目标在当前模型中可证时,应用对应算子,得到新模型,再回头考虑原来的目标。
一个最小例子:目标 ATR(b)。若机器人不在 (b),证明失败。算子实例 goto(m, b) 相关;子目标是前提 ATR(m)。若初始模型含 ATR(a),则 ATR(a) 可证,应用 goto(a, b) 得到新模型,其中 ATR(b) 成立。
搜索树的每个节点是 (\langle)世界模型, 目标表(\rangle)。相关算子被选出时,并不预先知道它会排在最终计划的第几步。实现上,STRIPS 在一个模型内部调用基于归结的定理证明器处理带参数的 wff 模式,在模型之间维护上述搜索树。论文后半给出在房间中行走、推箱子等实例。
作者标明的限度
- 规划与执行分离:算子应用改变的是模型;物理动作由独立的执行与监控模块负责。
- 框架问题并未从哲学上消失,而是用增删列表把「未列出的公式保持不变」写成操作约定。后来文献称此为 STRIPS 假设。
- 世界必须能被写成谓词;开放文本、传感器噪声、未建模的副作用不在该问题空间内。
关键术语
| 术语 | 在这篇论文里的含义 |
|---|---|
| 世界模型 | 一阶谓词演算公式的集合,描述某一时刻的世界 |
| 算子 / 算子模式 | 动作在模型上的对应物;模式含参数,实例化后才能应用 |
| 前提 | 应用算子前必须从当前模型证明的条件 |
| 增列表 / 删列表 | 应用算子后加入、删除的公式;未列出的公式默认不变 |
| 计划 | 从初始模型走到目标可证模型的算子序列 |
| 差 | 当前模型无法完成目标证明时,未完成证明所代表的缺口 |
| 框架问题 | 如何简洁地表示「动作不改变哪些事实」 |
和 AI Agent 的关系
STRIPS 是符号规划器:谓词写世界,算子搜出计划。它给每个动作附一张效果清单,这层推演正是今日 Agent 所缺。
它的循环在世界模型空间里反复搜索,直到目标可证;动作由执行程序在计划算出之后完成。观察是定理证明器对当前模型的询问,不是开放文本回执。决策核心是定理证明加搜索,世界是谓词集合,而非工具 JSON 或屏幕。后来 LLM Agent 中的 Planning,古典形态就是这一支,控制流在规划器,不在解码过程中。它也不是 ReAct、不是 Function Calling,不是编码运行时的祖先产品。
两者都在做同一件事:让机器自己决定下一步做什么;区别在于如何处理「一个动作会改变什么」,而这个区别决定了各自的能力边界。
STRIPS 的做法,是给每个动作附两张清单。第一张写做这件事需要什么,即前提;第二张写做完之后世界加上什么、去掉什么,即增列表与删列表,合起来就是效果。页面里那个 goto(m, n) 动作,两张清单是:前提「在 m」,效果「去掉『在 m』,加上『在 n』」。
有了这两张清单,规划器就能在动手之前推演。目标是「在 b」,当前是「在 a」,对不上;哪个动作能产生「在 b」?goto(m, b),代入 n=b。它的前提是「在 m」,而当前「在 a」成立,于是 m=a,得到 goto(a, b)。整条链条算完,机器人还没有移动一步。这就是它能搜索、能给出计划的全部依据。
今天的工具不是这样。给模型一份工具说明,上面通常只有参数:「查天气」要城市名,「跑测试」要命令,「发邮件」要收件人和正文。没有哪一份说明会写调用之后世界变成什么样。 模型因此只能反过来做:先把工具调出去,看返回了什么,才知道刚才发生了什么。
这个差别在短任务上看不出来,任务一长就显出来。STRIPS 可以在一棵搜索树里比较不同动作的后果,挑一条走;LLM Agent 没有这棵树,它只有当前上下文里已经发生的事。事先推演退化成事后试错,而试错有两个代价:每一步都真的作用在环境上,每一步都要占用上下文。规划能力弱、失败之后不会修改计划、副作用不可预期,都可以追溯到这里。
那为什么不给今天的工具也补上这两张清单?因为写清单要求环境能够被形式化。goto(m, n) 之所以写得清楚,是因为「位置」可以被写成谓词;而「把这个仓库的测试修绿」没有形式化的状态可写,「订一张去上海的票」牵涉几十个外部系统,都无法事先说清一个动作会改变什么。STRIPS 只能处理能被写成谓词的环境,这就是它的边界。
所以这一页记的不是「Agent 的祖先」,而是一次取舍。古典 Agent 用形式化的世界与效果模型换来可证明的计划,代价是只能处理能被写成谓词的环境;LLM Agent 放弃了这些保证,换来在开放语言空间里的通用性。丢掉的那部分形式化,正好落在今天最不可靠的地方。
2.2 - Contract Net Protocol(1980)
原文:Reid G. Smith, 1980,The Contract Net Protocol: High-Level Communication and Control in a Distributed Problem Solver,IEEE Transactions on Computers C-29(12): 1104–1113。协议在实验系统 CNET(INTERLISP)中实现。Smith 的博士论文与此前关于分布式传感、启发式搜索的应用报告属于同一条工作。
这个概念是什么
Contract Net(合同网)是一套给分布式问题求解用的高层通信协议。多个处理器节点上各有知识源,没有一个节点掌握解整个问题所需的全部信息,也没有全局控制器和全局共享内存,节点之间通过消息合作。
核心机制是把「由谁来做哪一项任务」写成协商:有任务的节点担任经理(manager),空闲且有能力的节点担任承包方(contractor)。双方交换结构化消息,互相选择之后订立合同。节点角色不预先固定,同一节点可以同时对某些合同担任经理、对另一些担任承包方,并把自己接到的任务再分包出去。
底层网络协议负责可靠地传送比特流;高层协议规定节点应该对彼此说什么(任务公告、投标、授予、汇报)。
论文的主要内容
要解决的问题
分布式问题求解有三个特征:合作(单个知识源信息不足)、控制与数据都是分散的、节点之间松耦合。任务共享中必须先解决连接问题:有待执行任务的节点,如何找到最合适的空闲节点。它包含资源分配(负载平衡)与聚焦(搜索中会生成大量对最终解无贡献的任务,最合适的知识源也无法先验指定)。
协商有四个要素:过程是局部的,没有集中控制;信息双向流动;每一方从自己的视角评价信息;最终协议来自互相选择。
基本消息与槽位
任务公告(task announcement) 由产生任务的节点发出,该节点成为这项任务的经理。寻址可以是全网广播、有限广播或点对点。公告有四个主槽:
| 槽 | 作用 |
|---|---|
| 资格说明(eligibility specification) | 投标节点必须满足的条件,用来事先排除明显不合格的投标 |
| 任务摘要(task abstraction) | 任务的简短描述,供潜在承包方在多项公告之间排序 |
| 投标说明(bid specification) | 经理希望投标中提供哪些信息,使投标可比较 |
| 截止时间(expiration time) | 接受投标的期限 |
投标(bid) 在节点空闲、准备接下一个任务时发出。节点维护尚未过期的公告列表,按任务类型排序。投标中的节点摘要按公告的投标说明填写,并可使用 REQUIRE 声明:若中标,需要经理传送额外信息。
授予(announced award) 通知中标者成为承包方,并给出开始执行所需的数据。若已有「满意」的投标,可以在截止时间之前立即授予。
合同执行期间还有:信息消息用于一般通信;汇报分为中期与最终;终止用于经理结束合同及其未完成的分包。扩展包括立即响应投标(BUSY / INELIGIBLE / LOW RANKING)、定向合同(跳过公告与投标),以及负载很高时反向进行的 node available。
论文中的例子:分布式传感
第三节用 CNET 模拟的分布式传感系统(DSS):传感器与处理器节点散布在较大地理区域,要动态维护该区域内的车辆交通图。初始化阶段出现一类 signal 任务:无传感能力但处理能力强的节点担任经理,寻找能提供信号特征的传感器节点。
双方的「理想合同」并不相同。经理希望承包方在空间上覆盖责任区、传感器类型搭配合理;承包方希望经理在地理上足够近。合同网允许把这两种评价写进不同槽位。经理广播的任务公告给出任务类型、位置、资格、投标须填项与截止时间;潜在承包方按距离排序后投标;经理选择能覆盖责任区、类型搭配合理的投标者并授予。
作者标明的限度与设计选择
- 槽位中的具体内容必须由应用填写,协议只提供框架。CNET 提供基于对象—属性—值的简单公共节点间语言,领域词由用户扩充。
- 投标有约束力,且节点允许同时有多个未决投标,因此可能收到多个授予,按到达顺序排队。这些权衡在文中明确写成暂定选择。
- 协议最适合可以划分成相对独立子任务、对全局同步需求不高的问题。子任务之间若需要密集通信,收益会被通信开销抵消。
关键术语
| 术语 | 在这篇论文里的含义 |
|---|---|
| 分布式问题求解 | 分散、松耦合的知识源合作解题;无全局控制与全局数据 |
| 连接问题 | 任务与执行节点如何匹配;含资源分配与聚焦 |
| 经理 / 承包方 | 针对单项任务的角色,不是节点的固定身份 |
| 任务公告 / 投标 / 授予 / 汇报 | 协商的基本消息类型 |
| 公共节点间语言 | 填写槽位时各节点共用的高层编码 |
| 定向合同 | 跳过招标、直接授予已知合适节点 |
| 任务共享 / 结果共享 | 合作的两种风格;后者用请求与信息消息传递部分结果 |
和 AI Agent 的关系
合同网用招标、投标、授予在节点之间分配任务。独立的 Agent 如何连接,这个问题比 A2A 早了四十五年。
它的循环是公告、投标、授予、汇报,合同期内可分包、可终止。消息是节点之间的动作,观察是对方回过来的结构化槽位。决策核心是各节点上的知识源与局部评价函数。
2023 年以后用多个 LLM 角色对话来分工,处理的是同一类问题中的「聚焦」与「谁做什么」,匹配过程通常是提示词里写定的角色,而不是合同网上的公告—投标状态机。2025 年的 A2A 再次规定 Agent 之间如何发现对方、如何交付任务。A2A 使用 Agent Card、任务与消息,运行在 LLM 产品之上;合同网使用资格槽与合同状态,运行在 1980 年的分布式处理器模型上。二者同属「节点间如何连接」这一问题,不是同一份协议的版本迭代,也不是产品谱系。
2.3 - Brooks 包容架构(1986)
架构原文:Rodney A. Brooks, 1986,A Robust Layered Control System for a Mobile Robot,IEEE Journal of Robotics and Automation 2(1): 14–23(DOI)。配套论辩:Brooks, 1991,Intelligence Without Representation,Artificial Intelligence 47: 139–159。1986 年一文给出可实现的分层与模块语言,1991 年一文论证为什么不以中央表征为分解主轴。
这个概念是什么
包容架构(subsumption architecture)是一种移动机器人控制结构。它不按「感知、建模、规划、执行」这种功能管道切分系统,而按机器人对外应表现出的能力层级切分。每一层是一组异步的有限状态模块,模块之间用低带宽「导线」传递消息,没有共享全局内存。
较高层可以通过**抑制(suppress)下层的输入、或禁止(inhibit)**下层的输出,在需要时接管行为。被包容的下层并不被拆除,在高层未能及时给出结果时仍继续产生较低能力层级上的合理行为。只完成第 0 层时,就已经是一台可以运行的机器人;以后增加层级,不必修改已经调试好的下层。
这是具身、反应式路线上的代表性结构。按 边界 一节的划分,物理机器人不进入 LLM Agent 主叙事。它出现在前传中,是因为「Agent 是否必须先有完整世界模型再行动」这条分叉,在 1986 年已经被明确写出来。
论文的主要内容(1986)
要解决的问题
完全自主的移动机器人必须在边界条件快速变化、传感器噪声很大、传感器读数与所需物理量之间没有干净解析映射的环境中实时控制。要求包括:多重目标(可能冲突,相对重要性随情境变化);多传感器(误差与适用范围难以解析刻画);鲁棒(部分失效时仍有合宜行为);可扩展(增加传感器与能力时不应把原有能力拖垮)。
当时的常见做法是把问题切成功能竖条:传感、映射成世界表征、规划、任务执行、电机控制。要让机器人动起来,每一段都必须先实现。Brooks 改成按对外行为做水平切分。
能力层级
能力层级是对「机器人在将遇到的全部环境中应表现出哪一类行为」的非形式规定。高层级蕴含对行为集合的更强约束,并且包含所有更低层级。文中用作工作指引的层级是:
| 层级 | 能力 |
|---|---|
| 0 | 避免与物体接触(物体静止或运动均可) |
| 1 | 无目的游荡且不碰撞 |
| 2 | 看见远处可到达的地方并前往,从而「探索」 |
| 3 | 建立环境地图并规划地点之间的路径 |
| 4 | 注意「静态」环境中的变化 |
| 5 | 按可识别物体推理,并执行与物体相关的任务 |
| 6 | 制定并执行改变世界状态的计划 |
| 7 | 推理物体行为并据此修改计划 |
构造步骤:先实现并彻底调试达到第 0 层能力的完整控制系统,之后不再修改它。再实现第 1 层:它可以观察第 0 层的数据,并向第 0 层内部接口注入数据以抑制原有数据流。第 0 层继续运行,并不知晓上层有时会干扰其数据路径。更高层依此类推。
层的内部结构
每一层由若干小处理器(模块)构成。每个模块是带实例变量的有限状态机,可以保存 Lisp 数据结构。模块完全异步,监视输入线、向输出线发送消息;消息不握手、不确认,允许丢失。层内没有中央控制器。高层对下层的介入只有三种导线终点:接到输出上的禁止、接到输入上的抑制(抑制信号同时作为替代输入)、接到模块的 reset。
模块的状态有四类:输出消息后转入新状态;对实例变量做副作用后转入新状态;按谓词条件分支;事件分派(等待输入到达或延时)。文中给出第 1 层 Avoid 模块的定义:输入为声呐推算出的斥力与期望航向,求和后若力足够大,则向电机发出修正后的运动命令。
第 0 层与第 1 层实例
第 0 层保证机器人不与物体接触。声呐读数经滤波形成以机器人为中心的障碍图。Collide 若发现正前方有物体则发出 halt。Feelforce 把每个检测到的物体当作随距离平方衰减的斥力并求和。Runaway 在合力显著时命令转向。Turn 与 Forward 与实体机器人通信。文中报告:在数小时自主运行中,实体机器人未与静止或运动障碍碰撞(运动障碍被控制为慢速)。
第 1 层加上无目的游荡。Wander 每隔约十秒产生新航向。Avoid 把第 0 层的力与该航向合成。该输出抑制 Runaway 进入电机模块的信号,从而在有航向可考虑时包容第 0 层的逃逸计算。接线图是在第 0 层图上增加模块与导线,不改动原有模块。
第 2 层(文中已开始实现)用视觉选择有兴趣的地点,沿自由空间走廊伺服,同时仍由声呐处理局部障碍。
设计原则与 1991 年的论辩
1986 年一文列出若干工作假设,其中包括:复杂行为不必来自复杂控制系统,而可以是复杂环境的反映;接口一旦复杂到可与被连接部件相比,就应重做分解;不用绝对坐标系而用关系地图。1991 年 Intelligence Without Representation 把分解原则说得更明确:智能系统的根本分解不是必须经由表征互相接口的信息处理单元,而是并行的活动产生器,它们各自通过感知与行动直接与世界接口。中央与外围的区分在这种看法下被取消。
关键术语
| 术语 | 在这篇论文里的含义 |
|---|---|
| 能力层级 | 对外部行为类别的规定;高层包含低层 |
| 包容 | 高层通过抑制输入或禁止输出接管,下层继续运行 |
| 模块 | 异步有限状态机,用消息通信,无全局共享内存 |
| 抑制 / 禁止 | 替代输入、丢弃输出的两种介入 |
| 功能分解 vs 行为分解 | 按内部功能竖切,或按对外行为横切 |
和 AI Agent 的关系
包容架构按对外行为分层控制机器人,高层抑制下层。它证明 Agent 不必先建完整世界模型。
它的循环由传感器与电机持续驱动,层与层异步并行,动作与观察都在其中。决策核心是有限状态布线;没有中央世界模型,也没有先搜索出来的完整计划。
STRIPS 与后来的思维链、ReAct 属于先形成(或边形成)对下一步的显式推理、再行动的路线。包容架构给出明确的反例:可以没有中央世界模型,仍然构成当时文献中的自主 Agent(机器人控制意义下)。AI Agent 定义要求多步循环和对环境行动,不要求必须先产出完整符号计划。这一页防止把「先规划再执行」写成 Agent 的唯一定义条款。
2024 年以后的 Computer Use、浏览器操作在机制上是「根据当前观察选择动作」,与符号规划器不同,也与 1986 年的有限状态布线不同,不能写成包容架构的产品后裔。具身机器人整体仍划为相邻领域。
2.4 - BDI(1991)
形式化原文:Rao & Georgeff, 1991,Modeling Rational Agents within a BDI-Architecture,KR 1991,pp. 473–484。实现向的配套报告:Rao & Georgeff, 1995,BDI Agents: From Theory to Practice(ICMAS)。哲学来源:Michael Bratman, Intention, Plans, and Practical Reason(1987)。对照对象:Cohen & Levesque, 1990,把意图定义成信念与目标的时序公式。
这个概念是什么
BDI 指一类把 Agent 的内部状态分成三种态度的架构:
- Belief(信念):Agent 认为世界处于何种状态;可以为假,需要随观察修正。
- Desire / Goal(愿望 / 目标):Agent 希望达成的状态。论文把目标收窄为已选定、且内部一致的愿望,并且 Agent 必须相信该目标是可达成的。
- Intention(意图):Agent 已承诺去尝试实现的那些行动方案。意图是部分的行动计划,对后续推理有约束,不能还原为「信念加上愿望」。
Bratman 的论题是:意图在实践推理中有独立作用。它是尚未完成的部分计划,会控制行为、排除与之冲突的其他选项,并具有惯性。Rao 与 Georgeff 把这一论题写成可能世界语义,使意图与信念、目标平级,从而可以讨论不同的承诺策略。
BDI 系统的决策核心是符号结构与规则,属于 1990 年代智能体文献中的 Agent。
关键术语:可能世界
BDI 的形式化建立在一个反直觉的做法上:它不把世界写成一个状态,而是写成这个 Agent 认为哪些状态是可能的。
日常说法里,「Agent 相信外面在下雨」是对世界的断言。在可能世界语义里,它被改写成「在 Agent 认为可能的每一个世界里,外面都在下雨」。两句听起来等价,差别在于后者显式承认了世界是复数:Agent 不知道的事,表现为有多个世界都符合它已知的一切。
这个做法是三态度的共同基础。信念、目标、意图都不直接描述世界,而是描述「在哪些世界里成立」。信念对应 Agent 认为可能的那些世界,目标与意图再在这之上各选一层。意图之所以不能化简为「信念加愿望」,正因为它是一层独立的选定,而不是从前两层推导出来的。
时间树是这套结构的形状。从一个时间点往后看,未来分叉,过去只有一条线;树上某个世界的某个时间点叫一个情景。分支表示 Agent 当时可做的选择,事件把情景推到下一个。执行可能成功也可能失败,两种结果在树上都标出来,所以 Agent 可以对意图采取行动,而不被要求每次尝试都成功。
关键术语:慎思
BDI 把实践推理(practical reasoning)拆成两个问题,各有专名:
| 问题 | 名称 |
|---|---|
| 我该做什么 | 慎思(deliberation) |
| 我该怎么做 | 手段—目的推理(means-end reasoning) |
慎思是在若干可采纳的手段中,挑出要承诺去执行的那些。它在解释器循环里的位置是「生成选项」之后的下一步(见下文「从理论到解释器」一节):先用手段—目的推理找出有哪些办法能达到目标,再由慎思在它们之间选定并成为意图。这个二分来自 Bratman,他把「决定做什么」与「决定怎么做」当成两种不同的推理,而不是一个过程的两个阶段。
慎思不只是「挑一个」。它要回答两个问题:哪些新选项应当被采纳为意图,以及已有的意图是否要重新考虑。第二个问题正是后面那张承诺策略表要处理的事——盲目承诺、一心一意、开放三者的差别,就在于慎思允许多频繁地推翻已承诺的意图。省略这一层,「慎思」与「选一个」便没有区别。
「慎思」取自《中庸》「慎思之」,是 deliberation 的通行译法。Wooldridge & Jennings 把 Agent 架构分为慎思式、反应式、混合三类,用的是同一个词;那里指整类系统「先推理再行动」的设计路线,这里指循环中的具体一步。
论文的主要内容(1991)
要解决的问题
已有形式化(尤其 Cohen & Levesque)把意图写成信念与目标的某种时序组合。Rao 与 Georgeff 认为这样无法把意图当作一等对象,也难以对意图本身施加与目标不同的持续性条件。他们要给出另一种可能世界形式化,使:
- 意图与信念、目标平级,不能化约;
- 区分 Agent 可选择的行动分支,与行动执行后由环境决定的结果;
- 信念、目标、意图之间有兼容关系,以避免「连不愿接受的副作用也一并承诺」。
时间树与模态
世界被建成时间树:未来分支、过去唯一。某一世界中的某一时间点称为一个情景。事件类型把时间点变成另一时间点。原子事件由 Agent 直接执行,并唯一决定下一时间点;非原子事件对应不相邻时间点,用来表示部分计划及其向原子事件的分解。
从某一时间点伸出的分支表示 Agent 当时可做的选择。执行可能成功或失败,分支按此标记,从而 Agent 可以对意图采取行动,而不被要求每次尝试都成功。
逻辑是分支时间逻辑 CTL* 的一阶、多模态扩充。公式分状态公式与路径公式。optional φ 表示从该点出发至少有一条路径使 φ 成立;inevitable φ 表示所有路径皆然。再加上 next / eventually / always / until。BEL(φ)、GOAL(φ)、INTEND(φ) 都是状态公式。事件方面有 succeeds(e)、fails(e)、does(e) 以及对应的过去时形式。
信念、目标、意图的可达世界
在每个情景上:
- 信念可达世界:Agent 认为可能的那些世界。每个可达世界本身仍是一棵时间树:多世界来自对当前状态的无知,世界内部的分支则是 Agent 仍可选择的行动。
- 目标可达世界:表示已选定的目标。目标必须一致;并且采用 strong realism:Agent 须相信通过审慎选择事件,目标可以可选地达成。实现方式是:对当前的每个信念可达世界 (w),在同一时刻必须存在一个目标可达世界,它是 (w) 的子世界。
- 意图可达世界:Agent 已承诺去尝试实现的世界。兼容条件平行:每个目标可达世界在同一时刻必须有一个作为其子世界的意图可达世界。
反之不成立:即使 Agent 相信某事实不可避免,也不被迫把它收为目标或意图。因此目标与意图须一致,但不必在信念下封闭。文中的例子:Agent 相信「补牙不可避免伴随疼痛」,仍可以有「去补牙」的目标,而不必有「去疼痛」的目标。
1991 年论文的第 3 节给出解释 (M = \langle W, E, T, \ldots, B, G, I, \Phi \rangle) 与满足关系;第 4 节讨论态度如何形成、维持、修正。承诺策略的直观分类在后续 BDI 文献中稳定为三类(1995 年实践论文中写得更便于实现对照):
| 策略 | 放弃意图的条件 |
|---|---|
| 盲目承诺(blind / fanatical) | 直到相信已成功,或相信已不可能 |
| 一心一意(single-minded) | 上述条件,或目标本身已被放弃 |
| 开放(open-minded) | 信念变化导致目标不再成立时也可以放弃 |
从理论到解释器(1995)
1995 年 BDI Agents: From Theory to Practice 给出与上述语义对应的解释器循环:
初始化状态
重复:
选项 := 根据事件队列生成选项
选定 := 对选项做慎思(deliberate)
用选定结果更新意图
执行当前意图中的一步
获取新的外部事件
丢掉已成功的态度
丢掉已不可能的态度
「选项」对应可采纳的手段,「慎思」对应从愿望中筛选意图,「执行」对应对已承诺计划采取一步行动。事件队列把环境观察接入信念修正。这一循环是 BDI 作为软件架构时最常被引用的部分;1991 年论文则是其语义依据。
关键术语
| 术语 | 在这篇论文里的含义 |
|---|---|
| 信念可达世界 | Agent 认为可能的时间树集合 |
| 目标 vs 愿望 | 目标是一致的、且被相信可达成的选定愿望 |
| 意图 | 已承诺尝试实现的部分计划;与信念、目标平级 |
| 子世界兼容 | 目标是信念的子世界,意图是目标的子世界 |
| strong realism | 须相信目标可通过选择行动可选地达成 |
| 承诺策略 | 意图在成功、失败、目标变化、信念变化时如何持续 |
| 副作用问题 | 相信「φ 蕴含 ψ」时,对 φ 的意图是否强制带上 ψ |
和 AI Agent 的关系
BDI 用信念、愿望、意图三种态度描述理性 Agent。今日产品里的 goal、plan、memory,是这套词汇的通俗版。
解释器的循环是:事件进队列、慎思、执行一步、再取外部事件,动作与观察都在其中。决策核心是符号态度上的规则与承诺策略。
LLM 产品里出现的 memory、goal、plan、todo,与 BDI 三态度在问题上对应:系统对世界有一个当前看法,有一个要达成的目标,有一个正在执行、不应每一步都推翻的计划。在实现上不对应:没有可能世界可达关系,也没有上述解释器中那种形式化的选项生成与承诺策略。上下文窗口、检索、频道记忆承担的是信念的工程替代;系统提示或用户请求承担的是目标;运行时任务列表承担的是意图。这一页不把「长期记忆」写成 BDI 的复活,也不把 2023 至 2025 年的 Agent 运行时写成 BDI 解释器换核心。
2.5 - Wooldridge & Jennings(1995)
原文:Wooldridge & Jennings, 1995,Intelligent Agents: Theory and Practice,The Knowledge Engineering Review 10(2): 115–152。DOI。这是一篇面向当时研究社区的长综述,不是新模型论文。作者在摘要中写明:目的是标出设计与构造智能体时最重要的理论与实践问题,并指向展开这些问题的工作;不打算写成对所有议题的教程。
这个概念是什么
到 1995 年,「Agent」已经同时出现在人工智能与主流计算机科学里,但用法不统一。这篇综述做了两件对后来教学影响很大的事:
- 把议题分成三块——Agent 理论、Agent 架构、Agent 语言——即使分界有时任意,也足以把「是什么」「做成什么结构」「用什么语言写」分开讨论。
- 给出两套沿用至今的定义口径:弱概念(来自计算机科学一侧的四个属性)与强概念(再叠加上知识、信念、意图等心智谓词)。
它不提供一个可运行的规划器或通信栈,而是提供一张 1990 年代中期的问题地图。后面读 STRIPS、BDI、包容架构、FIPA 时,可以用这张地图给材料定位。
论文的主要内容
弱概念:四个属性
作者从计算机科学文献中归纳出,若称一个硬件或软件系统为 Agent,通常至少要求:
| 属性 | 论文中的含义 |
|---|---|
| 自主(autonomy) | 无需他人持续直接干预即可运行;对自己的行为和内部状态有控制 |
| 社交能力(social ability) | 通过某种 Agent 通信语言与其他 Agent(以及可能的人类)交互 |
| 反应性(reactivity) | 感知环境,并在环境变化时及时作出响应 |
| 主动性(pro-activeness) | 不只被动响应,还能采取目标导向的主动行为 |
这四条后来被大量教材与产品文档转述。论文自己的限度:这是对当时用法的归纳,不是一组已经配备操作化度量的测试。恒温器勉强可以装进「感知并响应」;社交能力与主动性则把许多脚本系统排除在外,但仍比 AI Agent 定义宽。弱四条已经假定感知与行动;它们不指定决策核心是什么。
强概念:心智谓词
在 AI 研究中,Agent 还常被赋予人类才使用的心智描述:知识、信念、意图、义务等。作者称之为强概念。这一侧与 BDI 直接相接:不是「系统会不会动」,而是「用哪些内部态度解释和设计它的选择」。
弱概念与强概念不是互斥的两代产品,而是两套描述粒度。一个 BDI 系统通常被期望同时满足弱四条,再用信念—目标—意图去说明它如何满足。
三块议题
理论处理「Agent 是什么」以及用何种数学形式表示和推理其性质。内容包括:如何形式化信念与目标、意图与承诺、Agent 之间的义务与规范、合作与冲突。Cohen & Levesque、Rao & Georgeff 的工作落在这一块。理论工作的目标是可陈述的性质,不等于已经得到可高效执行的程序。
架构是满足理论性质的软件或硬件组织方式。综述把当时架构分成三类:
- 慎思式(deliberative / symbolic):内部有符号世界模型,决策通过规划、定理证明等符号操作完成。STRIPS 式规划器属于这一端。限度是:表征是否赶得上环境变化(calculemus 问题)、符号接地。
- 反应式(reactive):决策主要由当前感知到的情境触发,不经过(或不依赖)完整中央模型。Brooks 包容架构 是这一端的代表。限度是:如何处理需要长时间跨度信息的任务、如何从局部行为得到可预测的全局目标达成。
- 混合式(hybrid):常见做法是分层,一层反应、一层慎思,用中间层协调。分层本身不能自动解决层间接口问题。
语言指用于编程和实验 Agent 的软件系统。文中评述的包括 Agent0、PLACA、Concurrent MetateM 等:重点是语言把哪些理论概念变成可写的原语(承诺、消息、并发规则),而不是给出通用运行时。
文章后部用当时的应用(工作流、电信、空管、信息管理等)说明:工业兴趣已经出现,但可移植的工具链仍弱。这一判断与一年后 FIPA 开始写互操作标准的动机是同一背景。
作者标明的限度
摘要与导言反复说明:分三块是为了方便,分界并不干净。综述指向文献,不代替任何一篇原论文。弱四条是用法归纳,用来帮助读者辨认讨论对象,不是形式化定义。
关键术语
| 术语 | 在这篇论文里的含义 |
|---|---|
| 弱概念 | 自主、社交、反应、主动四属性 |
| 强概念 | 在弱概念之上使用心智谓词 |
| Agent 理论 | 用形式系统陈述 Agent 的性质 |
| Agent 架构 | 慎思 / 反应 / 混合等软件或硬件组织 |
| Agent 语言 | 把理论概念写成可编程原语的系统 |
和 AI Agent 的关系
它把 Agent 研究分为理论、架构、语言三块,并给出沿用至今的弱四条口径。本站的栏目结构与之对应。
本站的栏目分工与这三块对应,但对象已经收窄为 LLM Agent:定义页对应「是什么」;时间线对应性质何时变得可工程化;协议栏对应社交能力这一条如何被写成 MCP / A2A;Agents 与基础设施对应架构与运行时。Wooldridge 与 Jennings 没有讨论语言模型。
弱四条已经覆盖循环、动作、观察中的若干条(反应、主动、社交)。AI Agent 定义是在弱/强概念之后再增加约束:决策核心必须是 LLM,并且具备多步循环、对环境行动、按反馈迭代。弱四条单独使用时,仍会把大量非 LLM 系统算进来。这一页用来理解 1995 年社区内部的分类,而不是替换工作定义,也不是 2022–2025 运行时的设计说明书。
2.6 - Russell & Norvig《人工智能:一种现代方法》(1995)
材料:Stuart Russell & Peter Norvig,Artificial Intelligence: A Modern Approach,第 1 版,Prentice Hall,1995。这是教科书,不是会议论文。对 Agent 的集中表述在第 2 章 Intelligent Agents。后续版本(2003、2010、2020)在同一框架上补充了环境性质的分类表,以及用 PEAS(Performance, Environment, Actuators, Sensors)组织设计问题的写法。下面以第 1 版的定义为主,不把后版才固定的口号倒填为 1995 年原文。
这个概念是什么
AIMA 把人工智能的研究对象统一写成 Agent:任何可以被视为通过传感器感知环境、并通过执行器(第 1 版用 effectors)作用于环境的东西。Agent 的行为对错,不按「是否像人」来判,而按给定性能度量在该环境中的表现来判。在这个标准下,恒温器、棋手、诊断程序、机器人都是 Agent。
这套定义的目的是给整本教材一条脊梁:搜索、逻辑、规划、学习都可以写成「如何构造更合理的 Agent 程序」。它不是 2023 年以后那种软件产品分类,也不区分决策核心是规则、搜索、强化学习还是语言模型。
本站后来使用的「LLM Agent」是对这套定义的收窄,不是对它的否定。收窄的理由写在 什么不是 AI Agent。
材料的主要内容(第 2 章框架)
Agent 与环境
教科书给出的基本图是闭合回路:环境产生可被感知的刺激,Agent 经传感器得到感知(percept),输出行动,行动改变环境,下一时刻的感知依赖于环境的新状态。完整的输入历史称为感知序列。
作者区分两个层面:
- Agent 函数:从感知序列到行动的数学映射,描述理想行为。
- Agent 程序:在某种架构上实现该映射的具体程序。教材关心的是如何设计程序,使其在目标环境中逼近合理的 Agent 函数。
理性
理性 Agent 的标准(第 1 版的表述,后续版本沿用同一思想)是:对每一个可能的感知序列,理性 Agent 应选择这样一个行动——在该感知序列所提供的证据、以及 Agent 所具有的先验知识之下,期望最大化其性能度量。
几条经常被误读、需要按教材原意明确的推论:
- 理性不等于全知。Agent 无法根据未感知到的信息行动。
- 理性不等于事后正确。在不确定环境中,按期望最优仍可能得到坏结果。
- 理性允许(在有益时)收集信息,也允许学习;「一开始知识很少」并不自动非理性。
- 性能度量由设计者在 Agent 之外给定,不是 Agent 自己宣布「我成功了」就算数。
环境与 Agent 程序的类型
第 1 版已经按可观测性、确定性、情节性、动态性、连续或离散等维度讨论环境,并据此说明哪种程序结构够用。后续版本把这些维度列成表,便于出题;内容没有离开第 2 章的原意。常见的程序类型包括:
| 类型 | 决策依据 |
|---|---|
| 简单反射 | 当前感知与规则(条件—行动) |
| 带内部状态的反射 | 当前感知 + 对未观测世界的内部估计 |
| 目标驱动 | 内部模型 + 目标,需搜索或规划 |
| 效用驱动 | 在多个可达目标之间用效用函数比较 |
| 学习型 | 以上任一结构,加上从经验改进组件的机制 |
STRIPS 属于目标驱动这一档的经典规划实现。BDI 在教材分类里仍是目标驱动,但内部状态被写成三种态度。包容架构 更接近多层反射,而不是先搜出计划。任务型对话 的状态机填槽,是反射加内部对话状态,目标集合通常封闭。
后续版本中的 PEAS 把设计一个 Agent 时必须同时交代的四件事写成检查清单:性能度量、环境、执行器、传感器。第 1 版已经要求这四件事一起谈;PEAS 只是后来的命名。整理笔记时可以用这个清单检查描述是否完整,但应标明它是后续版本的整理。
这一定义有多宽
因为判定标准只含感知、行动、环境、性能,所以:
- 恒温器是 Agent:感知温度,行动是开关加热器,性能可以是温度偏差。
- 国际象棋程序是 Agent:感知棋盘,行动是合法走子,性能是胜负。
- Siri 一类助手是 Agent:感知语音,行动是调用厂商 API,性能可以是任务完成率。
教材需要这个宽度,才能把人工智能各分支写进同一章。本站若沿用这个宽度,「AI Agent 时间线」会变成人工智能通史,与 调研方法 的边界冲突。
关键术语
| 术语 | 在这本教材里的含义 |
|---|---|
| Agent | 通过传感器感知环境、通过执行器行动的任何东西 |
| 感知序列 | Agent 迄今收到的全部感知 |
| Agent 函数 / 程序 | 理想映射与具体实现 |
| 理性 | 在每个感知序列上选择期望最大化性能度量的行动 |
| 性能度量 | 在 Agent 外部给定的评价标准 |
| 环境性质 | 可观测、确定、情节、动态、离散等,用来选程序结构 |
和 AI Agent 的关系
教材用理性 Agent 统摄 AI:感知、行动、环境、性能度量。今天人们普遍使用 Agent 一词,很大程度上来自这里。
教材四元组里,循环、动作、观察已经画在第 2 章的图上。收窄发生在决策核心与迭代条款:
| 教材 | 本站的工作定义 |
|---|---|
| 感知 | 保留,具体化为工具回执、屏幕、仓库等观察 |
| 行动 | 保留,且必须改变环境,不能只生成文本 |
| 环境 | 保留,主线限制在软件环境 |
| 性能度量 | 保留,要求可核对的评测或交付,不以厂商自称代替 |
| (不限制决策核心) | 必须由 LLM 选择下一步 |
| (不强制多步迭代) | 必须有多步循环,并依据反馈再决策 |
因此 Siri 在 AIMA 中是 Agent,在本站的工作定义中降为助手。Wooldridge & Jennings 的弱四条是研究社区内部的入口,仍宽于本站的工作定义,但已经比恒温器窄(要求社交与主动)。AIMA 是课程与大众读物的入口,是「人人会说 Agent」的主要来源。它不是 2022–2025 LLM Agent 产品的规格书。
2.7 - FIPA 与 ACL(1996 起)
组织与规范:FIPA(Foundation for Intelligent Physical Agents)。1996 年 4 月在伦敦 Imperial College 讨论建制,1996 年 9 月在日内瓦登记为瑞士非营利协会,目标是为异构、会交互的 Agent 与 Agent 系统编写软件标准。第一批规范以 FIPA 97 发布。2005 年 6 月 8 日,FIPA 成为 IEEE Computer Society 的标准委员会。现行规范仍集中在 fipa.org 的 Repository。
直接相关的规范包括:FIPA 97 第 1 部分 Agent Management、第 2 部分 Agent Communication Language;其后拆成的 FIPA ACL Message Structure Specification(SC00061)、FIPA Communicative Act Library Specification(SC00037)、FIPA Contract Net Interaction Protocol Specification(SC00029)等。
这个概念是什么
FIPA 要规定的不是某一个演示程序,而是不同厂商实现的 Agent 如何互操作。互操作被拆成三层,需要同时成立:
- Agent 平台:Agent 如何被命名、创建、注销、定位;如何被目录检索。
- 通信语言 ACL:消息不是自由文本,而是带施事语力(performative)的言语行为,并带有发送者、接收者、内容、语言、本体、协议、会话标识等字段。
- 交互协议:在 ACL 之上规定一类对话的合法消息顺序,例如请求、查询、合同网招标。
ACL 的语义建立在言语行为理论(Austin、Searle)上,并把前提条件与理性效果写在发送者、接收者的心智状态中——与 BDI 使用同一类词汇(信念、意图)。内容本身另用内容语言写出,双方还须共享本体,否则谓词没有共同指称。
关键术语:言语行为
FIPA ACL 把消息当作行为,而不是一段文本。这来自语言学里的言语行为理论(Austin、Searle):说话本身就是在做事。
同一句话说出来,可以是通知,可以是请求,也可以是承诺。区分它们的不是内容,而是施事语力(illocutionary force)。FIPA 把它写成消息的一个字段:inform 表示「我通知你某命题,并且我相信它」,request 表示「我请求你去执行某个动作」。内容字符串相同,施事语力不同,对话中的义务就不同。
这条设计有两个直接后果。
一是 ACL 的语义写在参与者的信念与意图上,用的是与 BDI 同一套词汇。inform 的规范语义是「发送者相信该命题,且意图使接收者也相信」。代价是心智状态无法从外部观察,这些语义作为合规标准时难以验证。
二是只有消息格式还不够,双方还要共享本体。weather(today, raining) 这段内容,只有在双方对 weather、today、raining 的指称理解一致时才有意义;字段 ontology 就是用来声明这一点的。共享本体的成本高,是 FIPA 生态没有长起来的原因之一。
材料的主要内容
Agent 平台
FIPA 的 Agent 平台(Agent Platform)是 Agent 的运行与管理环境,规范中的核心服务包括:
| 组件 | 职责 |
|---|---|
| AMS(Agent Management System) | 白页:Agent 标识、生命周期(创建、挂起、终止)、平台权威 |
| DF(Directory Facilitator) | 黄页:Agent 注册自己能提供的服务,供其他 Agent 按服务描述查找 |
| MTS / ACC(消息传输 / Agent 通信通道) | 在平台之内以及平台之间传递 ACL 消息 |
一个符合规范的 Agent 通过 AMS 获得标识,通过 DF 被发现,通过 MTS 收发 ACL。这与后来 Web 服务的注册—发现—调用在问题上同类,但绑定的是 Agent 标识与言语行为,而不是 HTTP 资源。
ACL 消息结构
一条 FIPA ACL 消息的主要字段(SC00061)包括:
| 字段 | 作用 |
|---|---|
| performative | 施事语力,决定这条消息在做什么(通知、请求、招标等) |
| sender / receiver | 发送者与接收者的 Agent 标识 |
| content | 内容,其含义相对于 language 与 ontology |
| language | 内容语言(例如 SL、Prolog) |
| ontology | 内容中谓词与常量所属的本体 |
| protocol | 所遵循的交互协议名称 |
| conversation-id | 会话标识,把多条消息绑成一次对话 |
| reply-with / in-reply-to | 用于把回复对齐到先前消息 |
示意(字段值仅为说明结构):
(inform
:sender (agent-identifier :name agent-a)
:receiver (agent-identifier :name agent-b)
:content "weather(today, raining)"
:language Prolog
:ontology weather-ontology
:protocol fipa-request
:conversation-id conv-001)
inform 表示发送者通知接收者某命题,并且(按规范语义)发送者相信该命题,且意图使接收者也相信。若换成 request,内容则是发送者意图使接收者执行的行动。同一段内容字符串,施事语力不同,对话中的义务就不同。
交际行为库
SC00037 给出交际行为(communicative act)库。常用的包括:
| 交际行为 | 直观作用 |
|---|---|
| inform / confirm / disconfirm | 通知或(不)确认一个命题 |
| request / request-when / request-whenever | 请求对方现在、在条件成立时、或每当条件成立时行动 |
| query-if / query-ref | 询问命题真假,或询问使公式成立的项 |
| cfp | 招标(call for proposals),合同网的起点 |
| propose / accept-proposal / reject-proposal | 提出、接受、拒绝提案 |
| agree / refuse | 同意或拒绝先前的请求 |
| failure / not-understood | 执行失败,或不理解对方消息 |
| subscribe | 订阅此后满足某条件的通知 |
| cancel | 取消先前请求 |
每个行为的规范语义用 SL(Semantic Language)写出可行性前提与理性效果,绑定在参与者的信念与意图上。后续分析文献指出一个困难:心智状态不可从外部观察,因此这些语义作为规范性标准时难以验证(见 Pitt & Mamdani 等对 FIPA ACL 语义的讨论)。作为实现者的指引,行为库仍然给出了消息类型的稳定清单。
交互协议:以合同网为例
FIPA 把 Contract Net 收成 FIPA Contract Net Interaction Protocol(SC00029)。消息顺序被规定为:发起者发出 cfp → 参与者回复 propose 或 refuse → 发起者 accept-proposal 或 reject-proposal → 被接受的参与者返回 inform(结果)或 failure。协议图还处理超时、取消、not-understood。相对 1980 年论文,这里把协商从「一种应用层约定」提升为「可被不同实现共同遵守的会话类型」,并且每一步都必须是合法的 ACL 交际行为。
FIPA 另外还规定了 request、query、若干拍卖类协议。设计意图是:只要双方声明同一 protocol 与 ontology,异构实现可以完成同类对话。
规范与生态的结果
FIPA 完成了规范文本,并在 Agentcities 等项目中做过互操作试验。它没有成为与 HTTP 同级的互联网默认栈。后来文献中反复出现的原因包括:共享本体成本高;语义绑定在不可观察的心智状态上,符合性测试困难;缺少类似浏览器那样的大规模宿主应用;Web 服务与 REST 从另一侧接手了系统集成。规范仍可查阅;当代软件工程日常栈几乎不经过 AMS/DF/ACL。
2005 年并入 IEEE,说明标准组织身份还在,不等于生态已经长成。
关键术语
| 术语 | 在这套规范里的含义 |
|---|---|
| Agent 平台 | AMS + DF + 消息传输构成的管理与通信环境 |
| ACL | 带施事语力与会话字段的消息语言 |
| 交际行为 / performative | 消息在对话中所实施的那种行为 |
| 本体 | 内容语言中符号的共享词汇与约束 |
| 交互协议 | 合法消息顺序,例如 FIPA-Contract-Net |
| SL | 用于书写 ACL 语义的逻辑语言 |
和 AI Agent 的关系
FIPA 为异构 Agent 规定平台、通信语言与交互协议,是 Agent 互操作最早的系统尝试。规范完成,但未成为业界默认。
它的循环由交互协议规定:会话期内有请求、回复、失败、取消,消息是动作,对方的 ACL 是观察。决策核心不在规范里:规范假定参与者已经是 Agent,其内部如何选择下一步(规则、BDI、规划器)由实现自定,不是 LLM。
时间线上这是明确的标准建立型节点,结果偏警示:规范可以写完,生态可以不出现。2024 年的 MCP 与 2025 年的 A2A 处理的问题分别是「模型如何接工具」和「Agent 如何接 Agent」。它们出现在 ChatGPT、Claude 等产品已经存在之后,是把已经在用的调用方式收敛为事实标准,与 FIPA「先写全规范再等待实现」的顺序相反。不是同一套协议的版本迭代。
2.8 - Siri / Alexa / 任务型对话(2011–2014)
这一页对应的不是单篇开山论文,而是一条从实验室对话系统到消费级语音助手的产品线。需要同时看清三层材料:
- 任务型对话(task-oriented dialogue, TOD) 作为研究方法:在封闭任务上收集信息并调用后端。
- 典型流水线 作为系统结构:语音识别 → 自然语言理解 → 对话状态 → 对话策略 → 自然语言生成 → 后端 API。
- Siri(2011)、Alexa(2014) 作为把该结构做成大众产品的节点。
框架式对话的早期系统可追溯到 Bobrow 等,GUS, A Frame-Driven Dialog System,Artificial Intelligence 8: 155–173(1977)。统计对话管理的综述见 Young 等,POMDP-based Statistical Spoken Dialogue Systems: A Review,Proceedings of the IEEE 101(5): 1160–1179(2013)。Siri 源于 SRI 的 CALO 项目衍生公司,2010 年被 Apple 收购,2011 年 10 月 4 日随 iPhone 4S 发布。Alexa 随 Amazon Echo 于 2014 年 11 月 6 日发布;其开发者模型(技能、意图、槽位)把 TOD 结构写成了公开接口。
这个概念是什么
任务型对话系统的目标是:在一个预先规定的任务集合里(订票、查天气、设闹钟、放音乐、控制家电),通过多轮对话收集执行该任务所需的参数,然后调用后端服务,再把结果说给用户。
与闲聊系统不同,TOD 有可核验的完成条件:槽位是否填齐、API 是否调用成功、用户目标是否在该任务模式内。与 STRIPS 不同,这里的「计划」通常不是现场搜索出来的动作序列,而是任务模式已经写好,系统只决定下一步问哪个槽、何时调用哪个 API。与 AI Agent 定义不同,下一步由分类器、状态机或在固定状态空间上训练的策略选择,不是由语言模型在开放动作空间里决策。
Siri 与 Alexa 是 TOD 的规模化形态:它们把上述流水线接到语音接口和厂商服务目录上,使「对着设备说话、它去办事」成为消费品。Google Assistant 等属于同一架构家族,这里不另开条目。
关键术语:槽位
槽(slot)是任务的参数位。一个任务需要哪几项信息,每项就是一个槽;把对话推进下去,就是把这些槽逐一填满。
这个词不来自对话系统,而来自 1970 年代的框架(frame)表示法:一个框架描述一类典型情境,框架里有若干槽,每个槽留出位置等着被填。GUS 把这套做法用到对话上,改用框架表示任务。以订机票为例:
| 槽位 | 槽值示例 | 性质 |
|---|---|---|
| 出发地 | 北京 | 必填 |
| 目的地 | 上海 | 必填 |
| 日期 | 明天 | 必填 |
| 舱位 | 经济舱 | 选填 |
四个性质在后面反复用到。槽位集合是封闭的:槽在设计时就定死,用户在领域外提出的要求没有对应的格子可放。必填与选填决定追问顺序,对话策略的工作就是选下一个要问的槽。一句话可以填多个槽,那是抽槽的结果,不是多轮。已填的槽可以被覆盖,处理修正与冲突是对话状态跟踪的职责。
槽位与今天的工具 schema 是同一个东西:schema 里的字段名与类型,就是一套槽位定义;模型给参数赋值,就是填槽。两边都把槽位集合定死,区别只在「下一步填哪一项」由谁决定——经典 TOD 交给状态机或封闭状态空间上的策略,LLM Agent 交给模型自己。变的是决策核心,不是这个数据结构。
材料的主要内容
框架与槽位(GUS 一线)
GUS(1977)用**框架(frame)**表示一个任务,框架里的槽就是上文所说的参数位。系统维护当前框架的填充状况:已填、未填、有冲突。用户一句话被分析后,用于填写或修正槽;若关键槽仍空,系统生成追问;槽足够时触发后端(当时是数据库查询),再生成回复。
这一结构后来的标准术语是:
| 术语 | 含义 |
|---|---|
| 领域(domain) | 系统被设计处理的任务范围,如「机票」 |
| 意图(intent) | 用户这句话属于哪一种任务模式,如 SetAlarm、PlayMusic |
| 槽位 / 槽值 | 该意图的参数名与当前值 |
| 对话状态 | 本轮为止的意图、槽值、待澄清项;有时含对话历史摘要 |
| 对话策略 | 根据状态选择下一系统动作:追问、确认、调用 API、结束 |
系统动作集合是封闭的。用户若提出领域外请求,经典 TOD 没有「现场发明新工具」的步骤,只能拒识或落入兜底回复。
流水线各模块
消费级语音助手把 GUS 式循环接到语音与服务上,模块通常如下。名称因厂商而异,信息流一致。
- ASR(自动语音识别):波形到文本。
- NLU(自然语言理解):从文本预测意图,并抽槽。可以是规则、统计分类器或后来的神经网络;输出仍是意图标签加槽值,不是开放计划。
- DST(对话状态跟踪):把本轮 NLU 结果并入累计状态,处理更正(「改成七点」)、指代、跨轮槽位。
- 对话管理 / 策略:在当前状态下选择系统动作。实现可以是手写状态机、基于部分可观察马尔可夫决策过程(POMDP)的统计策略(Young 等综述的对象),或后来的神经网络策略。动作空间仍是设计者给定的。
- NLG + TTS:把系统动作变成文本并合成语音;早期多为模板。
- 后端 API / 技能:真正改环境的一步(写日历、控灯、播歌)。可调用的服务列表是厂商或技能开发者注册的封闭目录。
循环存在:缺槽则追问,槽齐则调用,调用失败则报错或换策略。循环的控制图在部署前已经画好。这与「给一个开放目标,由决策核心选择尚未注册的工具并在失败后改写计划」不是同一对象。
POMDP 一线(Williams & Young 等,2000 年代至 2010 年代初)把对话状态写成对用户真实意图的概率分布,用强化学习在该信念上选动作,用来应对 ASR/NLU 错误。它增强的是在封闭任务内的鲁棒性,并不把任务集合或工具集合开放掉。
产品节点:Siri 与 Alexa
Siri。 CALO(Cognitive Assistant that Learns and Organizes)是 DARPA 资助、由 SRI 主导的认知助手项目。Siri Inc. 从相关技术衍生,2010 年 4 月被 Apple 收购。2011 年 10 月 4 日随 iPhone 4S 进入消费市场:语音作为入口,NLU 映射到 Apple 与合作方提供的服务(电话、短信、日历、天气、地图、部分网络查询等)。对用户而言,这是第一次在通用手机上大规模使用「说话 → 系统调服务」;对系统而言,仍是 TOD 流水线加封闭服务表。
Alexa。 2014 年 11 月 Echo 把同类流水线做成房间里的远场语音设备。Amazon 随后向第三方开放技能(Skill):开发者声明一组意图、每个意图的槽、以及服务端逻辑。这个开发者模型等于把 TOD 的领域—意图—槽位公开成 API。技能目录仍然是注册制,运行时不会在目录之外搜索新工具。
两者都达到了教材意义下的 Agent(感知语音,行动为调用 API)。两者都不满足 AI Agent 定义的四要素:决策核心不是 LLM(上线时以统计/规则 NLU 与状态机或统计策略为主),动作空间不开放,失败后的「改计划」被限制在该技能的策略图内。
关键术语
| 术语 | 在这条材料里的含义 |
|---|---|
| 任务型对话 | 面向封闭任务、以填槽和调服务为完成条件的多轮对话 |
| 框架 / 槽位 | 任务的参数结构;对话过程就是填这个结构 |
| 意图 | 预定义的任务模式标签 |
| 对话状态跟踪 | 跨轮维护槽值与待澄清项 |
| 技能 / 服务目录 | 运行时可调用的封闭后端集合 |
| 闲聊 vs 任务型 | 无完成条件的开放交谈 vs 有槽位与 API 的封闭任务 |
和 AI Agent 的关系
它在封闭任务上填槽并调用后端。这条「助手调服务」的流水线,后来接上了 LLM 的工具选择。
它的循环是多轮追问、确认、调用、失败再报错,副作用作用在环境上:写日历、控灯、播歌。观察是 ASR 文本与 API 回执。决策核心是意图分类器加状态机(或封闭状态空间上的统计策略),不是 LLM。控制图在上线前闭合。
三件与年份叙事有关的事实:
- 2011 年已经存在规模化、会调后端的助手,所缺的是以 LLM 为决策核心、以及开放的工具循环。
- 2022 年 ChatGPT 把入口从填槽改成开放对话:槽位由使用者临场说出,不再由系统预先规定。
- 2023 年的 ChatGPT plugins 与 Function Calling 开始把「助手调服务」接到 LLM 的工具选择上;是否构成 Agent,仍要看是否进入多步迭代。
GitHub Copilot(2021)是另一条助手:对代码的行级补全,人在环路,无目标循环。与 Siri 同列于助手,模态不同,结构同类。
TOD 的商业成功不使它成为 ReAct 的架构祖先。状态机填槽没有演变成开放工具循环;后者需要另一套决策核心与接口,时间在 2022–2023 年。
3 - Transformer
Vaswani 等,2017,Attention Is All You Need(NIPS 2017)。完全基于注意力的序列转换模型,去掉了循环与卷积。
原文:arXiv:1706.03762(HTML、PDF)。代码:https://github.com/tensorflow/tensor2tensor。
3.1 - Attention Is All You Need(论文)
Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Łukasz Kaiser, Illia Polosukhin. Attention Is All You Need. NIPS 2017. arXiv:1706.03762(HTML、PDF)。八位作者均标注为同等贡献。文首注明:在注明出处的前提下,Google 允许在学术或新闻作品中复制该文的表与图。
中文译本:Arthur Chiao、GitHub LaTeX 中译、博客园。民间译本质量不一,英德/英法 BLEU 有的把摘要 41.8 和正文 41.0 抄混。
摘要
当时占主导的序列转换(sequence transduction)模型,建立在编码器—解码器结构上的复杂循环网络或卷积网络。表现最好的模型还会用注意力把编码器与解码器连起来。
本文提出一种简单网络架构 Transformer:只基于注意力机制,完全不用循环和卷积。在两项机器翻译任务上,质量更高、更易并行、训练时间显著更短。
- WMT 2014 英→德:28.4 BLEU,比此前最佳结果(含模型集成)高 2 个 BLEU 以上。
- WMT 2014 英→法:单模型 41.8 BLEU(正文 6.1 节叙述为 41.0;表 2 为 41.8),在 8 块 GPU 上训练 3.5 天,成本只占文献中最佳模型的一小部分。
- 在英语成分句法分析上,无论训练数据多还是少,都表明该架构可以推广到翻译以外的任务。
1 引言
循环神经网络,尤其 LSTM 与门控循环网络,已被确立为语言建模、机器翻译等序列建模与转换任务的主流。循环模型把计算沿符号位置展开:位置 (t) 的隐状态 (h_t) 依赖 (h_{t-1}) 与当前位置输入。这种顺序性阻碍单个训练样本内部的并行;序列一长,内存又限制跨样本的 batch,问题更严重。因子分解技巧、条件计算可以提高效率,但顺序计算这一条约束仍然在。
注意力已经是序列模型里的常规组件:它可以建模依赖,而不必管依赖在输入或输出里隔了多远。但除少数工作外,注意力仍与循环网络一起用。
本文提出 Transformer:去掉循环,完全靠注意力建立输入与输出之间的全局依赖。并行度显著提高;在 8 块 P100 上训练约 12 小时,即可达到新的翻译质量水平(指 base 模型)。
2 背景
减少顺序计算,也是 Extended Neural GPU、ByteNet、ConvS2S 的出发点。它们用卷积对所有位置并行算隐表示。任意两个位置之间要建立联系,所需运算次数随距离增长:ConvS2S 线性,ByteNet 对数。远距离依赖因此更难学。
在 Transformer 里,这一次数变成常数。代价是对注意力加权位置做平均会降低有效分辨率;第 3.2 节用多头注意力抵消。
自注意力(self-attention,也称 intra-attention)把同一序列里不同位置联系起来,以计算该序列的表示。它已用于阅读理解、摘要、文本蕴含、与任务无关的句子表示等。端到端记忆网络用循环式注意力代替按序列对齐的循环,在简单问答与语言建模上有效。
据作者所知,Transformer 是第一个完全靠自注意力计算输入与输出表示、而不使用按序列对齐的 RNN 或卷积的转换模型。
3 模型架构
多数有竞争力的神经序列转换模型是编码器—解码器。编码器把输入符号序列 ((x_1,\ldots,x_n)) 映射为连续表示 (\mathbf{z}=(z_1,\ldots,z_n))。解码器据此一次一个符号地生成 ((y_1,\ldots,y_m))。每一步是自回归的:生成下一个符号时,把已经生成的符号当作额外输入。
Transformer 沿用这一总体结构。编码器、解码器都用堆叠的自注意力和逐位置全连接层(原文 Figure 1 左右两半)。
3.1 编码器栈与解码器栈
编码器。 (N=6) 层相同的层。每层两个子层:多头自注意力;逐位置全连接前馈网络。每个子层外包残差连接,再接层归一化:
[ \mathrm{LayerNorm}(x + \mathrm{Sublayer}(x)) ]
所有子层以及嵌入层的输出维度均为 (d_{\mathrm{model}}=512),以便做残差。
解码器。 同样 (N=6) 层。在编码器那两个子层之外,插入第三个子层:对编码器栈的输出做多头注意力。同样使用残差与层归一化。解码器里的自注意力被改成不能看后续位置。这种掩码,再加上输出嵌入右移一个位置,保证对位置 (i) 的预测只依赖小于 (i) 的已知输出。
3.2 注意力
注意力:把一个 query 和一组 key–value 对映射到一个输出;四者都是向量。输出是 value 的加权和;每个 value 的权重由 query 与对应 key 的兼容性函数算出。
3.2.1 缩放点积注意力
输入:维度 (d_k) 的 query 与 key,维度 (d_v) 的 value。用 query 与所有 key 做点积,再除以 (\sqrt{d_k}),经 softmax 得到 value 上的权重。一组 query 打成矩阵 (Q),key、value 打成 (K)、(V):
[ \mathrm{Attention}(Q,K,V)=\mathrm{softmax}\left(\frac{QK^{\top}}{\sqrt{d_k}}\right)V ]
两种常用注意力:加性注意力(Bahdanau 等)与点积(乘性)注意力。点积注意力与上式相同,只是没有 (1/\sqrt{d_k}) 这个缩放。加性注意力用单隐层前馈网算兼容性。理论复杂度相近,实践上点积可用高度优化的矩阵乘,更快、更省空间。
(d_k) 较小时两者表现接近;(d_k) 较大且不缩放时,加性更好。作者认为 (d_k) 大时点积幅值变大,把 softmax 推到梯度极小的区域(若 (q,k) 各维独立、均值 0 方差 1,则 (q\cdot k) 的方差为 (d_k))。因此除以 (\sqrt{d_k})。
3.2.2 多头注意力
不是用 (d_{\mathrm{model}}) 维做一次注意力,而是把 (Q,K,V) 用不同的、可学习的线性投影做 (h) 次,投影到 (d_k,d_k,d_v),再并行做注意力,把 (d_v) 维输出拼接起来,再投影一次:
[ \mathrm{MultiHead}(Q,K,V)=\mathrm{Concat}(\mathrm{head}_1,\ldots,\mathrm{head}_h)W^{O} ]
[ \mathrm{head}_i=\mathrm{Attention}(QW_i^{Q},,KW_i^{K},,VW_i^{V}) ]
其中 (W_i^{Q}\in\mathbb{R}^{d_{\mathrm{model}}\times d_k}) 等。多头让模型能同时从不同表示子空间、不同位置取信息;单头会被平均抑制。
本文 (h=8)。每个头 (d_k=d_v=d_{\mathrm{model}}/h=64)。头变窄之后,总计算量与全维度单头相近。
3.2.3 在本模型中的三种用法
- 编码器—解码器注意力。 query 来自上一解码器层;key 与 value 来自编码器输出。解码器每个位置可以关注输入序列所有位置。对应以往 seq2seq 里的编码器—解码器注意力。
- 编码器自注意力。 (Q,K,V) 都来自编码器上一层输出。每个位置可以关注上一层所有位置。
- 解码器自注意力。 每个位置可以关注解码器中不超过该位置的位置。为保持自回归、禁止信息左流,在缩放点积注意力里把 softmax 输入中非法连接置为 (-\infty)。
3.3 逐位置前馈网络
每个编码器、解码器层除注意力子层外,还有对每个位置单独、相同地施加的全连接前馈网:两层线性,中间 ReLU。
[ \mathrm{FFN}(x)=\max(0, xW_1+b_1)W_2+b_2 ]
不同位置共享同一套线性变换;层与层之间参数不同。也可看成核大小为 1 的两次卷积。输入输出维 (d_{\mathrm{model}}=512),内层 (d_{ff}=2048)。
3.4 嵌入与 Softmax
与其他序列转换模型一样,用可学习嵌入把输入、输出 token 变成 (d_{\mathrm{model}}) 维向量。解码器输出经线性变换与 softmax,得到下一个 token 的概率。两个嵌入层与 softmax 前的线性变换共享同一权重矩阵。嵌入层中把这些权重乘以 (\sqrt{d_{\mathrm{model}}})。
3.5 位置编码
模型没有循环也没有卷积,必须向序列注入相对或绝对位置信息。在编码器、解码器栈底部,把位置编码加到输入嵌入上;维度同为 (d_{\mathrm{model}}),以便相加。
本文用不同频率的正弦与余弦:
[ PE_{(pos,2i)}=\sin(pos/10000^{2i/d_{\mathrm{model}}}) ]
[ PE_{(pos,2i+1)}=\cos(pos/10000^{2i/d_{\mathrm{model}}}) ]
(pos) 是位置,(i) 是维度。波长从 (2\pi) 到 (10000\cdot 2\pi) 成几何级数。选择该函数是因为:对任意固定偏移 (k),(PE_{pos+k}) 可写成 (PE_{pos}) 的线性函数,便于按相对位置做注意力。
也试过可学习的位置嵌入,与正弦版本结果几乎相同(表 3 行 E)。选用正弦,是因为它可能外推到训练时未见过的序列长度。
4 为什么用自注意力
比较自注意力、循环、卷积三类层:把变长符号序列 ((x_1,\ldots,x_n)) 映到等长 ((z_1,\ldots,z_n)),(x_i,z_i\in\mathbb{R}^{d})。三条标准:每层计算复杂度;可并行程度(最少顺序操作数);网络中长程依赖的路径长度。路径越短,长程依赖越好学。
表 1. (n) 为序列长度,(d) 为表示维度,(k) 为卷积核宽,(r) 为受限自注意力的邻域大小。
| 层类型 | 每层复杂度 | 顺序操作 | 最大路径长度 |
|---|---|---|---|
| 自注意力 | (O(n^{2}\cdot d)) | (O(1)) | (O(1)) |
| 循环 | (O(n\cdot d^{2})) | (O(n)) | (O(n)) |
| 卷积 | (O(k\cdot n\cdot d^{2})) | (O(1)) | (O(\log_{k} n)) |
| 受限自注意力 | (O(r\cdot n\cdot d)) | (O(1)) | (O(n/r)) |
自注意力用常数次顺序操作连接所有位置;循环需要 (O(n))。当 (n<d) 时(机器翻译里 word-piece / BPE 句子表示常见如此),自注意力比循环更快。极长序列可以把注意力限制在半径 (r) 的邻域,最大路径变为 (O(n/r));文中列为未来工作。
单层卷积在 (k<n) 时连不满所有位置对;要连满需要堆 (O(n/k)) 层(连续核)或 (O(\log_{k} n)) 层(膨胀卷积),从而加长最长路径。
附带好处:自注意力可能更可解释。附录可视化显示,不同头学会不同工作,不少头与句法、语义结构有关。
5 训练
5.1 数据与 batch
英德:WMT 2014,约 450 万句对;BPE,源/目标共享约 37,000 token 词表。英法:WMT 2014,3600 万句,32,000 word-piece 词表。按近似长度组 batch;每个训练 batch 约 25,000 个源 token 与 25,000 个目标 token。
5.2 硬件与日程
一台机器、8 块 NVIDIA P100。base:每步约 0.4 秒,共 100,000 步(12 小时)。big:每步 1.0 秒,300,000 步(3.5 天)。
5.3 优化器
Adam,(\beta_1=0.9),(\beta_2=0.98),(\epsilon=10^{-9})。学习率:
[ lrate = d_{\mathrm{model}}^{-0.5}\cdot \min(\mathrm{step_num}^{-0.5},; \mathrm{step_num}\cdot \mathrm{warmup_steps}^{-1.5}) ]
前 (\mathrm{warmup_steps}) 步线性升高,之后按步数平方根的倒数下降。(\mathrm{warmup_steps}=4000)。
5.4 正则
残差 Dropout。 每个子层输出在与输入相加、归一化之前做 dropout;嵌入与位置编码之和也做 dropout。base 模型 (P_{drop}=0.1)。
标签平滑。 (\epsilon_{ls}=0.1)。会损害困惑度(模型学得更不确定),但提高准确率与 BLEU。
6 结果
6.1 机器翻译
表 2(newstest2014;训练成本为估计 FLOPs)。Transformer (big) 英德 28.4,英法 41.8;base 英德 27.3,英法 38.1。英德 big 比此前最佳(含集成)高 2 BLEU 以上。base 也超过此前所有已发表模型与集成,训练成本只占竞争模型的一小部分。英法 big 的训练成本不到此前 SOTA 的 1/4。英法 big 使用 (P_{drop}=0.1) 而非 0.3。
推理:base 对最后 5 个 checkpoint 做平均(每 10 分钟一个);big 平均最后 20 个。束搜索束宽 4,长度惩罚 (\alpha=0.6)。最大输出长度为输入长度 + 50,可提前结束。
6.2 模型变体
在英德开发集 newstest2013 上改 base(束搜索,不做 checkpoint 平均)。要点(表 3):
- (A) 头数与 (d_k,d_v):单头比最佳设置差 0.9 BLEU;头太多质量也下降。
- (B) 减小 (d_k) 损害质量,说明兼容性不容易,可能需要比点积更复杂的函数。
- (C)(D) 更大的模型更好;dropout 对过拟合很有帮助。
- (E) 正弦位置编码换成可学习位置嵌入,结果几乎相同。
- big:(N=6),(d_{\mathrm{model}}=1024),(d_{ff}=4096),(h=16),(P_{drop}=0.3),300K 步,约 2.13 亿参数。base 约 6500 万参数。
6.3 英语成分句法分析
输出有强结构约束,且比输入长得多。RNN seq2seq 在小数据上未达到当时 SOTA。4 层 Transformer,(d_{\mathrm{model}}=1024)。仅 WSJ(约 4 万句)F1 91.3;半监督(约 1700 万句)92.7。除 RNN Grammar 外,好于此前报告的模型。仅用 WSJ 4 万句时,也超过 BerkeleyParser。任务相关调参很少。
7 结论
Transformer 是第一个完全基于注意力的序列转换模型,用多头自注意力替换编码器—解码器里最常用的循环层。翻译任务上,训练显著快于基于循环或卷积的架构;英德、英法均达到新的 SOTA,英德上最佳模型超过此前所有集成。
作者计划把 Transformer 扩展到文本以外的输入输出模态,研究局部、受限注意力以处理图像、音频、视频等大输入输出,并使生成不那么顺序化。
训练与评测代码:https://github.com/tensorflow/tensor2tensor。
附录中的注意力可视化(论文所述)
编码器第 5 层(共 6 层)的自注意力:多个头关注动词 making 的远距离依赖,补全 making…more difficult。另有头表现为指代消解(如 its)。许多头表现出与句子结构相关的行为,且不同头做不同的事。
3.2 - Transformer 讲解
论文解决了什么问题
2017 年的对象是序列转换,主要战场是机器翻译。编码器—解码器与注意力已经是常规附件,主干仍是 RNN(或卷积)。三条障碍绑在一起:样本内的顺序计算无法并行;任意两个位置之间的路径随长度线性增长,长程依赖难以学习;注意力仍接在循环网络上,不是转换模型的默认计算。
解法是更换计算图:缩放点积自注意力让每个位置一步看到全序列(路径 (O(1)),层内顺序操作 (O(1)));多头注意力避免单次平均抹掉子空间;位置编码补回被移除的词序归纳偏置;解码器自注意力加掩码以保持自回归。翻译分数是结果。被改写的是「一层如何表示一段序列」这一层机制。
论文没有把自身写成语言模型骨架,也没有工具、循环或停机。结论中指出的下一步是其他模态、局部注意力,以及让生成少一点顺序化。
关键术语:编码器与解码器
论文里的编码器与解码器,与今天 LLM 里被叫做「编码器」「解码器」的东西同名同源,但不是同一件事。区分有两条判据:有没有交叉注意力,注意力带不带因果掩码。
论文里两个组件的差别只在一层:
| 编码器 | 解码器 | |
|---|---|---|
| 每层子层数 | 2 | 3 |
| 子层 | 自注意力、前馈 | 因果自注意力、交叉注意力、前馈 |
| 能看哪儿 | 全序列,双向 | 自己只看之前的位置,交叉注意力看编码器全部输出 |
| 生成 | 不生成 | 自回归,一次一个 token |
关键是第三个子层。交叉注意力读的是编码器的输出,解码器每一步都回看源序列的表示——这才是「解码」二字的由来:把已经读进来的表示,逐个符号地解出来。
今天被叫做「编码器」「解码器」的有三样,用法并不相同。
编码器栈(BERT 一类):双向自注意力加前馈,两个子层,没有因果掩码,也不生成。它把整段文本读成一个表示。
解码器栈(GPT 一类):因果自注意力加前馈,也是两个子层,与 BERT 的层同为两层,区别只在掩码;交叉注意力被去掉了,因为没有编码器可供交叉注意。所以「GPT 只用解码器栈」是准确的,但不能读成「留了解码器、藏了编码器」——去掉第三个子层之后,解码器退化为带因果掩码的自注意力加前馈,名字留了下来,机制回到同一条流上。
多模态编码器(图像、语音):把别的模态投到 LLM 能读的输入空间里。它与论文里那个读源句子的编码器不是一回事,只是沿用了「先编码成表示」的思路。
另有一个同名而无关的用法:tokenizer 的 encode / decode,把字符串转成 token id 再转回来,与模型结构无关。
对后面的影响落在一处:决策核心是解码器栈,没有编码器,就没有一份「源序列表示」可以被反复交叉注意。上下文里的所有东西都是同一条流上的 token,当前观察、工具回执与历史对话彼此没有结构上的区分,只有位置与文字的差别。
对后续 LLM 的影响
第 4 节的复杂度表给出了后来一切的前提:层内可并行,任意两个 token 之间只有一条短路径。 循环网络每层要按位置串行,卷积要靠堆层数接通远处的位置,两条都挡住了「同时加深、加宽、加数据」。自注意力把这两条约束一起拿掉,剩下的事情交给规模。
论文给的是完整的编码器—解码器,后来的主流却收敛到只用解码器栈。这是工程合力的结果,不是论文的结论,至少四条原因叠在一起。下一个 token 预测不需要标注,互联网上任何文本都是训练数据,而编码器—解码器要为每个任务设计输入与输出的配对形式;任务本身被统一成格式问题,「把下面这段译成英文」写在提示里即可,不必为翻译单独留一个编码器;解码器栈每层只有两个子层,省掉了第二套栈与交叉注意力的显存和算力;KV cache 可以复用,生成时每一步只新增一个 token 的代价,多轮对话与 Agent 循环都吃这一条。
把这次转向读成架构上的必然,我认为会漏掉另一半事实。理解类任务(SuperGLUE 一类)上,编码器栈与编码器—解码器仍然占优;指令微调之后,编码器—解码器可以用明显更省的推理达到相近的少样本表现;嵌入与检索这一支至今主要用编码器栈。这次转向本身也缺少同算力下的严格对照,有研究把两类模型放到同一算力最优前沿上比较后指出,编码器—解码器的潜力可能被低估。真正的推动力更像是两件事撞在一起:生成类任务在 2019 年之后变得重要,而解码器栈最容易扩规模。
位置编码成为一条独立的研究线。论文第 3.5 节选正弦编码,理由是它可能外推到训练时未见的长度;后来的相对位置、RoPE、ALiBi 都在回答同一个问题,「第几步、哪一段」这个信息如何在不引入循环的前提下表达得更好。这条线一直通到长上下文模型。
表 1 里那行 (O(n^{2}\cdot d)) 也没有消失,只是被绕着走。FlashAttention 改的是显存读写顺序,不是复杂度;PagedAttention 改的是 KV cache 的碎片;滑窗与线性注意力用近似换更长的上下文;MoE 在规模一侧把参数量与算力解耦。这些手段搬动了常数与曲线,没有改变二次方这一项。
GPT-3 的上下文学习与 Codex 的代码生成,用的都是这副骨架上训练出的解码器语言模型。它们不是这篇论文的实验内容,但都预设了这篇论文改过的计算图。
对 AI Agent 的影响
AI Agent 需要的决策核心,要能读一段开放文本并生成下一步。Transformer 提供的是表示与自回归生成结构,不是策略循环;一次前向计算,是在已有 token 上预测后续 token。这个结构留下三件对 Agent 直接起作用的事实。
上下文就是工作集,KV cache 是它的物理载体。「当前观察」在实现上不是一份被解析出来的状态,而是窗口里的一段 token,以及为它们算好的注意力键值。会话继续,cache 就继续追加;换一条会话,整段前缀要重新计算。窗口大小因此不是界面上的一个参数,而是这个循环一次能看见多少环境回执的物理上限。
动作只能是 token。 模型唯一的输出面是下一个 token 的概率分布,它没有别的通道。要用工具、要调 API、要改文件,都必须先把动作序列化成它能生成的东西:早期是约定格式的文本,2023 年 6 月之后是可校验的 JSON 调用,也有把工具做成特殊 token、或把动作写进代码块的做法。工具调用长成今天这个形状,原因在这里——不是接口设计选中了文本,而是输出面只有文本。
成本结构决定了 Agent 的工程形状。 prefill 阶段的注意力成本随长度平方增长,decode 阶段受显存带宽限制,而多轮循环会反复重新计算同一段前缀。这就是为什么前缀缓存、KV 复用与上下文压缩在 Agent 系统里是基础设施而不是优化项:一个跑二十轮的循环,开销的主要部分往往不在生成新内容,而在反复读同一段历史。
| 论文里的机制 | 后来在 Agent 里对应的物理事实 |
|---|---|
| 自注意力一步连接全序列 | 当前观察可以整段进入上下文 |
| 掩码自注意力、自回归 | 下一步以文本(或后来的工具调用)逐 token 生成,动作只能序列化进这个通道 |
| (O(n^{2})) 与有限窗口 | 一次循环能够容纳的回执有上限;超出后只能截断、检索或外挂记忆 |
| KV cache 随会话增长 | 状态就是这段前缀;多轮循环反复重算同一段历史,前缀复用因此成为基础设施 |
| 位置编码 | 「第几步、哪一段」对模型而言不是免费的 |
| 训练可并行、模型可做大 | 核心的能力随规模上升;2022 年 CoT「规模足够大才有效」,前提正是这种结构 |
时间线把它标成底层能力里的范式更替:没有可扩展的条件生成器,后面就没有可讨论的 LLM 核心。
扩展阅读
4 - GPT-3
Brown 等,2020,Language Models are Few-Shot Learners(NeurIPS 2020)。1750 亿参数自回归语言模型,系统测量 in-context learning:推理时把任务说明和少量示例写进上下文,不做梯度更新。
目录曾起草为 context。这一节记的是这篇论文,不是后来的「上下文工程」或记忆基础设施,所以栏目名与路径都用 GPT-3。要记住它的原因仍是上下文学习:不改权重也能做新任务。
原文:arXiv:2005.14165(PDF)。代码与数据说明:https://github.com/openai/gpt-3。
4.1 - Language Models are Few-Shot Learners(论文)
Tom B. Brown, Benjamin Mann, Nick Ryder, Melanie Subbiah, Jared Kaplan, Prafulla Dhariwal, Arvind Neelakantan, Pranav Shyam, Girish Sastry, Amanda Askell, Sandhini Agarwal, Ariel Herbert-Voss, Gretchen Krueger, Tom Henighan, Rewon Child, Aditya Ramesh, Daniel M. Ziegler, Jeffrey Wu, Clemens Winter, Christopher Hesse, Mark Chen, Eric Sigler, Mateusz Litwin, Scott Gray, Benjamin Chess, Jack Clark, Christopher Berner, Sam McCandlish, Alec Radford, Ilya Sutskever, Dario Amodei. Language Models are Few-Shot Learners. NeurIPS 2020. arXiv:2005.14165(PDF)。Brown、Mann、Ryder、Subbiah 标注为同等贡献。
中文译本:AI千集、51CTO(翻译与解读)。
摘要
近年 NLP 的主流是:在大规模语料上预训练,再在具体任务上微调。架构已经与任务无关,但仍需要每个任务数千到数万条标注。人类通常只需少量示例或一句指令就能做新的语言任务;当时的 NLP 系统大体做不到。
本文表明:把语言模型做大,会显著提高与任务无关的少样本(few-shot)表现,有时可以和此前基于微调的 SOTA 竞争。作者训练 GPT-3:1750 亿参数的自回归语言模型,比此前任何非稀疏语言模型大约大 10 倍,并在 few-shot 设定下评测。所有任务都不做梯度更新、不微调;任务与示例只通过与模型的文本交互给出。
GPT-3 在翻译、问答、完形填空等许多 NLP 数据集上表现强,也能做一些需要当场推理或领域适应的任务(单词还原、用新词造句、三位数算术)。同时,作者标出 few-shot 仍然吃力的数据集,以及在大规模网络语料上训练带来的方法学问题。GPT-3 生成的新闻稿,人类评测者难以与真人文章区分。文中讨论了这一发现及 GPT-3 更广泛的社会影响。
1 引言
NLP 从「为每个任务学表示、设计结构」转到「任务无关的预训练 + 任务无关的架构」。词向量、多层 RNN、再后来直接微调预训练的 Transformer 语言模型,任务专用结构逐步被拿掉。仍留下最后一步:为每个任务准备大规模标注并微调。
去掉这一步的理由,正文写成三条:
- 实用。 有用的语言任务极多(改语法、按抽象概念举例子、批评短篇故事……),很难为每一个都收集大规模监督数据。
- 虚假相关。 模型越大、微调分布越窄,越容易吃训练集里的捷径;基准上「达到人类水平」可能夸大真实任务表现。
- 与人类对照。 人通常不需要大监督集会做新任务;一句自然语言指令,或至多数个示范,往往就够。人也因此能在对话中途切换技能(例如在长对话里做加法)。作者希望 NLP 系统将来有同样的流动性。
一条路线是 meta-learning:训练时发展出广泛的技能与模式识别,推理时迅速适应或识别当前任务。脚注澄清用词:GPT-2 一文常说 “zero-shot task transfer”,但有时在上下文里给了示例,并不是真正从零个例子学习。本文用 meta-learning 指外环(梯度下降预训练)/ 内环结构;内环称为 in-context learning(上下文学习);再按推理时给几个示范分成 zero-shot / one-shot / few-shot。这些词对「推理时真的在学新任务,还是只是认出训练时见过的模式」保持开放。
GPT-2 已展示 in-context learning,但离微调差距很大(例如 Natural Questions 仅 4%,CoQA 55 F1 落后当时 SOTA 35 分以上)。同时 Transformer 语言模型从约 1 亿参数扩到 170 亿,验证损失随规模近似平滑改善。作者的假设是:上下文学习能力同样会随规模大幅上升。
本文训练 1750 亿参数模型 GPT-3,在二十多个 NLP 数据集以及若干专门设计的、训练里不太可能直接出现的新任务上,各测三种条件:
- few-shot: 上下文窗口里能放下多少示范就放多少(通常 10–100)
- one-shot: 只给 1 个示范
- zero-shot: 不给示范,只给自然语言指令
原则上也可以微调 GPT-3,本文不做,留给后续工作。这些「学习曲线」不包含梯度更新,只是增加作为条件的示范数量。
若干摘录数字(后文表格更全):CoQA zero/one/few-shot 为 81.5 / 84.0 / 85.0 F1;TriviaQA 为 64.3% / 68.0% / 71.2%(few-shot 在闭卷设定下相对微调模型为 SOTA)。few-shot 在 ANLI、RACE、QuAC 等任务上仍然吃力。作者系统测量训练数据对基准的污染;多数数据集影响很小,少数标注,或不予报告。
另外训练一组更小的模型(1.25 亿到 130 亿参数)作对照。多数任务上,三种设定都随容量平滑上升;zero / one / few-shot 之间的差距往往随模型变大而变大,作者认为这暗示更大的模型更善于 meta-learning。
2 方法
预训练流程与 GPT-2 相近,主要是把模型、数据多样性与训练量做大。本文把「在上下文里学习」的设定写清楚,并对照传统微调。
四种设定(图 2.1)
| 设定 | 权重 | 推理时给什么 | 作者写的利弊 |
|---|---|---|---|
| Fine-tuning | 更新 | 每任务数千到数十万标注 | 基准强;每任务要新数据集;分布外泛化与虚假特征有风险。本文不做 |
| Few-shot | 不更新 | (K) 个「上下文+补全」示范,再给一个待补全的上下文。(K) 通常 10–100,受窗口 (n_{\mathrm{ctx}}=2048) 限制 | 大幅减少任务数据;仍需要少量任务数据;此前结果远弱于微调 SOTA |
| One-shot | 不更新 | (K=1),另可加任务的自然语言描述 | 更接近向人布置任务时只给一个例子 |
| Zero-shot | 不更新 | 只有自然语言指令 | 最省事、也最难;有时对人来说没有例子也很难弄清格式 |
本文关注后三种,把它们当成不同的问题设定(基准表现 vs 样本效率),而不是互斥的方法。few-shot 数字最高;one-shot 甚至 zero-shot 被作者视为与人类表现更公平的对照,也是后续目标。
2.1 模型
与 GPT-2 相同的自回归 Transformer(含其改进的初始化、pre-normalization、可逆分词),例外是层间交替使用稠密注意力与局部带状稀疏注意力(类似 Sparse Transformer)。共 8 档规模,全部训练 3000 亿 token,窗口均为 (n_{\mathrm{ctx}}=2048)。前馈层宽度为 (d_{\mathrm{ff}}=4\cdot d_{\mathrm{model}})。
表 2.1(摘录)
| 名称 | 参数 | 层数 | (d_{\mathrm{model}}) | 头数 | (d_{\mathrm{head}}) | batch(token) | 学习率 |
|---|---|---|---|---|---|---|---|
| Small | 125M | 12 | 768 | 12 | 64 | 0.5M | (6.0\times 10^{-4}) |
| Medium | 350M | 24 | 1024 | 16 | 64 | 0.5M | (3.0\times 10^{-4}) |
| Large | 760M | 24 | 1536 | 16 | 96 | 0.5M | (2.5\times 10^{-4}) |
| XL | 1.3B | 24 | 2048 | 24 | 128 | 1M | (2.0\times 10^{-4}) |
| 2.7B | 2.7B | 32 | 2560 | 32 | 80 | 1M | (1.6\times 10^{-4}) |
| 6.7B | 6.7B | 32 | 4096 | 32 | 128 | 2M | (1.2\times 10^{-4}) |
| 13B | 13.0B | 40 | 5140 | 40 | 128 | 2M | (1.0\times 10^{-4}) |
| 175B(即 GPT-3) | 175.0B | 96 | 12288 | 96 | 128 | 3.2M | (0.6\times 10^{-4}) |
按 Kaplan 等 scaling laws,相对常见做法是「更大的模型、更少的 token」;文中称 30 亿参数的 GPT-3 与 RoBERTa-Large(3.55 亿)预训练算力大约都是 50 petaflop/s-days 量级。模型沿深度与宽度切到多 GPU。
2.2 训练数据
Common Crawl 量级已够让最大模型不必对同一序列更新两次,但未过滤或轻过滤的质量低于精选语料。三步:按与高质量参考语料的相似度过滤;文档级模糊去重(集内与跨集);再混入已知高质量语料(扩展 WebText、Books1、Books2、英文维基)。过滤前压缩明文约 45TB,过滤后约 570GB,约 4000 亿 BPE token(2016–2019 共 41 个 CC 月度分片)。
训练时不按数据集大小比例采样,高质量集合采得更勤。训 3000 亿 token 时,有的集合看到约 3.4 遍,Common Crawl 与 Books2 不到 1 遍。
表 2.2
| 数据集 | token 量 | 训练混合权重 | 训 300B token 时经过的 epoch |
|---|---|---|---|
| Common Crawl(过滤后) | 4100 亿 | 60% | 0.44 |
| WebText2 | 190 亿 | 22% | 2.9 |
| Books1 | 120 亿 | 8% | 1.9 |
| Books2 | 550 亿 | 8% | 0.43 |
| Wikipedia | 30 亿 | 3% | 3.4 |
作者试图去掉与所测基准开发/测试集的重叠。过滤有 bug,部分重叠被漏掉;因训练成本未重训。第 4 节量化剩余污染。训练数据以英语为主(按词数约 93%),其余语言约 7%。
2.3 训练
更大模型用更大 batch、更小学习率;用梯度噪声尺度选 batch。矩阵乘内部与层间都做模型并行。V100,微软提供的高带宽集群。细节在附录 B。
2.4 评测
few-shot:对评测集每条,从该任务训练集随机抽 (K) 条作条件,示例之间用 1 或 2 个换行分隔。LAMBADA、StoryCloze 无监督训练集,则从开发集抽、在测试集评。(K) 从 0 到窗口能放下的上限;更大 (K) 通常更好但不总是。有独立开发集时,在开发集上试几个 (K),再把最好的拿到测试集。部分任务另加自然语言 prompt。
多选题:比较各补全的语言模型似然;多数按 token 均长;ARC、OpenBookQA、RACE 等还用无条件补全概率归一化。二分类把选项写成有语义的词(True/False)再当多选。自由生成用束搜索(束宽 4,长度惩罚 (\alpha=0.6))。测试集公开则报测试集;私有测试集且模型塞不进评测服务器时,报开发集。少数(SuperGLUE、TriviaQA、PIQA)提交了约 175B 的 few-shot。
3 结果
交叉熵验证损失相对训练算力仍近似幂律,比 Kaplan 等再外推两个数量级,偏离很小。下文按九类任务报告 8 个模型在 zero / one / few-shot 下的结果。
3.1 语言建模、完形与补全
- PTB 困惑度:此前 zero-shot SOTA 35.8,GPT-3 20.5(改进约 15 点)。维基类与 1B Word 因大量出现在训练集而省略。
- LAMBADA(根据段落预测句末词):zero-shot 准确率 76.2(此前 SOTA 68.0)。few-shot 改成填空格式,让模型从示例推断「只输出一个词」,准确率 86.4。one-shot 用填空格式反而差于 zero-shot,作者认为需要若干示例才能认出格式。污染分析见第 4 节,影响可忽略。
- HellaSwag:few-shot 79.3,高于微调 1.5B LM 的 75.4,低于多任务微调 SOTA 85.6。人类约 95.6。
- StoryCloze 2016:zero-shot 83.2,few-shot 87.7((K=70)),仍低于 BERT 系微调 SOTA 91.8,zero-shot 相对此前约高 10 点。
3.2 闭卷问答
不检索外部文档,也不在 QA 集上微调,比先前闭卷设定更严。
表 3.3
| 设定 | NaturalQS | WebQS | TriviaQA |
|---|---|---|---|
| RAG(微调,开域) | 44.5 | 45.5 | 68.0 |
| T5-11B+SSM(微调,闭卷) | 36.6 | 44.7 | 60.5 |
| T5-11B(微调,闭卷) | 34.5 | 37.4 | 50.1 |
| GPT-3 zero-shot | 14.6 | 14.4 | 64.3 |
| GPT-3 one-shot | 23.0 | 25.3 | 68.0 |
| GPT-3 few-shot | 29.9 | 41.5 | 71.2 |
TriviaQA few-shot 超过当时开域微调 SOTA(含检索)。NQs / WebQS 从 zero-shot 到 few-shot 跳得大,作者认为可能有分布偏移;NQs 偏维基细粒度知识。三条任务上表现都随模型容量平滑上升。
3.3 翻译
数据是多语混合,不是成对回译。one/few-shot 给 1 或 64 个句对,与先前无监督 NMT 不完全可比。zero-shot 低于当时无监督 NMT;one-shot 约高 7 BLEU;few-shot 再高约 4 BLEU,平均接近先前无监督工作。译入英语明显强于译出英语。En→Ro 差 10+ BLEU,作者怀疑 GPT-2 的 byte-level BPE 几乎按英语设计。随容量平滑变好。
3.4 Winograd 类
原版 Winograd(273 条):zero/one/few-shot 约 88.3 / 89.7 / 88.6,看不出明确的 in-context 增益,但已接近微调 SOTA。Winogrande:70.2 / 73.2 / 77.7,few-shot 接近微调 RoBERTa-large(79),低于 T5 微调 84.6 与人类 94.0。
3.5–3.8 常识、阅读、SuperGLUE、NLI
常识(PIQA、ARC、OpenBookQA)与阅读理解(CoQA、DROP、RACE、QuAC 等)表现不一。CoQA few-shot 85.0 F1,距人类基准约 3 分。DROP few-shot 超过原论文 BERT 微调,仍远低于带符号系统的 SOTA。部分阅读任务 few-shot 仍然弱。
SuperGLUE few-shot 每任务上下文 32 个示例,不更新权重。COPA、ReCoRD 接近 SOTA;BoolQ、MultiRC、RTE、WSC 大致相当于微调 BERT-Large;WiC 接近随机。作者注意到:需要比较两句或两段的任务(WiC、RTE、CB、ANLI)是明显弱点。ANLI Round 3:小模型停在随机附近,175B few-shot 从随机到 SOTA 的差距大约补上一半。
3.9 合成任务与定性任务
为探测「当场计算、认出训练里不太可能出现的新模式、迅速适应古怪任务」而专门设计。
算术(必须精确生成正确答案;每任务 2000 题)。GPT-3 175B few-shot:两位数加法 100%、两位数减法 98.9%、三位数加法 80.4%、三位数减法 94.2%;四位数约 25–27%,五位数约 9–10%;两位数乘法 29.2%;一位数复合运算 21.3%。从 13B 到 175B 有明显跳跃;13B 两位数加减大约一半对,其余运算多低于 10%。在训练集里检索三位数加减,命中极低(加法 0.8%,减法 0.1%);错例常像忘了进位。zero-shot 已明显强于小模型的 few-shot。
字母操作(循环字母、部分打乱、插入符号、倒序等)。few-shot 随规模上升;倒序单词所有模型几乎都做不到。zero-shot 几乎不会,one-shot 大约掉一半,作者据此认为这些任务更像推理时学会。BPE 平均约 0.7 词/token,要成功还需要解析 token 的内部结构。
SAT 类比:few/one/zero-shot 65.2% / 59.1% / 53.7%;报考者平均 57%,随机 20%。175B 比 13B 高 10 分以上。
新闻生成:用 3 篇真新闻作 few-shot 条件,再给标题与副标题生成短稿。人类区分约 200 词稿件:对照劣质模型准确率 86%,GPT-3 175B 52%(几乎随机)。约 500 词实验仍约 52%。这是后文讨论误用的经验锚点。
另有用新词造句、改语法等定性例子(原文与附录)。
4 基准污染
数据与模型都比 GPT-2 大约两个数量级,且含大量 Common Crawl。相对去重后的验证集,175B 没有显著过拟合训练集。对每个基准做「干净」子集:去掉与预训练集有 13-gram 重叠的例子(更短则整例重叠)。多数任务干净子集分数与全集几乎相同,污染程度与分数差也不相关。作者结论:要么检测方法过严,要么污染对报告分数影响很小。最麻烦的任务细节在附录;少数结果标星或未报告。
5 限度
作者自己列出的限度,不是后来评论:
- 生成仍会语义重复、长文失贯、自相矛盾、出现不相关句段。
- 「常识物理」口头上仍弱(例如「奶酪放进冰箱会不会化」),尽管 PIQA 分数不差。
- 比较两段文本的任务、部分阅读理解,one-shot / few-shot 接近随机。
- 只做了自回归 LM,没有双向结构或去噪目标;填空、回看比较、读长文给短答案可能因此吃亏。
- 更根本的: 自监督目标对每个 token 等权,没有「什么更值得预测」;任务必须被拧成「预测下一个 token」。作者写:有用的语言系统(例如虚拟助手)最终也许更该被想成在采取有目标的行动,而不仅仅是做预测。模型也没有视频或物理交互中的 grounding。因此「只把纯自监督预测做大」可能碰到上限,需要别的办法增强——文中点到从人类学目标函数、用强化学习微调、加图像等模态。
- 预训练样本效率仍远差于人;few-shot 只是推理时样本效率向人靠近。
- few-shot 究竟是推理时从零学会,还是认出训练时见过的任务,没有定论,且可能因任务而异。字母操作、用胡造词更像前者;翻译显然在预训练里学过。
- 175B 推理贵、不便部署;提到针对具体任务做蒸馏。
- 不可解释、校准差、保留训练数据中的偏见。
6 更广泛的影响
有益用途:代码与写作补全、语法、游戏叙事、搜索、问答。有害用途随生成质量上升而扩大。重点写误用与偏见,并短论能耗。
误用:依赖高质量文本的有害活动(虚假信息、垃圾、钓鱼、滥用法律与行政程序、代写、社会工程)。人类评测难以区分合成新闻,被标成一个值得警惕的节点。作者监测论坛后认为,对中低技能行动者,当时威胁不是立即的,但可靠性再升可能改变这一点。
偏见:互联网训练的模型带互联网尺度的偏见。对 175B 及更小模型做了性别—职业、种族、宗教等探测(例如中性句「The {occupation} was a」后,388 个职业里 83% 更常接男性标识)。正文强调这是初步分析,不是穷尽。
7 相关工作
规模:Kaplan 等幂律;从原版 Transformer 2.13 亿、BERT 3 亿、GPT-2 15 亿、Megatron 80 亿、T5 110 亿、Turing-NLG 170 亿,到本文 1750 亿。另一条是 MoE 条件计算(参数多、算力不按比例增)。蒸馏、自适应计算时间、Universal Transformer。自然语言指令、多任务微调、元学习(文中称把示范放入上下文,在结构上最接近 RL(^2):外环改权重,内环适应任务)。作者承认过去两年大量算法进展(双向去噪、encoder-decoder、排列语言模型等),本文为聚焦 in-context 并降低大模型实现复杂度,仍用纯自回归。
8 结论
1750 亿参数语言模型在 zero / one / few-shot 下,许多 NLP 任务表现强,有时接近微调 SOTA;能生成高质量样本,并在当场定义的任务上有定性能力。不微调时,表现随规模大致可预测。尽管有许多限度与弱点,这些结果暗示:非常大的语言模型可能是可适应、通用语言系统的重要组成部分。
训练由 OpenAI 资助;模型在微软提供的 V100 集群上训练。
4.2 - GPT-3 讲解
论文解决了什么问题
2020 年卡住的是适应方式:架构已经与任务无关,BERT 与 GPT-2 已经证明预训练有效,但每个新任务仍然需要大规模标注并更新权重。任务数量太多;窄分布微调会学到虚假相关;人也并不这样学习。GPT-2 已经把示范写进上下文,分数距离微调仍远。要检验的假设只有一句:上下文学习是否会随规模变强。
主干仍是 GPT-2 式解码器。实验设计做了两处改动:把 zero-shot、one-shot、few-shot 分开测量,权重一律不动,使「提示」成为可测量的设定;把规模做成自变量,从 1.25 亿到 1750 亿共 8 档。多数任务上,few-shot 随规模上升的斜率比 zero-shot 更陡。翻译、闭卷问答与算术是这条假设的测量手段,不是终点。被改写的是任务接口:从修改权重,改为修改这段作为条件的文本。
论文没有工具循环。第 5 节自己标出了缺口:有用的系统最终也许应当被理解为在采取有目标的行动。我认为这是理解这一节的关键——那是作者留下的空位,不是后人为它补上的功能。
对后续 LLM 的影响
任务接口从数据集变成上下文里的字符串。few-shot 把示范与待补全拼成一段条件,后来的系统提示、角色句、工具说明都是同一接口上的用法。一个基座、许多下游,不必为每个任务保存一份微调权重。InstructGPT 与 ChatGPT 改的是指令跟随,并不取消这条接口。
窗口就是工作集上限:文中 (K) 取 10–100,因为 (n_{\mathrm{ctx}}=2048)。后来做到 8k、32k、100k 以上,是在放宽同一条约束。规模是条件而非装饰:同样的提示,小模型用不上。评测污染在第 4 节已经被写成方法学问题。
它仍然是补全模型。听话的对话形态,要到 2022 年的 InstructGPT 与 ChatGPT 才送到大众面前。
对 AI Agent 的影响
决策核心必须在不重新训练的前提下,读懂这一轮传入的指令、工具回执与失败原因,并生成下一步。GPT-3 测到的正是「新信息写进上下文就能改变行为」。Transformer 提供计算图;GPT-3 提供推理时的适应方式。Agent 把 Observation 当作工作集,用的是同一机制。
| 论文里的机制 | 后来在 Agent 里对应的物理事实 |
|---|---|
| in-context learning,权重不动 | 观察、工具 JSON、摘录作为「这一步的条件」,不必为每个环境训练一个模型 |
| (n_{\mathrm{ctx}}=2048) | 一次循环能够看到的回执有上限;超出后只能截断、检索或外挂记忆 |
| zero-shot 只有自然语言说明 | 后来的系统提示;当时弱于 few-shot,指令跟随不稳定 |
| 外环预训练 / 内环上下文 | 慢学习在权重里,快适应在这一次前向中。Agent 循环用的是内环 |
| 第 5 节:助手应是有目标的行动 | 作者把缺口留给「行动」;工具循环、ReAct 与 Function Calling 是后来接上的,不是这篇已经实现的功能 |
时间线标成底层能力里的首证:工作集从此有了可寻址的载体。
5 - RAG
Lewis 等,2020,Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks(NeurIPS 2020)。预训练 seq2seq 接可检索的维基百科稠密索引,端到端微调。
- 论文:按原文结构转述两种边际化、DPR 与 BART、开域问答与生成实验,不加入后来的 LLM 与 Agent 解释。
- 讲解:单次检索—生成为什么成为带外部知识的系统几乎都会先经过的一步;说明为什么它不是迭代循环。
原文:arXiv:2005.11401(HTML、PDF)。代码后来收入 Hugging Face Transformers。
5.1 - Retrieval-Augmented Generation(论文)
Patrick Lewis, Ethan Perez, Aleksandra Piktus, Fabio Petroni, Vladimir Karpukhin, Naman Goyal, Heinrich Küttler, Mike Lewis, Wen-tau Yih, Tim Rocktäschel, Sebastian Riedel, Douwe Kiela. Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks. NeurIPS 2020. arXiv:2005.11401(v4,2021-04)。作者单位包括 Facebook AI Research、University College London、New York University。
中文译本:宝玉。
摘要
大规模预训练语言模型可以把事实知识存在参数里,微调后在许多 NLP 任务上达到当时最好水平。但访问并精确操纵这些知识的能力仍有限,知识密集型任务上落后于任务专用结构。如何给预测提供出处、如何更新世界知识,仍是开放问题。带可微访问机制、显式非参数记忆的预训练模型,此前主要只在抽取式下游任务上被研究。
本文给出一种通用微调配方 retrieval-augmented generation (RAG):把预训练的参数记忆与非参数记忆结合起来做语言生成。参数记忆是预训练 seq2seq 模型;非参数记忆是维基百科的稠密向量索引,由预训练神经检索器访问。比较两种写法:整段生成共用同一批检索段落;每个 token 可以使用不同段落。在多种知识密集型任务上微调与评测;三个开域问答任务上达到当时最好,超过纯参数 seq2seq 以及任务专用的「检索再抽取」结构。生成任务上,比当时最好的纯参数 seq2seq 基线更具体、更多样、更符合事实。
1 引言
预训练语言模型可以从数据里学到相当深的知识,不必访问外部记忆,相当于参数化的隐式知识库。代价是:记忆不容易扩展或修订;预测不容易给出依据;可能产生幻觉。混合参数记忆与非参数(检索)记忆可以缓解:知识能直接修订、扩展,被访问的内容可检查。REALM 与 ORQA 把掩码语言模型与可微检索器结合,结果可观,但只做了开域抽取式问答。本文把这种混合记忆接到当时 NLP 的主力结构——seq2seq 模型上。
RAG:参数记忆是预训练 seq2seq Transformer;非参数记忆是维基百科稠密索引,由预训练神经检索器访问。检索器是 DPR,按输入给出潜在文档;生成器是 BART,同时条件于这些文档与输入。对潜在文档做 top-K 近似边际化:按整段输出(同一文档负责所有 token)或按 token(不同文档负责不同 token)。与 T5 / BART 一样,RAG 可在任意 seq2seq 任务上微调,生成器与检索器一起学。
与从零训练的记忆网络等不同:这里两块记忆都已预训练、预装大量知识。用预训练好的访问机制,不必再训一遍才能访问知识。
知识密集型任务:人若没有外部知识源,无法合理完成。RAG 在 open Natural Questions、WebQuestions、CuratedTrec 上达到当时最好;TriviaQA 上明显超过使用专用预训练目标的近期方法。这些本是抽取式任务,作者发现无约束生成反而超过先前抽取方法。生成侧做了 MS-MARCO 与 Jeopardy 问题生成。FEVER 事实验证距使用强检索监督的流水线 SOTA 约 4.3%。非参数记忆可以替换,以便世界变化时更新知识。
2 方法
输入序列 (x) 用来检索文档 (z),再作为额外上下文生成目标序列 (y)。两块:(i) 检索器 (p_\eta(z|x)),按查询给出(截断到 top-K 的)段落分布;(ii) 生成器 (p_\theta(y_i|x,z,y_{1:i-1})),根据已生成 token、原输入与检索段落生成当前 token。
把检索到的文档当潜变量,端到端训练。两种边际化:
RAG-Sequence。 同一篇检索文档生成整段。top-K 近似:
[ p_{\text{RAG-Sequence}}(y|x)\approx\sum_{z\in\text{top-}k}p_\eta(z|x),p_\theta(y|x,z) =\sum_{z\in\text{top-}k}p_\eta(z|x)\prod_i p_\theta(y_i|x,z,y_{1:i-1}) ]
RAG-Token。 每个目标 token 可以对应不同潜在文档,生成器可从多篇里取内容:
[ p_{\text{RAG-Token}}(y|x)\approx\prod_i\sum_{z\in\text{top-}k}p_\eta(z|x),p_\theta(y_i|x,z,y_{1:i-1}) ]
序列分类把类别当成长度 1 的目标序列,此时两种模型等价。
2.2 检索器:DPR
双编码器:(p_\eta(z|x)\propto\exp(\mathbf{d}(z)^\top\mathbf{q}(x))),(\mathbf{d}(z)=\mathrm{BERT}_d(z)),(\mathbf{q}(x)=\mathrm{BERT}_q(x))。top-K 是最大内积搜索(MIPS),可近似亚线性求解。用 DPR 预训练的双编码器初始化检索器并建索引。该检索器原为 TriviaQA 与 Natural Questions 上「检索含答案的文档」而训。文档索引即非参数记忆。
2.3 生成器:BART
任意编码器—解码器均可。本文用 BART-large(约 4 亿参数)。把 (x) 与检索内容 (z) 拼接后送入 BART。BART 参数 (\theta) 即参数记忆。
2.4 训练
检索器与生成器联合训练,不对「该检索哪篇」做直接监督。最小化目标的负边际对数似然。更新文档编码器 (\mathrm{BERT}_d) 代价高(索引要像 REALM 那样周期性重建)。作者发现不必如此也能得到强结果:文档编码器与索引固定,只微调查询编码器 (\mathrm{BERT}_q) 与 BART。
2.5 解码
RAG-Token 可看成标准自回归 seq2seq,把对文档的边际化折进转移概率,用普通束搜索。
RAG-Sequence 的 (p(y|x)) 不能拆成常规的逐 token 似然。对每篇 (z) 各做一次束搜索,再对未出现在所有束里的假设补前向,乘上 (p_\eta(z|x)) 后求和。称为 Thorough Decoding。更长输出时候选集变大;可近似认为束搜索没生成过的 (y) 概率为 0,避免额外前向,称为 Fast Decoding。
3 实验设定
非参数知识源:单一维基百科转储(2018 年 12 月,与 Lee et al.、Karpukhin et al. 一致)。每篇切成互不相交的约 100 词块,共 2100 万文档。FAISS + HNSW 建 MIPS 索引。训练时每查询检索 top (k\in{5,10});测试时的 (k) 用开发集选。
开域 QA。 问题与答案当输入—输出对,直接最小化答案的负对数似然。对照抽取式(答案是检索文档中的跨度,主要靠非参数知识)与闭卷生成(T5 等,纯参数、不检索)。数据集:NQ、TriviaQA、WebQuestions、CuratedTrec。WQ、CT 较小,用 NQ 上的 RAG 初始化。报 Exact Match。TriviaQA 另报与 T5 可比的 Wiki 测试集。
抽象问答。 MS-MARCO NLG v2.1:不用官方提供的十篇金段落,只问与答,当成开域抽象 QA。部分题没有金段落无法对上参考答案;部分题仅靠维基百科答不了,此时可靠参数知识。
Jeopardy 问题生成。 给定实体,生成 Jeopardy 式精确事实问句。SearchQA 划分。对照 BART。指标 Q-BLEU-1;另做事实性与特异性的成对人工评测。
事实验证。 FEVER:判断断言被维基支持、反驳或信息不足。把三类标签映射成单 token,直接用断言—类别对训练。不用检索证据的监督。报 3 分类与 2 分类标签准确率。
4 结果
开域 QA(表 1,测试集 EM)。 RAG-Sequence:NQ 44.5,TQA 56.8 / 68.0(标准 / Wiki),WQ 45.2,CT 52.2。RAG-Token:NQ 44.1,WQ 45.5。均超过闭卷 T5-11B+SSM(NQ 36.6,WQ 44.7)与开域 REALM / DPR。作者强调:不必昂贵的 salient span masking 预训练;也不必 DPR 那套 cross-encoder 重排 + 抽取式阅读器。生成的好处:文档里只有线索、没有答案原文时仍能贡献;检索集里完全没有正确答案时,NQ 上仍有 11.8% 准确率(抽取模型为 0)。
MS-MARCO。 RAG-Sequence 相对 BART 高 2.6 BLEU、2.6 Rouge-L。接近使用金段落的 SOTA。定性上幻觉更少。
Jeopardy。 RAG-Token 的 Q-BLEU 高于 RAG-Sequence 与 BART。人工(452 对):BART 更符合事实仅 7.1%,RAG 更符合事实 42.7%。特异性同样 RAG 明显更好。作者用 Hemingway 一例说明:不同 token 的文档后验会在不同书名上高峰,参数记忆随后能自己补全书名——非参数成分把参数里的具体知识「抽」出来。
FEVER。 3 分类距当时流水线 SOTA 约 4.3%;2 分类距给定金证据句的 RoBERTa 约 2.7%。top-1 检索文档与金证据文章重叠 71%,top-10 含金文章 90%。
多样性。 不靠多样性解码,RAG 的 distinct trigram 比例高于 BART。
消融。 冻结检索器全面变差。把稠密检索换成固定 BM25:FEVER 上 BM25 更好(断言偏实体、适合词重叠);其余任务尤其开域 QA,可微检索关键。
索引热替换。 2016-12 与 2018-12 两份维基索引。对 82 位在两日期之间换人的领导人,用「Who is {position}?」查询 NQ 模型:匹配年份的索引约 70% / 68% 正确;错配索引降至 12% / 4%。换非参数记忆即可更新世界知识,不必重训。
训练用 5 或 10 篇差别不大。测试时多检索:RAG-Sequence 的开域 QA 单调变好;RAG-Token 约在 10 篇见顶。
5–6 相关工作与讨论
把先前「检索帮单个任务」的成功收成同一套检索架构微调到多种任务。对照无检索的通用架构(GPT-2、BART、T5)、可学习检索、记忆网络、retrieve-and-edit。索引是原文而非分布式表示:人能读(可解释),人能写(改索引即改记忆)。
结论:混合生成模型在开域 QA 上达到当时最好;人更偏好 RAG 而非纯参数 BART;检索可学、索引可热替换。后续可考虑两块从零联合预训练。
社会影响:更贴维基事实、幻觉更少、更可控制;维基本身仍有偏差;也可被用来生成误导内容。风险缓解思路与 GPT-2 讨论同类。
5.2 - RAG 讲解
这篇论文要解决的问题
2020 年 5 月,与 GPT-3 几乎同期。当时预训练已能把事实压进参数,REALM 与 DPR 已能做到先检索再抽取。三条缺口并列:参数知识难以修改、难以核查、且会产生幻觉;可微检索当时主要服务于抽取式阅读,答案必须落在原文跨度内;生成模型仍是闭卷的,知识密集型生成落后于任务专用结构。
RAG 给出的是配方,不是新的骨干网络。检索器沿用现成的 DPR,生成器沿用现成的 BART,把检索到的文档当作潜变量,用答案似然端到端微调查询编码器与生成器。索引固定,可以热替换;生成不必等于抽取。它测量的终点是开域问答与若干生成、分类基准,而不是「模型自行决定何时重新检索」。
对后续 LLM 的影响
这个词在日常使用中含义更宽,泛指任意「先检索一段,再放进提示」的做法;论文的定义更窄,把参数记忆与非参数记忆写成一对可替换的组件。出处绑定在被检索的段落上,是后来「带引用作答」在结构上的前身,WebGPT 把引用改成了一次浏览动作。更换维基索引即可改变「谁是总统」的答案;在产品里更换向量库,走的是同一条路径。
限度需要写清楚:仍然只有一次前向。 检索、拼接、生成三步走完即结束,没有「看过回执再决定是否继续检索」的外循环。训练需要微调,不是 GPT-3 那种纯上下文学习。2023 年以后企业知识库助手沿用了这个名称,实现常常换成「嵌入加提示拼接」,不再做论文里的 token 级边际化。
对 AI Agent 的影响
我在整理带外部知识的 Agent 时,几乎都能看到「生成之前先检索」这一步。RAG 给出的是这条路径的单次形态:外部知识以检索段落的形式进入上下文,决策核心仍然只做一次生成。它补的是 GPT-3 上下文装不下、权重又改不了的那块缺口,不是循环本身。
| 论文里的机制 | 后来在 Agent 里对应的物理事实 |
|---|---|
| 非参数索引(原文块) | 工具回执、代码库、文档可以先被检索,再进入窗口 |
| 索引热替换 | 不必为每份新知识微调;更换索引即更换记忆 |
| 生成条件于 (z) | 当前观察中出现「检索到的证据」;证据选错仍然会错 |
| 一次检索加一次生成 | 流水线。Agent 循环要求的是依据回执再决定下一步:重新检索、更换查询或放弃 |
| 不用检索监督也能微调 | 后来许多系统连这一步微调也省去,只把结果拼进提示 |
时间线标成底层能力里的工程化:外部知识从此可以更换,而不用重训。
6 - GitHub Copilot
GitHub 与 OpenAI,2021-06-29。技术预览:在编辑器里根据当前文件上下文建议代码。驱动模型是 OpenAI Codex。它是「Copilot → Agent」这条产品演化的起点。
6.1 - GitHub Copilot 技术预览(材料)
GitHub Copilot 没有对应一篇研究论文。这里转述的是 2021 年技术预览当时的公开表述,不以 2022 年正式商用、2023 年 Copilot X 与 Chat 回填。模型机制与 HumanEval 数字以 Codex 论文 为准;那篇写明:独立的生产版本驱动 Copilot。
主要出处:
- GitHub CEO Nat Friedman,2021-06-29,Introducing GitHub Copilot: your AI pair programmer
- 同期产品页与新闻稿中的功能描述(VS Code 扩展、候选项循环、技术预览名额有限)
- OpenAI,2021-08-10 前后,将 Codex 以 API 私有测试形式提供时的产品说明(明确 Codex 即驱动 Copilot 的模型)
这里不复制公告全文。
产品主张(2021-06-29)
GitHub 发布 GitHub Copilot 技术预览,自称 AI pair programmer(AI 结对程序员),帮助写出更好的代码。它从你正在写的代码里抽取上下文,建议整行或整个函数。公告列出的用处:更快发现另一种解法、写测试、探索新 API,而不必专门去网上改检索词。输入时它适应你的写法,以便更快完成工作。
与 OpenAI 合作,由 OpenAI Codex 驱动。公告称 Codex 对人如何使用代码有广泛知识,代码生成上明显强于 GPT-3,部分因为训练数据里公开源代码的浓度高得多。预览对多种框架与语言可用,当时写明尤其适合 Python、JavaScript、TypeScript、Ruby、Go。技术预览名额有限,需申请。
当时的交互形态
同期公开描述与报道一致的部分:
- 住在编辑器里(技术预览阶段以 Visual Studio Code 为主),不是独立聊天窗口。
- 边写边建议;可在多个建议间循环,接受或拒绝。
- 例子包括:根据上下文写出导入推文、画散点图、取评分等函数级片段。GitHub 强调它不只是背诵见过的代码,而是分析已写部分再生成匹配的新代码。
- 人始终在环路中:建议出现在光标处,由开发者决定是否采纳。没有「给一个仓库级目标、自己改到测试通过」的产品叙事。
Codex 侧的产品说明(约一个月后)
OpenAI 将 Codex 以 API 私有测试放出时写明:这是把自然语言译成代码的系统,也是与 GitHub 合作、一个月前上线的 Copilot 所用模型。Codex 是 GPT-3 的后代;训练数据含自然语言与公开来源(含公开 GitHub 仓库)中的数十亿行代码。Python 最强,并称精通十余种语言(JavaScript、Go、Perl、PHP、Ruby、Swift、TypeScript、Shell 等)。相对 GPT-3 约 4KB 的上下文,Codex 对 Python 代码给出约 14KB 记忆,可纳入三倍以上上下文。API 初期免费;用途举例包括转译、解释代码、重构——并称只触及表面。
GPT-3 的主技能是用自然语言回应自然语言,对世界的影响经过读者的头脑;Codex 在保留大量自然语言理解的同时产出可运行代码,因而可以用英语向带 API 的软件下命令。
这些是 2021 年的产品句。评测数字、失败模式、不安全代码比例不在公告里,而在 Codex 论文。
当时明确不是什么
材料没有声称:自主完成 issue、在终端多步执行、调用任意工具、无人盯着把任务做完。技术预览是编辑器补全。GitHub 计划基于它做商业产品;那是路线图,不是 2021-06 已交付的形态。
6.2 - GitHub Copilot 讲解
这个产品解决了什么问题
Codex 证明模型能够写出通过单元测试的函数。日常开发的需求更窄:光标已在文件里,下一行或下一个函数是什么。 Copilot 把这一步收缩为编辑器内的建议。产品没有引入新的学习算法,它发明的是交付位置:VS Code 光标处、可以循环的候选、由人决定是否接受。技术预览选择 Python、JavaScript、TypeScript、Ruby、Go,是因为当时在这些语言上的生成更稳定。
人在环路是产品定义的一部分,不是缺陷描述。失败由人修改提示或手写。
对后续 LLM 的影响
代码模型第一次有了大规模日活界面。反馈(接受或拒绝)后来成为改进补全的产品数据,接口从 2021 年 6 月起就已存在。「提示」变成了当前文件:GPT-3 的 few-shot 是刻意拼接的示范,Copilot 的条件则是打开的缓冲区、注释与函数名。上下文学习从论文里的实验设定变成默认的 IDE 行为。
「Copilot」一词自此被占住。此后 Microsoft 365 Copilot、GitHub Copilot Chat 以及各种「X Copilot」都借用副驾驶隐喻。2021 年这个词所指的仍是补全,不是自主执行。
对 AI Agent 的影响
时间线把它标成底层能力里的工程化:有副作用,无目标循环。演化写在交付位置的变化上,不把 2023 年的形态写回 2021 年。
| 2021 技术预览 | 后来编码 Agent 多出来的能力 |
|---|---|
| 当前文件上下文 | 仓库、终端、浏览器、issue |
| 建议一行 / 一个函数 | 多文件补丁、命令、测试 |
| 人立刻接受或拒绝 | 循环中依据测试回执再修改 |
| 无自主目标 | 有任务目标(修复缺陷、实现规格) |
副作用发生在编辑器缓冲区:插入或替换文本。观察等于当前缓冲区。没有「做到某个外部谓词为真」的终止条件,但它是「Copilot → Agent」这条产品线的起点。
7 - Codex
Chen 等,2021,Evaluating Large Language Models Trained on Code。在公开 GitHub 代码上微调 GPT,得到 Codex。独立的生产版本驱动 GitHub Copilot 与 API。同篇论文交出的考卷见 HumanEval。
原文:arXiv:2107.03374(HTML、PDF)。
7.1 - Evaluating Large Language Models Trained on Code(论文)
Mark Chen, Jerry Tworek, Heewoo Jun, Qiming Yuan 等(OpenAI;部分作者标注工作完成于 OpenAI)。Evaluating Large Language Models Trained on Code。2021-07。arXiv:2107.03374。Chen、Tworek、Jun、Yuan 为通讯作者。正文写明:若干早期 Codex 模型的后代驱动 GitHub Copilot 与 OpenAI API 中的 Codex。
摘要
引入 Codex:在 GitHub 公开代码上微调的 GPT 语言模型,并研究其写 Python 的能力。独立的生产版本驱动 GitHub Copilot。新评测集 HumanEval 衡量「根据文档字符串合成程序」的功能正确性:本模型解出 28.8% 的题目,GPT-3 为 0%,GPT-J 为 11.4%。反复从模型采样是应对难题的有效策略:每题 100 个样本可解出 70.2%。限度包括:长操作链的文档字符串;把操作绑定到变量。最后讨论部署强大代码生成技术的更广泛影响:安全、安保与经济。
1 引言
序列预测模型已成为多模态的通法。代码出现在大规模数据集里之后,语言模型开始推进程序合成。GPT-3 已能从 Python 文档字符串生成简单程序,尽管并未为代码生成专门训练。假设专门的 GPT(Codex)能擅长多种编码任务。
本文聚焦:根据文档字符串生成独立的 Python 函数,用单元测试自动判对错。这与自然语言生成靠启发式或人工打分不同。为此手写 164 道带单测的编程题,覆盖语言理解、算法与简单数学,部分接近初级面试题。数据与评测框架发布于 https://github.com/openai/human-eval。
单样本:12B Codex 解 28.8%,300M 解 13.2%;6B GPT-J 11.4%;各档 GPT 接近 0%。再在「正确实现的独立函数」上微调得到 Codex-S,单样本 37.7%。每题 100 个样本并选出能过单测的,Codex-S 达 77.5%;若不能跑单测、只取平均 log 概率最高的样本,为 44.5%。真实编程通常是迭代与修复缺陷,多采样是对这一过程的近似。
2 评测框架
2.1 功能正确性与 pass@(k)
代码生成主流曾用与参考解的精确或模糊匹配(BLEU)。匹配无法覆盖「功能等价但写法不同」的大空间。本文采用功能正确:样本通过一组单元测试即算对。这与测试驱动开发、合并代码前先通过单元测试的工程习惯一致。
pass@(k):每题生成 (k) 个样本,任一通过则该题算解出,再报解出比例。直接用 (k) 个样本方差大。改为每题生成 (n\ge k) 个(本文 (n=200),(k\le 100)),设 (c) 个通过,用无偏估计
[ \mathrm{pass@}k=\mathbb{E}_{\text{Problems}}\left[1-\frac{\binom{n-c}{k}}{\binom{n}{k}}\right] ]
用 (1-(1-\hat p)^k) 是有偏的。后文显示:功能不等价的错误解与正确解的 BLEU 分布大量重叠,优化 BLEU 不等于优化功能正确。
2.2 HumanEval
164 道手写题。每题含签名、文档字符串、函数体与若干单测,平均 7.7 个测试。必须手写:模型训在 GitHub 很大一部分上,网上已有各种题解(例如 APPS 所用的 Codeforces)。
2.3 沙箱
公开程序意图未知,生成程序常是错的,执行有安全风险。因此评测在隔离环境里执行,并限制网络访问。目标:防止修改宿主机、持久化、访问敏感资源或外泄数据。
3 代码微调
在最多 12B 参数的 GPT 上微调得到 Codex。
数据。 2020 年 5 月,GitHub 上 5400 万个公开仓库;小于 1MB 的不重复 Python 文件 179GB。过滤可能自动生成、平均行长 >100、最大行长 >1000、字母数字比例过低的文件后,159GB。
方法。 原假设从 GPT-3 初始化会更好;未观察到最终提升,可能因为微调数据已经很大。但从 GPT 初始化收敛更快,后续实验仍用。学习率与对应 GPT 相同;175 step 线性 warmup + 余弦衰减;共 1000 亿 token;Adam。词表基于 GPT-3,另加不同长度空白的专用 token,代码大约少用 30% token。采样遇到 \nclass、\ndef 等停止,以免继续写下一个函数。nucleus (p=0.95)。
结果。 代码微调后的测试损失仍近似幂律。pass@(k) 的最优温度随 (k) 升高:多样性对大 (k) 有利。12B:表 1 中 pass@1 / 10 / 100 为 28.81% / 46.81% / 72.31%。GPT-J-6B 约等于 Codex-300M;Tabnine 免费最大模型约等于 Codex-12M。
不能跑单测、只能返回一个补全时:选平均 token log 概率最高的样本好于随机;按总和 log 概率选可能比随机更差。
APPS。 Codex 未在 APPS 上微调。文档字符串末加一条输入输出示例作格式提示(文中称 1-shot)。12B 与在 APPS 上微调的 GPT-Neo 可比。竞赛题常写出正确但不够快的解。
4 监督微调(Codex-S)
GitHub 上还有类、配置、脚本、数据文件,与「从文档字符串合成函数」分布不同。再从竞赛/面试站(约 1 万题)以及带 CI 的仓库(追踪函数调用得到输入输出)收集「正确的独立函数」,过滤掉 Codex-12B 生成 100 个样本仍无一正确的题。在这些题上再微调,得到 Codex-S。pass@1 平均高约 6.5 个百分点,pass@100 平均高约 15.1 个百分点。
5 文档字符串生成(Codex-D)
把签名 + 参考实现 + 文档字符串拼起来,训练根据代码写文档字符串,便于描述生成代码的意图。人工判「是否唯一且准确描述函数体」:Codex-D-12B 的 pass@1 / pass@10 为 20.3% / 46.5%,低于对应 Codex-S。用反向翻译(生成代码再打文档字符串似然)给多样本排序,差于平均 log 概率。
6 限度
作者自己列出:
- 训练样本效率极差:用了 GitHub 上公开 Python 的很大一部分;入门课学生仍应解出比 Codex-12B 更大的比例。
- 会建议语法错误或未定义的代码,调用作用域外的函数、变量、属性。
- 长、高层、系统级规格越来越吃力。把 13 种确定性字符串操作串进文档字符串,每多一环 pass 率大约降 2–3 倍——人若会做长度为 2 的链,应能做任意长;模型不是。
- 操作与变量的绑定会错,尤其文档字符串里操作和变量都多的时候。
7 更广泛影响与危害分析
潜在用处:上手新代码库、减少上下文切换、让非程序员写规格由模型起草实现、教育。同时有对齐、误用与安全问题。危害分析不是某一产品说明书。
要点:过度依赖(看起来正确,实际并未完成意图,对新手尤甚);不对齐(下一 token 目标会模仿提示里的坏代码,规模变大时这类缺陷可能更明显);偏见;不安全代码(附录 G:生成加密上下文时,相当比例选用明显不安全的参数,如过短 RSA、AES-ECB);对恶意软件门槛的当前评估是「尚未实质降低」,更强模型另说。缓解:文档与 UI、代码审查、过滤、API 审核与限流。
8–9 相关工作与结论
程序合成、CodeBERT / GPT-Neo / APPS 等。结论:在代码上微调的 GPT 可用单测衡量的功能正确性写出 Python 函数;多采样显著提高解出率;限度与部署风险需要单独对待。致谢包括与 GitHub 合作构建 Copilot、Azure 训练基础设施。
7.2 - Codex 讲解
论文解决了什么问题
2021 年年中,GPT-3 已经证明规模带来上下文学习,写代码仍是附属现象:GPT-3 在 HumanEval 上约为 0%。BLEU 分不清「形似」与「功能正确」,而程序合成要求的正是功能正确。
Codex 做了两件后来被当作默认做法的事:在公开代码上继续训练 GPT,把下一个 token 对准源代码分布;用手写题目与单元测试定义对错,并给出无偏的 pass@(k)。手写是为了减少训练语料泄漏。多采样被写成对「尝试多种写法」的近似。限度写得很明确:长操作链指数变差,会编造不存在的符号,会建议不安全的配置。沙箱是为了安全地运行这些样本,不是给 Agent 用的执行环境产品。
对象是函数级合成,不是在仓库里修改缺陷、提交 PR。164 道题、平均 7.7 个测试,尺度故意很小,为的是可复现。
对后续 LLM 的影响
代码成为语言模型的一等模态。此后 GPT-3.5、GPT-4 与 Claude 把代码能力做进基座,不再单独称为 Codex。评测从「形似」转为「功能正确」:HumanEval、MBPP、LiveCodeBench 沿用功能正确。pass@(k) 也解释了产品里常见的「再生成一次」。文档字符串与代码之间是同一套补全。泄漏与手写基准这一问题,一直传到 SWE-bench 的去污染讨论。
它没有解决指令跟随是否稳定,也没有解决「在真实代码库中定位、修改、验证」,后者是 2023 至 2024 年编码 Agent 的评测对象。
对 AI Agent 的影响
编码 Agent 的前提是:决策核心能够写出可执行的代码,并且有办法知道写得对不对。Codex 提供模型侧的首证,尺子见 HumanEval。没有能够运行的代码,后来就不会有「让模型在仓库里把测试跑绿」的循环。核心不是运行时:一次补全一个函数,由人在 IDE 里接受或拒绝。
| 论文里的机制 | 后来在 Agent 里对应的物理事实 |
|---|---|
| 文档字符串条件生成 | 任务说明、issue、测试名可以充当提示;模型产出补丁或脚本 |
| 单测定义正确 | 循环中「行动」的反馈可以是测试退出码 |
| pass@(k) / 多采样 | 同一步可以尝试多种补丁;后来的重试与 best-of-n 是同一逻辑放大到仓库 |
| 隔离评测环境 | 为评测而隔离;2023 年之后沙箱变成 Agent 基础设施,对象从「跑 164 道题」变成「不要在用户机器上乱执行」 |
| 函数级、独立文件 | 远窄于 SWE-bench 与多文件重构。HumanEval 通过不代表能修真实 issue |
时间线标成底层能力里的首证:行动第一次可以是被机器执行、又被机器检验的代码。
8 - HumanEval
Chen 等,2021,随 Evaluating Large Language Models Trained on Code 发布。衡量「根据文档字符串合成 Python 函数」能否通过单元测试,而不是与参考解是否相似。
数据与评测框架:openai/human-eval。同篇论文里的模型见 Codex。原文:arXiv:2107.03374。
8.1 - HumanEval(论文)
评测集随 Codex 论文一次交出。这里只转述 HumanEval 这张考卷;模型训练与限度见 Codex 论文。Chen 等,Evaluating Large Language Models Trained on Code,2021-07。arXiv:2107.03374。仓库:https://github.com/openai/human-eval。
主张
代码生成原先常用与参考解的精确或模糊匹配(BLEU)。匹配无法覆盖「功能等价但写法不同」的大空间。本文改用功能正确:样本通过一组单元测试即算对。这与测试驱动开发、合并代码前过单测的工程习惯一致。
为此手写 164 道带单测的 Python 题,覆盖语言理解、算法与简单数学,部分接近初级面试题。每题含签名、文档字符串、函数体与若干单测,平均 7.7 个测试。必须手写:模型训在 GitHub 很大一部分上,网上已有各种题解。
pass@k
每题生成 (k) 个样本,任一通过则该题算解出,再报解出比例。直接用 (k) 个样本方差大。改为每题生成 (n\ge k) 个(文中 (n=200),(k\le 100)),设 (c) 个通过,用无偏估计
[ \mathrm{pass@}k=\mathbb{E}_{\text{Problems}}\left[1-\frac{\binom{n-c}{k}}{\binom{n}{k}}\right] ]
用 (1-(1-\hat p)^k) 是有偏的。文中还显示:功能不等价的错误解与正确解的 BLEU 分布大量重叠,优化 BLEU 不等于优化功能正确。
当时报的分数(对照模型)
12B Codex 单样本解出 28.8%;GPT-3 约 0%;GPT-J 11.4%。每题 100 个样本,Codex 可解出约 70%。监督微调后的 Codex-S,pass@1 约 37.7%,pass@100 约 77.5%。这些数字属于模型对照,不是考卷自己的属性。
当时不是什么
不是仓库级、多文件、带真实 GitHub issue 的考试。164 道独立函数,尺度故意很小,为的是可复现、可自动判。执行在 gVisor 沙箱里,是为了安全地跑生成代码。
8.2 - HumanEval 讲解
论文解决了什么问题
2021 年若只用 BLEU,分不清「形似」与「功能正确」。HumanEval 用手写题目与单元测试定义对错,并给出无偏的 pass@(k)。手写是为了减少训练语料泄漏。多采样(pass@100)被写成对「尝试多种写法」的近似。同日交出的模型见 Codex。
对后续 LLM 与 Agent 的影响
评测从「形似」转为「功能正确」。后来的 MBPP、LiveCodeBench 沿用功能正确;产品里的「再生成一次」与 pass@(k) 是同一逻辑。泄漏与手写基准这一问题,一直传到 SWE-bench 的去污染讨论。
它覆盖的是函数级合成,不是在仓库里修改缺陷、提交 PR。164 道题远窄于 2023 年的 SWE-bench。HumanEval 通过,不代表能修真实 issue。
对 Agent 循环而言,它提供的是完成谓词的早期形态:行动的反馈可以是测试退出码,而不只是人看一眼。循环本身不在这张考卷上。考卷没有决策核心,没有多步环境,也没有开放目标。这条路一直走到 2023 年的 SWE-bench。
时间线标成底层能力里的首证、标准。仓库级的完成谓词要到 SWE-bench。
9 - WebGPT
Nakano 等,2021,WebGPT: Browser-assisted question-answering with human feedback。微调 GPT-3,使其在文本网页浏览环境中搜索与导航,并用人类反馈优化长问答;答案必须带浏览过程中摘下的引用。
- 论文:按原文结构转述环境动作、行为克隆与人类反馈、ELI5 与 TruthfulQA,不加入后来的 ReAct 与 Agent 解释。
- 讲解:封闭问答循环如何接通模型、环境与工具;说明回合为什么止于作答,仍不是开放任务上的自主 Agent。
原文:arXiv:2112.09332(HTML、PDF)。
9.1 - WebGPT(论文)
Reiichiro Nakano, Jacob Hilton, Suchir Balaji, Jeff Wu, Long Ouyang, Christina Kim, Christopher Hesse, Shantanu Jain, Vineet Kosaraju, William Saunders, Xu Jiang, Karl Cobbe, Tyna Eloundou, Gretchen Krueger, Kevin Button, Matthew Knight, Benjamin Chess, John Schulman. WebGPT: Browser-assisted question-answering with human feedback. 2021-12。arXiv:2112.09332。Nakano、Hilton、Balaji 同等贡献。
摘要
微调 GPT-3,使其利用基于文本的网页浏览环境回答长问答:模型可以搜索并在网上导航。任务被设计成人类也能做,因而可用模仿学习训练,再用人类反馈优化答案质量。为降低事实核对难度,模型浏览时必须收集引用,作答须有依据。主数据集是 ELI5(Reddit「像对五岁孩子解释那样」的问题)。最佳模型:在演示上做行为克隆,再对预测人类偏好的奖励模型做拒绝采样。该模型的答案相对人类演示员胜 56%,相对 Reddit 最高票答案胜 69%。
1 引言
长问答(LFQA)仍落后于人。已有工作分别改进检索与综合。本文把检索外包给 Bing Web Search API,综合交给微调后的 GPT-3;重点是更忠实的训练目标。沿用 Stiennon et al. 2020,用人类反馈直接优化答案质量。
两项关键贡献:
- 文本浏览环境,微调后的语言模型可与之交互;检索与综合可用模仿学习、强化学习等通用方法端到端改进。
- 答案带引用(浏览时从页面摘的段落),标注者不必另做困难且主观的独立调研就能判事实。
额外收集两类数据:人类用该环境答题的演示;同一问题下两个模型答案(各带引用)的比较。评判事实准确性、连贯性、总体有用性。四种用法:行为克隆、奖励模型、针对奖励模型的强化学习、拒绝采样。最佳组合是行为克隆 + 拒绝采样;推理算力更紧时强化学习仍有一点好处。
评测三件事:相对演示员 56%;相对 ELI5 最高票(去掉引用后)69%;TruthfulQA 上真实 75%、真实且有信息量 54%,超过基座 GPT-3,仍低于人。
相对 REALM / RAG:那些工作改进给定查询的文档检索。本文用现成搜索引擎,优点是已经很强、索引新、可把「会用搜索引擎答题」当成人类擅长、模型可模仿的高层任务。
2 环境
模型每次看到当前状态的文字摘要:问题、当前页在光标处的文本、其他元数据(图 1)。必须发出表 1 中的一条命令。每步上下文是新的;先前步骤只活在摘要里记下的内容。
表 1(动作)
| 命令 | 效果 |
|---|---|
Search <query> |
发给 Bing API,展示结果页 |
Clicked on link <id> |
跟随该 ID 的链接 |
Find in page: <text> |
找下一处出现并滚过去 |
Quote: <text> |
若当前页含该文本,记为引用 |
Scrolled down/up <1,2,3> |
滚动 |
Top |
到页顶 |
Back |
上一页 |
End: Answer |
结束浏览,进入作答 |
End: Nonsense / Controversial |
结束浏览且不作答 |
其它文本视为非法动作:计入步数上限,否则忽略。浏览直到模型结束、达到最大动作数、或引用总长达到上限。至少有一条引用后,把问题与引用提示给模型,写最终答案。细节在附录 A。
3 数据与训练
预训练模型不会环境命令格式,必须先有人类演示。仅模仿不太可能明显超过人类(Stiennon et al.)。故再收集成对比较。
约 6000 条演示(92% 来自 ELI5),约 21500 条比较(98% 来自 ELI5),另混少量 TriviaQA 等。演示用图形界面,信息与文本界面实质相同。强调:相关、连贯、有可信引用支持。比较数据集后来公开(附录 K)。
从 GPT-3 家族微调,重点 760M、13B、175B。
- 行为克隆(BC)。 监督微调,标签是演示员发出的命令。
- 奖励模型(RM)。 从去掉最后解嵌层的 BC 出发,输入问题与带引用的答案,输出标量 Elo;差值是「标注者更偏好前者」的 logit。交叉熵;平局作 50% 软标签。最终 RM 约用 16000 条比较,5500 条仅评测。
- 强化学习(RL)。 PPO 微调 BC;回合结束时的 RM 分作环境奖励,并对每 token 加相对 BC 的 KL 惩罚。ELI5 90% + TriviaQA 10%。每回合末插入 15 个「只用刚收集的引用作答」的附加回合,样本效率约 ×2。最大浏览步数在 20–100 均匀随机。
- 拒绝采样(best-of-(n))。 从 BC 或 RL 采 4 / 16 / 64 个答案,取 RM 最高者。不必再训练,消耗推理算力。
BC / RM / RL 用互斥问题集。
4 评测
主评三档算力帕累托模型:760M best-of-4、13B best-of-16、175B best-of-64,皆 BC + 同尺寸 RM 拒绝采样。温度 0.8,最多 100 步浏览。主文为简化不含 RL(与拒绝采样合用时增益不大)。
ELI5。 相对演示员:同一套比较规程,175B best-of-64 胜 56%(平局计 50%)。作者认为这说明人类反馈必要,因为只模仿演示不应稳定超过 50%。相对 Reddit 最高票:去掉引用、换不熟悉细则的标注者、用更简指令,胜 69%。对照 Krishna et al. 2021 的 23%(且算力更小)。作者更看重对演示员的比较:有引用有据可核对、标准更清楚、文风更可比、ELI5 原帖意图与低质量回答干扰更少。
TruthfulQA。 对抗性短问题。WebGPT 答案截到 50 token。所有 WebGPT 档在「真实」「真实且有信息」上均超过带两种 prompt 的 GPT-3;且 WebGPT 的「真实且有信息」随模型变大而升,GPT-3 则否。摘要中的 75% / 54% 对应最佳模型。
5 方法比较与规模
拒绝采样收益大:175B best-of-64 相对纯 BC 胜 68%。RL 相对 BC 胜 58%,收益更小。可能原因:多次作答本身利用推理算力;环境不可预测,拒绝采样可事后评估去过的许多网站;RM 数据多来自 BC 与拒绝采样,对 RL 过优化更脆;RL 要调参。RL + 拒绝采样并不明显好于单用拒绝采样。BC 基线必须仔细调 epoch 与温度,否则会夸大 RL 的优势。
演示数量加倍,策略的 RM 分约 +0.13;比较数量加倍,RM 准确率约 +1.8%。参数加倍,策略 RM 分约 +0.09,RM 准确率约 +0.4%。给定推理预算,用一些拒绝采样是划算的,但不是越多越好。
6 讨论(论文自己写的限度)
区分两类假话:训练目标激励的模仿性谬误;未达到目标造成的非模仿性谬误(多数幻觉)。WebGPT 在 TruthfulQA 上模仿性谬误少于 GPT-3,作者归因于 Bing 过滤与「要用可靠来源」的说明;仍会引用很不可靠的源(分布从 ELI5 移到 TruthfulQA)。ELI5 上非模仿性谬误也少于 GPT-3,但仍会在转述、综合时出错,而不是漫无目的幻觉。
引用让答案看起来更权威,叠加自动化偏见,可能导致过度依赖;分布外问题比人更容易错。会强化已有偏见与问题里的隐含预设。引用有助于评判,也激励模型挑选能说服标注者的来源而非全面证据;更强模型与更主观问题会加重这一点。文中提到辩论、递归奖励建模等作为缓解方向。
在线访问风险。 训练与推理时经环境访问活的网络。若能提交表单,理论上可改维基再当可靠引用。作者认为当前环境只允许 Bing 查询与跟随已有链接,直接改维基不可用;WebGPT 能力远低于提权所需。能力上升时,给网络访问的安全举证责任应上升。
7–8 相关工作与结论
相关:IBM Watson / DeepQA;DPR、REALM、RAG(可微内积检索,难接搜索引擎,可解释性较弱);把浏览写成 RL;用 BC/RL 控制浏览器做其它任务。
结论:把语言模型微调到文本浏览环境里做长问答,可用模仿与强化学习直接优化答案质量;引用降低评测难度。最佳模型在 ELI5 上超过演示员,分布外问题仍然吃力。
9.2 - WebGPT 讲解
论文解决了什么问题
2021 年底,GPT-3 能在上下文里做新任务,RAG 能先检索再生成,但两条路都还不是「会用搜索引擎的人」那种过程:修改查询、点进一页、滚动、摘录一句、不满意再搜。长问答的事实核对对人极为困难,没有出处就只能凭感觉。
WebGPT 把问题收缩成一个人类也能完成的浏览任务,因此可以:录演示做行为克隆(预训练 GPT-3 本身不会这套命令格式);比较两个带引用的答案,训练奖励模型,再用拒绝采样或 PPO 优化;强制引用,把「这句话是否属实」部分转化为「是否被这些来源支持」。
检索外包给 Bing,不训练可微 DPR。环境是文本的:每一步把页面状态写成提示,模型输出一条命令。记忆不通过隐状态跨步传递,只存在于摘要与已摘引用之中。作者自己把与 RAG 的差别写在第 2 节:RAG 改进给定查询的检索,本文改进的是「如何使用已经很强的搜索引擎」。结论也写明:分布外(TruthfulQA)仍明显弱于人。
对后续 LLM 的影响
Search、Quote、End: Answer 是后来 function calling 的实验室前身:模型必须输出可执行动作,非法输出被丢弃但仍消耗步数。人类反馈从摘要偏好接到带工具的轨迹(BC、RM、优化,方法直接引用 Stiennon 那条人类反馈工作)。引用成为评测接口,不是产品合规的附录。在这个不可预测的环境里,多试几次再挑往往比当场做 PPO 更稳;后来许多系统在工具循环之外再套一层 best-of-n,与这条观察同类。
它没有大众对话界面,也没有把浏览做成可插拔协议。浏览器是论文里的环境。
对 AI Agent 的影响
时间线把它标成底层能力里的首证:模型、环境与工具三者结合的实验室形态。决策核心是 GPT-3;行动是搜索、点击、滚动、引用;反馈是页面文本。外形上已经有循环、动作与观察。
目标函数始终是答好当前这道 ELI5,回合结束于 End: Answer。这是封闭问答循环,不是「给出一个开放目标,自行迭代到完成」。谓词是带引用的答案,不是仓库、桌面或任意工作流上的外部完成条件。