学到一点就写一点 · AI 大白话 用具体例子,把 AI 的原理和用法讲清楚。
文字、向量与回答的概念封面 · 点击放大
上一篇,我们用整理周报的例子,把模型、资料、工具和做事流程放在了一张地图里。这一篇,先看看其中负责生成回答的“大脑”。
即使没看过上一篇,也可以从这个小例子开始。你给大模型输入一句话:
我今天很开心。
它可能会回答:
今天有什么好事?可以和我分享一下吗?
这是一个假设的对话。我们很容易看出,模型接住了“开心”这个情绪,还顺着它继续聊了下去。
但计算机处理的是数字。它究竟怎样把“开心”这样的文字变成可以计算的东西,又怎样生成一句合适的回答?
这一篇先走通一条线:文字拆成词元 → 编号映射成向量 → 结合上下文计算 → 逐步生成回答。
我们以常见的自回归 Transformer 语言模型为例。注意力怎样计算、模型为什么能推理,会在后续篇目展开。先从最基础的一步开始:把文字变成数字。
先拆开文字,再给它编号。
大模型收到一段文字后,通常会先把它拆成更小的单位,叫作词元(Token)。
一个词元可能是一个字、一个词,也可能是词的一部分。具体怎么拆,取决于模型使用的分词器。因此,不能简单地认为“一个汉字就是一个词元”。
分词器会把这些词元转换成编号。为了方便理解,假设下面三个词恰好各对应一个词元:
猫 → 102
狗 → 205
汽车 → 308
这些编号是编造的示例,只是身份标识。
205 比 102 大,不意味着“狗”比“猫”更高级。“猫”和“汽车”的编号差多少,也不能表示它们的意思差多少。
就像学生的学号,能够区分谁是谁,却不能拿学号的差值判断两个人有多相似。
要让数字承载更多信息,还需要下一步:向量化。
向量,可以先理解成一张数字清单。
比如,我们把刚才的编号映射成下面这样的数字:
猫 → [0.8, 0.6]
狗 → [0.7, 0.7]
汽车 → [-0.6, 0.8]
这仍然是为了讲解而编造的示例。真实模型的向量通常有更多维度。
先只看两个维度:第一个数字作为横坐标,第二个数字作为纵坐标,就能把“猫”“狗”“汽车”画成平面上的三个点。
从原点指向这些点,还可以画出三支箭头。
这样,一组抽象的数字就有了直观的样子:它既可以表示一个位置,也可以表示一个方向。
把词元编号映射成向量的过程,通常叫作嵌入,也就是 Embedding。在常见模型中,最初这一步可以理解成查表:根据编号,取出对应的一行数字。
接下来的问题是:这行数字是谁填进去的?
向量里的数字,是在训练中逐渐学出来的。
早期词向量方法有一个朴素的出发点:出现在相似上下文中的词,往往具有某些相似的含义。
比如,“猫”和“狗”都可能出现在关于宠物、食物、饲养的句子里。模型通过训练,可以让这些语言关系反映在向量之间的关系中。
但不要把每个维度想象成一个人工设置的标签:
第一维:是不是动物
第二维:可不可爱
第三维:能不能驾驶
这可以帮助入门,却不是实际模型通常采用的分工方式。信息往往分散在许多维度里,需要组合起来才有意义。
更准确地说,模型学到的是一套适合完成训练任务的数字表示。它是否适合直接比较语义,还要看训练目标和取出向量的方式。
有了向量,就可以比较“方向像不像”。
回到刚才的例子:
猫:[0.8, 0.6]
狗:[0.7, 0.7]
把它们画成箭头,会发现两支箭头朝向很接近。“汽车”的箭头则朝着另一边。
猫与狗的箭头方向较接近,汽车的箭头方向相差较大 · 点击放大
这是一张二维概念插图,只表示方向关系,不按上面的数值精确作图,也不是模型实测结果;真实向量空间通常无法直接画成这样的平面。
数学上,一种常见的比较方法叫作“余弦相似度”,它衡量的是两支箭头之间的夹角。
余弦相似度 = 两个向量的点积 ÷ 两个向量长度的乘积
暂时不用记住公式。可以先记住它的几何含义:
夹角接近 0°,得分接近 1,方向相近。
夹角接近 90°,得分接近 0。
夹角接近 180°,得分接近 −1,方向相反。
这个计算把向量长度的影响除掉,重点比较方向。在适合语义比较的向量空间里,它就可以用来衡量文本的相关程度。
比如,你搜索:
手机掉进水里怎么办?
系统可能找到一篇标题为“电子设备进水后的处理方法”的文章。
两句话用词不同,但经过适合检索的嵌入模型处理后,向量表示可能足够接近。系统因此可以找到相关资料,而不只依赖关键词是否完全一致。
这里有两个容易误解的地方。
第一,相似度得分不是“意思相同的概率”。0.8 分不能直接解释成“有 80% 的概率意思一样”。
第二,反义词不一定指向相反方向。“喜欢”和“讨厌”都与情感态度有关,也经常出现在相似句式中,它们的向量可能有不少相似之处。
方向接近能告诉我们什么,需要结合模型的训练方式来判断。
要处理一句话,还得看上下文。
看这两句话:
我买了一个苹果。
苹果发布了新手机。
同样是“苹果”,在第一句话里是水果,在第二句话里是公司。
水果购物和手机发布会代表两种不同语境 · 点击放大
插图用两个场景表示不同语境,没有描绘模型内部的实际结构。
输入向量只是起点。模型还会结合可以参考的上下文,逐层更新表示。Transformer 中的注意力机制参与这个过程:为不同位置的信息分配权重,再汇集起来。
这里先记住一个边界:在本文介绍的常见自回归模型中,每个位置只能参考自身和前面的位置。因此,“苹果发布了新手机”里,不能说“苹果”所在的位置提前看到了后面的“新手机”;模型处理到句末、准备继续生成时,才已经有了整句话的线索。
注意力怎样汇集这些线索,我们留到下一篇展开。它也不是直接拿前面的余弦相似度公式来搜索答案。
这些数字,最后怎样变回一句回答?
以常见的自回归语言模型为例,它会根据已有文本,计算下一个词元的概率分布。
例如,看到:
今天下雨了,出门记得带
模型会给词表中的候选词元打分,再把分数转换成概率。与“伞”对应的后续词元,可能获得较高概率。
系统按照设定的生成策略选出一个词元,把它接到已有文本后面,然后继续预测下一个。它不一定每次都选择概率最高的那个,也可以按设定进行采样。
这个过程反复进行,直到满足停止条件。最后,词元序列会被还原成我们看到的文字。
所以,一段完整回答通常是逐步生成的。
这也解释了向量搜索与文字生成的区别:前者通常在已有资料中寻找相关内容,后者根据上下文逐步产生新的词元。两者可以配合使用,但生成回答的过程远不止“找到方向最接近的一句话”。
模型为什么知道,哪些文字更可能接在后面?
因为在训练时,它反复做过类似的预测练习:根据前面的文本预测后续词元,用真实文本计算误差,再调整模型参数。前面说的嵌入向量,也是在这样的学习过程中逐渐形成的。聊天模型通常还会经历后续训练,让回答更符合指令和对话需要。
这里说的是训练,并不意味着每次聊天都会即时更新模型参数。训练的具体过程,留到第 04 篇再讲。
“预测下一个词元”说明了回答怎样逐步输出,但还没有完整解释模型为什么能做推理题。模型怎样组合条件、利用中间步骤,以及为什么仍会推错,是第 03 篇要回答的问题。
先记住:能生成流畅的文字,不自动保证内容真实。 人名、日期、因果关系,都可能写错。
现在再回到开头的那句话:
我今天很开心。
它会先被拆成词元、转换成编号,再映射成向量。模型结合整句话以及前面的对话,更新这些向量表示,然后逐步生成回应。
我们看到的是一句“今天有什么好事?”,背后则是一连串数字计算。
向量让文字关系能够进入计算,方向比较让某些相关性能够被衡量,上下文处理让同一个词在不同句子里获得不同表示。接着,模型把这些信息用于预测下一个词元,一步步写出回答。
下一步:上下文怎样参与计算?
这篇走完了从文字到回答的流程,其中还有一步值得拆开看:文字变成向量之后,模型究竟怎样把不同位置的信息联系起来?
下一篇继续用“苹果”的例子,看看注意力怎样找到并汇集上下文里的线索。
配图说明:封面与正文插图由 AI 生成,用于帮助理解概念,不是模型内部结构或实测数据。对话、词元编号与二维向量均为假设示例,实际分词和表示依模型而异。