前言

生成式AI的浪潮一波接一波,ChatGPT更是成了全民话题。不少开发者,尤其是做应用层的朋友,心里可能都在嘀咕:这东西到底是怎么工作的?本文的目标很简单——从一个应用工程师的视角,把AI和ChatGPT的核心原理拆开揉碎,讲给完全没有基础的同学听。GPT自己给出的评价是“通透且深入&浅出”,所以放心读下去就好。
基本概念
在深入ChatGPT之前,有几个基础概念得先打个照面。它们就像AI世界的通用语言,理解了这些,后面的内容才会顺畅。
神经网络:模仿人类神经系统结构的机器学习算法,擅长图像、语音、文本等任务的模式识别。
自然语言处理:让计算机理解和生乘人类语言的技术,涵盖语音识别、文本分析、机器翻译等方向。
机器学习:核心是让计算机从数据中自动学习规律,然后用来预测或决策——说白了,就是“用数据喂出来的智能”。
深度学习:机器学习的一个分支,利用多层神经网络做特征提取和推断,图像识别、语音助手、翻译工具背后都有它的影子。
强化学习:让智能体通过与环境的试错互动来学习最优策略,AlphaGo、自动驾驶决策模块用的就是这套逻辑。
大模型:指参数量巨大、结构复杂的机器学习模型,需要海量数据和算力支撑。ChatGPT就是一个典型,1750亿个参数,光想想就知道它有多“大”。
计算机视觉:让计算机“看懂”图像和视频,比如人脸识别、目标检测、医学影像分析。
数据挖掘:从海量数据中自动发现隐藏的模式和知识,商业推荐、医疗诊断、科研分析都离不开它。
人机交互:研究人和计算机如何更自然地交流,语音助手、触控屏幕、VR眼镜都属于这个领域。
自主驾驶:依靠传感器和AI实现车辆在无人类干预下的自主行驶,涉及感知、决策、控制等多个技术栈。
语音识别:将人类语音转化为文字或指令,Siri、小爱同学、语音输入法都是它的应用。
从ChatGPT剖析
与其从底层理论一路讲到应用,不如反过来——先看看ChatGPT在做什么,再一层层往下挖,这样更直观,也更容易记住。
ChatGPT的原理
说白了,ChatGPT的核心工作就是一个循环:给定到目前为止的文本,判断“下一个词应该是什么”,然后把选中的词拼上去,再重复这个过程。每一步,模型都会给出一个带有概率的候选词列表,再通过一定的随机策略从中选一个。专业术语里,这叫基于LSTM或Transformer的深度学习模型,对上下文进行建模,预测下一个词的概率分布。
概率如何来?
打个比方,假如你想以“猫是”开头接一个句子。这里先用一个简单的n-gram算法(注意,ChatGPT用的不是这个,但原理类似)演示一下概率是怎么产生的。下面是一段Ja vaScript代码:
// 定义n-gram模型的参数
const n = 2; // n-gram的n值
const data = ['猫', '是', '小', '动', '物', '之', '一', '。', '狗', '也', '是', '小', '动', '物', '之', '一', '。', '喵', '喵', '是', '猫', '发', '出', '的', '声', '音', '。', '汪', '汪', '是', '狗', '发', '出', '的', '声', '音', '。']; // 语料库
// 定义生成下一个单词的函数
function generateNextWord(prefix, model) {
const candidates = model[prefix];
if (!candidates) {
return null;
}
const total = candidates.reduce((acc, cur) => acc + cur.count, 0);
let r = Math.random() * total;
for (let i = 0; i < candidates.length; i++) {
r -= candidates[i].count;
if (r <= 0) {
return candidates[i].word;
}
}
return null;
}
// 定义生成句子的函数
function generateSentence(prefix, model, maxLength) {
let sentence = prefix;
while (true) {
const next = generateNextWord(prefix, model);
if (!next || sentence.length >= maxLength) {
break;
}
sentence += next;
prefix = sentence.slice(-n);
}
return sentence;
}
// 训练n-gram模型
const model = {};
for (let i = 0; i < data.length - n; i++) {
const prefix = data.slice(i, i + n).join('');
const suffix = data[i + n];
if (!model[prefix]) {
model[prefix] = [];
}
const candidates = model[prefix];
const existing = candidates.find(candidate => candidate.word === suffix);
if (existing) {
existing.count++;
} else {
candidates.push({ word: suffix, count: 1 });
}
}
// 使用示例
const prefix = '猫是';
const maxLength = 10;
const sentence = generateSentence(prefix, model, maxLength);
console.log(sentence); // 输出 "猫是小动物之一。"
这个例子每次都会返回固定的结果,但如果n-gram列表足够大、数据足够多,就能引入随机性,让生成结果变得多样。这就解释了大语言模型为什么需要那么庞大的语料库——数据量越大,概率分布越精准,生成的结果越自然。
大语言模型
大语言模型(比如GPT-3)本质上是一种基于深度学习的神经网络模型。它通过无监督学习的方式,从海量文本中自动学习语言规律,然后在自然语言处理任务上表现出色。
机器学习模型大致可以分成这么几类:
1. 线性回归:预测连续值,比如房价。
2. 逻辑回归:做二分类,比如判断邮件是否垃圾。
3. 决策树:自动找出数据中的决策规则,可分类可回归。
4. 随机森林:多个决策树组合的集成模型,效果更稳。
5. 支持向量机:在高维空间找最优超平面,擅长分类和回归。
6. 神经网络:处理图像、语音、文本等复杂任务的主力。
7. 聚类模型:无监督地把数据分成不同组,比如K-means。
8. 强化学习:智能体与环境交互学习,适合自动驾驶等决策问题。
那么多大模型是怎么来的?通常是用神经网络算法训练出来的——因为只有神经网络才能扛住上亿甚至千亿级别的参数。当然,也有自回归模型、自编码器等其他技术,但神经网络是绝对的主角。
什么又是神经网络?
前面说了,神经网络是模仿人类神经系统的机器学习算法。它的结构其实很像一张图:每个神经元相当于图上的节点,连接神经元的权重就是图的边,整个网络就是一个有向图。
训练神经网络,本质上就是在调整这些连接权重,让网络对训练数据的拟合越来越好。而预测过程呢,就是从输入层到输出层的信息传递——就像在图里做一次遍历。
再来看一段Ja vaScript代码,它实现了一个简单的前馈神经网络,用来做二分类:
// 定义神经网络结构
const inputSize = 3;
const hiddenSize = 4;
const outputSize = 2;
// 定义神经网络参数
const weights1 = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
];
const bias1 = [1, 2, 3, 4];
const weights2 = [
[1, 2],
[3, 4],
[5, 6],
[7, 8]
];
const bias2 = [1, 2];
// 定义激活函数
function sigmoid(x) {
return 1 / (1 + Math.exp(-x));
}
// 定义前馈神经网络函数
function feedForward(input) {
// 计算第一层输出
const hidden = [];
for (let i = 0; i < hiddenSize; i++) {
let sum = 0;
for (let j = 0; j < inputSize; j++) {
sum += input[j] * weights1[j][i];
}
hidden.push(sigmoid(sum + bias1[i]));
}
// 计算第二层输出
const output = [];
for (let i = 0; i < outputSize; i++) {
let sum = 0;
for (let j = 0; j < hiddenSize; j++) {
sum += hidden[j] * weights2[j][i];
}
output.push(sigmoid(sum + bias2[j]));
}
return output;
}
// 使用示例
const input = [1, 2, 3];
const output = feedForward(input);
console.log(output); // 输出 [0.939, 0.985]
神经网络的输出可以解释为一个概率向量:在这个例子中,[0.939, 0.985] 表示输入属于两个类别的概率估计。ChatGPT的原理与之类似——它输出的每一个候选词也附带一个概率,模型根据概率分布决定下一个词选谁。
搞清楚了“概率从哪来”和“网络怎么算”,ChatGPT生成答案的过程就透明了:先根据上下文计算下一个词的概率分布,再选一个概率最高的词,然后拼接、继续,直到句子结束。
ChatGPT怎么知道你问的什么?
前面解释了答案怎么一个词一个词生出来,那ChatGPT又是怎么“听懂”问题的呢?它依靠的是自然语言处理技术和深度学习算法,对用户的输入做语义分析和意图识别。具体来说,它会结合对话历史和上下文信息,理解你的真实需求,然后基于前面提到的概率分布,随机或贪婪地生成下一个词,逐步拼成一段合理的回答。
因为本质上是概率组装,所以ChatGPT偶尔会产出语法或语义上有瑕疵的句子。为了提高质量,工程师们加入了一些技巧,比如束搜索(Beam Search)、长度惩罚、重复惩罚等。这些方法能有效减少错误,让生成的回答更流畅、更准确。
总结
生成式AI的基本工作流就是这样:通过深度学习算法处理海量文本数据,学习语言的语法和语义规律,然后基于上下文构建语言模型,最后用随机采样或贪心搜索的方式,一步步生成符合语法和语义的文本序列。理解了这个过程,再去看那些花里胡哨的AI产品,心里就有底了。
