背景

最近花时间学习了Andrej Karpathy最新的分享:Software Is Changing (Again)

这里面的知识点很多,干货十足。

这里先从software 1.0 vs software 2.0 vs software 3.0开始。

如何比较

我们将从以下五个角度继续细化剖析:

  1. 编程范式:谁在“写程序”?程序长什么样?

  2. 交互方式:人与计算机如何沟通?

  3. 学习方式:软件是如何学习?

  4. 泛化能力:能做哪些任务?需不需要从头训练?

  5. 系统架构与输入输出形式:系统input、process、output之间的差异。

编程范式(Programming Paradigm)

特征 Software 1.0 Software 2.0 Software 3.0
编程者(人)角色 明确写出所有逻辑(if/else等) 准备数据并设计模型结构 提示工程师,编写自然语言提示
程序的本质 人写的代码(deterministic) 参数训练出的权重(non-symbolic) Prompt 作为控制逻辑(可变,灵活)
表达能力 有限:只能表示明确规则 中:可以逼近复杂模式 高:语言可描述几乎所有逻辑与上下文

从“利用编程语言写规则”转变为“利用自然语言描述任务”: 代码code→权重weight→提示词Prompt

交互方式(Human-Computer Interaction)

特征 Software 1.0 Software 2.0 Software 3.0
交互接口 编译器、IDE、命令行 调用API、训练模型 自然语言对话界面、提示输入框
任务分配方式 人全权指定 人提供目标+数据,模型自学习 人通过语言表述意图,模型自适应
实时反馈性 低(需重训练) 高(可即时理解和响应)

人类指令变得越来越像“对话”而不是“控制”: 编程语言的控制(control)→抽象API的调用(call)→自然语言的对话(Chat)

学习方式(Learning)

特征 Software 1.0 Software 2.0 Software 3.0
学习来源 无,全部人类输入 从大量数据中自动学习 通过大量语料预训练,再用少量示例调整
是否可迁移 否,程序只做一件事 否,模型常常为一个任务设计 是,同一LLM可处理多任务,零样本或少样本即可
对错误的反应 人修改代码 重新训练模型 只需修改提示词(prompt)即可尝试修复

从“静态逻辑”变为“动态适应”: 修改代码 → 训练模型 → 修改提示词

泛化能力(Generalization)

特征 Software 1.0 Software 2.0 Software 3.0
跨任务能力 无,每写一个程序解决一个问题 弱,迁移学习困难 强,同一模型可做总结、翻译、推理、编程等任务
多语言、多模态 支持差,需重新开发 可能支持部分 强,多语言+多模态+多任务融合

从具体到通用: 为具体任务建模 → 为一类任务训练模型 → 提供通用模型实现提示词完成各种任务

系统结构与输入输出(System Architecture & IO)

特征 Software 1.0 Software 2.0 Software 3.0
系统结构 冯·诺依曼结构 + 手写程序 神经网络结构(如CNN、RNN) Transformer结构 + 超大参数(>100B)
输入形式 明确命令、变量 向量表示(one-hot/bag-of-words) 自然语言/图像/语音等各种多模态输入
输出形式 控制信号、字符串、图形界面 类别、概率、数值等 文本、代码、图像描述等多样信息

从指令到自然语言: 结构化指令 → 向量(矩阵)输入/输出 → 自然语言输入输出

总结

Software 1.0:人类 → 规则 → 程序 → 计算机

Software 2.0:人类 → 数据 → 训练 → 神经网络

Software 3.0:人类 → Prompt → LLM