向量改变世界—语言如何进入AI数学空间(向量嵌入介绍)
0向量在llm中的作用上一篇文章向大家介绍了llm的运作方式以及它是如何从0产生的。这一节我们来详细了解在这个过程中很重要的一个环节也是在后续深入了解更多技术的基础那就是向量嵌入embedding。在上一篇文章结尾处我们曾经这样总结 LLM 的生成过程文本会先被分词器切成 token再转换成 token id模型通过神经网络训练从海量文本中学习语言规律、知识关系和表达模式训练完成后的参数被保存下来形成参数文件推理时模型加载这些参数根据当前上下文一步一步预测下一个 token最终生成我们看到的自然语言回答。但在这个过程中其实还有一个非常关键的问题文本被转换成 token id 之后这些数字是如何带着语义进入神经网络的要知道token id 本身只是编号。比如“我”“苹果”“开心”这些词被分词器转换成 token id 之后可能会变成一串数字。但这些数字本身并不天然代表文字的含义。一个 token id 是 100另一个 token id 是 200并不意味着后者的语义就是前者的两倍。它们只是词表中的编号更像是字典里的页码而不是词语本身的含义。所以模型不能直接把 token id 当成语义来理解。这时候就需要 Embedding Layer嵌入层。简单来说分词器负责把文字变成编号Embedding 层负责把编号变成向量。更完整地说文本会先被分词器切成 token再转换成 token id。但 token id 本身只是编号不能直接表达语义。进入神经网络之前模型会先经过一个叫做 Embedding Layer嵌入层 的结构把每个 token id 转换成对应的高维向量。这个过程通常叫做 Token Embedding词元嵌入。可以粗略理解为文本 → token → token id → embedding 向量 → 神经网络计算这些 embedding 向量才是真正进入神经网络参与计算的内容。更重要的是embedding 向量不是人工提前写好的也不是某种固定的词典解释。它本身也是模型参数的一部分会在训练过程中不断被调整。刚开始训练时这些向量可能还没有什么有意义的语义关系。但随着模型在海量文本上不断学习它会逐渐调整这些向量让经常出现在相似语境中、含义或用法相近的 token在向量空间里形成更接近的关系。也就是说embedding 的作用并不是简单地“把数字变成另一串数字”而是让原本没有语义的 token id变成神经网络可以计算、比较和关联的向量表示。ok那我们了解了这一步中llm是通过向量嵌入embedding的方式将token id这些数字变成了文字语义接下来便是最重要的问题了我们如何通过向量的方式将这些“文字的编号”词元化后的token id变成计算机能识别的语义呢1什么是向量我们在学习数学基础知识的时候了解到所谓向量最关键也是最能体现特征的两个要素就是方向与大小用教材上的话来说就是向量又称矢量是指既有大小又有方向的量。与它相对的只有大小没有方向的量称为数量标量在二维坐标系中它长这样子二维中的向量加法向量是有方向的在坐标系中的箭头指向就是它的方向向量是有长度的这个长度叫做模长。向量是可以进行数学的运算的。而向量嵌入就是通过数学上的一些运算来完成的。2如何构建一个有猫有狗的向量房间通过数学运算来实现向量嵌入这里我们会引入一个概念那就是“相似”比如“猫”和“狗”这两个词通过词元化的方式形成了两个token id再把他们转换成为了猫向量和狗向量现在让计算机去理解猫与狗的方式就是把猫向量和狗向量放在相近相似的位置。这里可能比较抽象我们可以借助一些类比想象想象现在我们有一个三维空间的房间这个房间我将它叫做向量房间。我们有一个3d打印机我们可以把一些想要的东西打印成模型。在这个房间中我们把不同的概念做了编号比如“猫”、“狗”等词的语义转换成了token id把token id转换成向量的过程就是用3d打印机把这些东西给打印出来然后丢到这个房间中去这就是向量嵌入的第一步。可以想象成这个房间中的猫玩偶和狗玩偶只是被3d打印机打印出来用来指代“猫”和“狗”的概念的模型玩偶同样的“桌子”、“床”、“椅子”我们也把它们通过向量嵌入的方式放入这个房间。现在我们在向量房间中有了很多东西有桌子、椅子、猫、狗、床这些东西但是注意我们刚刚只是把这些东西丢进了这个房间而不管他们具体在什么位置。也就是说现在在这个向量房间中我们有了很多的物件但他们是杂乱的床上摆着椅子椅子上放了一只猫。这种摆放方式显然是不合理的我们现在要做的便是将猫和狗尽量放到一起桌子和椅子尽量放到一起锅碗瓢盆则尽量离猫远一点。计算机不会理解猫和狗的关系我们要做的便是通过向量的距离和相似度来补足这一信息。如何告诉计算机去把猫向量和狗向量放到一起呢现在猫向量是[2, 3, 1]狗向量是[6, 7, 5]。我们要做的就是把这两个向量通过运算变得更相近更相似。在数学运算中表示向量的距离和相似度的方式有如下几种常见的表示1欧几里得距离两点或两向量之间最短距离2曼哈顿距离两点之间沿轴距离3点积表现一个向量在另一个向量上投影的大小4余弦距离表示两个向量之间的夹角余弦也就是两个向量之间的夹角比较在这些方法里最容易理解的是欧几里得距离。它可以理解为两个点之间的直线距离。比如现在猫向量 [2, 3, 1]狗向量 [6, 7, 5]那么猫和狗之间的距离可以粗略理解为猫和狗在第一个维度上差了 4 在第二个维度上差了 4 在第三个维度上差了 4所以它们在这个向量房间里离得比较远。如果训练之后猫向量和狗向量变成猫向量 [3, 4, 2]狗向量 [4, 5, 3]这时它们在每个维度上的差距都变小了距离也就变近了。这就可以粗略理解为猫和狗在向量空间中的位置更接近了。但是仅仅看“距离”还不够。因为在高维空间中我们很多时候更关心的不是两个向量离得有多近而是它们的方向是否接近。这就要引入另一个常见概念余弦相似度。余弦相似度看的是两个向量之间的夹角。如果两个向量方向很接近就说明它们在语义空间里可能更相似如果两个向量方向差得很远就说明它们的语义关系可能更弱。可以这样理解欧几里得距离更像是在问两个东西离得远不远 余弦相似度更像是在问两个东西是不是朝着相似的方向在文本向量和语义检索中余弦相似度非常常见。比如“猫”和“狗”它们都可能和“动物”“宠物”“饲养”“毛发”等语境相关所以它们的向量方向可能会更接近。而“猫”和“锅碗瓢盆”它们出现在相似语境中的概率更低所以它们的向量方向可能就没那么接近。也就是说我们通过对两个向量之间的距离和夹角的比较来表示向量之间的相似度也就是猫向量和狗向量之间距离近夹角小则猫跟狗更相似。但这里不是我们手动告诉计算机猫和狗应该靠近 桌子和椅子应该靠近 猫和锅碗瓢盆应该远离真正发生的是模型在训练过程中不断预测、不断犯错、不断调整参数。如果某些 token 经常出现在相似的上下文里模型为了更好地完成预测任务就会逐渐调整它们的向量表示让它们在向量空间中形成更合理的关系。也就是说相似的词并不是一开始就被放在一起而是在训练过程中被慢慢“挪”到了一起。我们可以继续用“向量房间”的比喻来理解。一开始这个房间里的东西是乱摆的猫可能离锅很近 狗可能离桌子很近 椅子可能离床很远但随着训练不断进行模型会根据预测结果调整这些物件的位置。慢慢地房间会变得更有秩序猫、狗、宠物、动物可能靠得更近 桌子、椅子、床、家具可能靠得更近 锅、碗、勺子、厨房可能靠得更近这就是向量嵌入最核心的意义它让语言中的“相似”和“关系”变成了数学空间中可以计算的距离、方向和相似度。当然这种相似不是绝对准确的也不是人类意义上的真正理解。它只是模型从大量文本中学到的一种数学关系的近似分布。但正是因为有了这种数学关系计算机才能不再只靠关键词匹配而是开始用“语义接近”的方式处理文本。3、向量房间是怎么从混乱变得有秩序的那么问题来了这个向量房间里的东西最开始是乱摆的那它后来是怎么被整理好的做整理的具体步骤是什么也就是说模型是怎么一步步知道猫应该离狗近一点 桌子应该离椅子近一点 锅碗瓢盆应该更接近厨房 开心、高兴、愉快应该更接近情绪表达。这里就要回到上一篇文章提到的神经网络训练。模型训练时并不是人类站在这个向量房间里手动把猫搬到狗旁边把椅子搬到桌子旁边。真正发生的是模型不断预测下一个 token不断犯错然后根据错误调整参数。这个过程会间接改变向量房间里的摆放方式。比如我们给模型一句话我家养了一只可爱的训练集中真实的下一个词可能是猫但是模型刚开始可能预测成椅子也就是说在它现在的向量房间里“可爱的”“养了一只”“家里”这些语境可能还没有很好地指向“猫”或者“狗”这些概念。它的房间摆放是乱的。猫可能离相关语境太远椅子反而离得太近于是模型就预测错了。现在需要通过以下步骤来把他们逐渐摆放整齐1计算损失loss函数这时候训练系统会计算一个东西叫做损失也就是 loss。loss 可以先粗略理解为模型这次错得有多离谱。如果真实答案是“猫”但模型给“猫”的概率很低给“椅子”的概率很高那 loss 就会比较大。loss 越大说明这个向量房间现在的摆放方式越不合理。2反向传播接下来训练系统会通过一种叫做反向传播的方法告诉模型你刚刚错在哪里了哪些参数应该调整一下。这里我们不用深入理解反向传播的数学细节可以继续用房间来理解。反向传播就像是房间里出现了一个整理提示猫离“宠物”“可爱”“养了一只”这些区域太远了应该往那边挪一点 椅子不应该离“养了一只”这么近应该稍微挪远一点 狗和猫经常在类似语境中出现也可以适当靠近。3参数更新然后模型会进行一次很小的参数更新。注意这个更新通常不是一下子把猫从房间最左边搬到狗旁边。它更像是每次只轻轻挪动一点点。猫往宠物区域靠近一点。椅子从宠物区域离开一点。狗和猫之间的距离稍微缩短一点。锅碗瓢盆往厨房区域靠近一点。这样一次训练改变可能非常小。但模型不是只训练一次而是在海量文本上训练无数次。每一次预测每一次犯错每一次修正都会让这个向量房间被整理一点点。久而久之房间就开始有秩序了。原来乱七八糟的摆放方式会慢慢变成动物相关的概念聚到一起 家具相关的概念聚到一起 厨房相关的概念聚到一起 情绪相关的概念聚到一起 城市、国家、人物、动作、时间等概念也会逐渐形成自己的区域。所以向量嵌入不是一开始就天然正确的。它不是一本人工编好的词典也不是人类提前告诉模型每个词是什么意思。它更像是一个原本混乱的房间在训练过程中被无数次轻微整理。每一次整理都是为了让模型下次预测得更准一点。最后这些词在向量空间中的位置就逐渐形成了某种语义秩序。这就是为什么我们说Embedding 是训练出来的不是手写出来的。它不是人类把“猫 宠物”“狗 宠物”“桌子 家具”这些规则一条条写进去。而是模型在大量文本中不断看到猫经常和宠物、动物、可爱、饲养、毛发这些词一起出现 狗也经常和宠物、动物、可爱、饲养这些词一起出现 桌子经常和椅子、家具、房间、办公这些词一起出现。于是训练过程会慢慢调整它们的向量位置。最终模型就会在向量房间里形成一种数学上的“语义地图”。在这张地图里距离和方向不再是普通的空间关系而是语言关系的数学表达。这也是向量嵌入最重要的地方它让文字从人类语言进入了机器可以计算的数学空间。3真实的向量空间前面我们一直用“向量房间”来类比向量嵌入。在这个类比中我们想象有一个三维房间里面可以放猫、狗、桌子、椅子这些物件。每个物件都有一个位置比如猫[2, 3, 1] 狗[3, 4, 2] 桌子[-5, 1, 4]这种三维房间很好理解因为我们人类生活在三维空间里很容易想象一个东西在房间中的位置。但是在真实的 LLM 中向量空间通常不是三维的。它可能是几百维、几千维几万维。也就是说真实的向量房间不是一个普通房间而是一个人类很难直观看见的高维空间。为什么需要这么多维度因为语言本身太复杂了。比如“猫”这个词它不仅仅代表一个动物。它可能同时包含很多关系动物 宠物 可爱 毛发 会叫 会动 家养 生物 网络表情包 某种性格联想如果我们只用三维空间来表示它表达能力就很有限。但如果我们用一个几百维、几千维的向量来表示它就可以让模型在更多抽象维度上记录它和其他词之间的关系。可以粗略想象成这个向量房间里不只有长、宽、高三个方向而是有很多很多看不见的方向。有些方向可能和“动物性”有关。有些方向可能和“家具性”有关。有些方向可能和“情绪色彩”有关。有些方向可能和“动作关系”有关。有些方向可能和“时间、地点、人物、语气、语法用法”有关。当然这里要注意这些维度不是人类提前命名好的。并不是说第 1 维一定代表“动物”第 2 维一定代表“家具”第 3 维一定代表“情绪”。真实情况要复杂得多。这些维度是模型在训练过程中自己学出来的。它们更像是一组人类不容易直接命名的抽象特征。所以一个 embedding 向量可以理解为模型用一串数字在高维空间中给某个 token 安排了一个位置。比如猫 [0.12, -0.45, 0.78, 0.03, ...] 狗 [0.10, -0.41, 0.75, 0.08, ...] 桌子 [-0.62, 0.33, -0.18, 0.91, ...]这里的每一个数字都是这个 token 在某个维度上的坐标。当这些坐标组合在一起就形成了这个 token 在高维向量房间里的位置。也就是说三维房间只是帮助我们理解的类比真实的 embedding 更像是一个拥有大量隐藏方向的高维房间。在这个高维房间里“猫”和“狗”可以在很多维度上接近比如它们都和动物、宠物、饲养、毛发这些语境有关。而“猫”和“桌子”可能只在某些生活场景上有一点关系但在更多语义维度上并不接近。总结下来真实的向量空间通常是超高纬度的而不是仅仅三维。 但是其原理都是一致的包括向量房间的构建过程向量之间的距离和夹角计算来表示向量语义这些无论是几万维的向量空间其本质原理都是一样的。4如何窥视真实的向量房间特征向量和PCA主成分分析前面我们讲到真实的向量房间不是一个三维房间而是一个高维空间。比如一个 embedding 向量可能不是猫向量 [2, 3, 1]而是猫向量 [0.12, -0.45, 0.78, 0.03, 0.91, ...]这里后面可能有几百个、几千个甚至上万个数字。假设现在我们有一个 2 万维的向量空间。每一个词、每一句话、每一段文本都被放在这个 2 万维的向量房间里。问题来了2 万维的房间人类根本看不见也很难直接观测。而且维度越高计算通常越慢存储成本也越高这不利于我们对向量做很多的复杂运算。那我们能不能把这个 2 万维的向量房间压缩一下比如把它压缩成二维这样我们就能把它画在一张平面图上而且计算起来会省去很多资源。这时候就要引入一个方法PCA 主成分分析Principal Component Analysis。它的作用可以先粗略理解为从高维向量空间里找到最重要的几个方向然后把所有向量投影到这些方向上从而实现降维。继续用向量房间的比喻来说。假设现在这个房间非常复杂有 2 万个方向。这些方向里有些方向非常重要。比如沿着某个方向看过去动物、家具、情绪、地点这些概念区分得很明显。但有些方向可能没那么重要。沿着那些方向看过去所有东西差别不大或者只是一些很细碎、很重复、甚至接近噪声的信息。PCA 要做的事情就是从这个复杂房间里找到最重要的方向。这些方向在数学里可以叫做特征向量。这里注意一下这里说的特征向量主要是 PCA / 线性代数里的特征向量不是我们前面泛泛说的“某个词的 embedding 特征表示”。在 PCA 里特征向量可以理解为高维空间中一个重要的方向。而每一个特征向量都会对应一个特征值。特征值可以先粗略理解为这个方向到底有多重要。特征值越大说明数据沿着这个特征向量方向上的变化越大也就是方差越大。方差越大通常说明这个方向上包含的信息越多。特征值越小说明数据沿着这个方向变化很小包含的信息可能比较少往往更可能是冗余信息或者接近噪声的信息。所以我们可以这样理解特征向量 一个重要方向 特征值 这个方向的重要程度继续用向量房间来说。假设我们有一个非常复杂的 2 万维房间。PCA 会先计算这些向量之间的关系也就是计算一个协方差矩阵。协方差矩阵可以先理解为用来描述这些维度之间如何一起变化的一张关系表。然后PCA 会在这个协方差矩阵里找到一组特征向量和特征值。其中特征值最大的特征向量就是数据变化最明显、信息量最大的方向。如果我们想把 2 万维压缩成 2 维那么就可以选择特征值最大的两个特征向量。也就是说原来每个向量有 2 万个维度 现在找到最重要的 2 个方向 然后把所有向量投影到这 2 个方向上 最后每个向量就变成了 2 维坐标这就实现了从 2 万维降维到 2 维。比如原来一个文本向量可能是文本向量 [0.12, -0.45, 0.78, 0.03, ... 2万个数字]经过 PCA 后它可能变成文本向量 [1.35, -0.72]这两个数字就表示它投影到两个最重要方向之后的位置。这样我们就可以把它画在二维平面上。如果很多文本都经过这样的处理我们就可能看到动物相关的文本聚在一起 家具相关的文本聚在一起 科技相关的文本聚在一起 情绪相关的文本聚在一起。当然这个二维图不是原始高维空间的完整真相。因为 PCA 本质上是一种压缩压缩就一定会丢失信息就像你把一个真实的三维房间拍成一张二维照片这张照片可以保留房间的大致结构但它不可能保留房间里的所有细节PCA 也是一样。它会尽量保留最大方差也就是尽量保留变化最大、信息最多的方向。所以通常会保留大特征值对应的成分丢弃小特征值对应的成分。原因很简单特征值越大对应的特征向量方向上的方差越大包含的信息越多。 特征值越小对应的特征向量方向上的方差越小往往代表噪声或冗余。也就是说PCA 是在删掉一些维度的基础上尽量保留那些最能体现数据差异的方向。再回到我们的向量房间。原来的 2 万维向量房间太复杂了人类看不见。PCA 就像是在这个高维房间里找到几个最重要的观察方向。然后把整个房间里的东西都投影到这几个方向上。如果只保留两个最重要的方向我们就得到了一张二维地图。这张地图虽然不完整但它能帮助我们看到这个向量房间的大致结构。总结下来就是Embedding 是把文本放进高维向量房间 PCA 是从这个高维房间里找出最重要的几个方向 特征向量表示这些重要方向 特征值表示这些方向的重要程度 降维就是把原来的高维向量投影到少数几个重要方向上。因此PCA 主成分分析的核心逻辑就是保留信息最多的方向丢掉信息较少、冗余或噪声较多的方向从而实现向量压缩。5向量数据库讲完向量嵌入和 PCA 后我们再往前走一步。既然文本可以被转换成向量那如果我们有很多很多文本呢比如一本书 一堆 PDF 一个公司的内部文档 一个知识库 一个产品说明书 一万个网页 一百万条问答记录这些内容都可以先被切分成一小段一小段文本然后分别转换成 embedding 向量。于是原本的人类语言文本就变成了大量向量。这些向量都被放进了我们前面说的那个“向量房间”里。问题来了这些向量放在哪里 用户提问时怎么从里面快速找到最相关的内容我们在计算机工程化中又如何来使用这些向量存储信息这时候就需要向量数据库Vector Database。它可以先粗略理解为一个专门存储和检索向量的数据库。继续用“向量房间”的比喻来说。普通数据库更像是一个表格仓库。它擅长根据明确的字段查东西比如姓名 张三 年龄 30 城市 广州 订单号 123456这种查询方式很精确。但是向量数据库不一样。向量数据库更像是管理一个巨大的向量房间。这个房间里放着很多文本对应的向量每个向量都代表一段文本的语义位置。当用户提出一个问题时我们也会把用户的问题转换成一个向量。然后向量数据库要做的事情就是在这个巨大的向量房间里找到离用户问题向量最近的那些文本向量。比如用户问怎么让 AI 记住我的资料这个问题会被转换成一个问题向量。然后向量数据库会在房间里寻找和它最接近的内容。它可能找到RAG 知识库搭建方法长期记忆系统设计用户资料向量化存储 基于 embedding 的语义检索这些内容不一定和用户问题使用了完全一样的关键词但它们在语义上接近。这就是向量数据库和普通关键词搜索最大的区别。普通搜索更关心文字字符串等有没有匹配上。向量搜索更关心文字意思上是不是接近。所以我们可以这样理解传统数据库是在表格里按字段找东西 向量数据库是在向量房间里按距离找东西。向量数据库通常会存几类东西1、文本原文 2、文本对应的向量 3、文本的来源信息 4、标题、时间、作者、分类等元数据比如一段文档可能会被存成这样文本内容向量数据库。向量[0.12, -0.45, 0.78, ...]来源AI入门文章第7节分类Embedding时间2026-06这样当用户的问题向量被送进数据库后数据库就可以快速找到最相似的几个向量并把这些向量背后的原文取出来。这个过程通常叫做向量检索或者相似度搜索。在实际应用中我们经常会看到一个词Top-K。Top-K 的意思就是找到最相似的前 K 个结果。比如 Top-3就是找最相似的 3 段文本。Top-5就是找最相似的 5 段文本。继续用房间来理解用户的问题向量就像是被丢进向量房间里的一个新物件。向量数据库会看谁离它最近 谁方向最接近 谁最像它然后把最近的几个物件找出来。这就是 Top-K 检索。向量数据库的意义就在这里它让系统可以从大量文本中快速找到和用户问题语义最接近的内容。这也是 RAG 检索增强生成Retrieval-Augmented Generation 的基础。我们后面文章会详细介绍。我们先了解一下大致过程用户提问-把问题转换成向量-去向量数据库里找相似文档-把找到的文档片段交给大模型-大模型基于这些资料生成回答也就是说RAG 不是让模型凭空回答而是先去资料库里找相关内容再让模型结合这些内容回答。所以向量数据库在这里就像是 AI 的资料检索系统。它不负责生成最终回答但它负责帮模型找到相关资料。如果没有向量数据库大模型只能依赖自己参数中已经学到的内容。但有了向量数据库我们就可以把外部资料、公司文档、个人知识库、项目资料接进来让模型回答时有更多上下文依据。这也是为什么向量数据库在 AI 应用里非常重要。它连接了两个世界一边是人类的文档、知识库和资料 另一边是大模型的生成能力。向量数据库把文档变成向量放进向量房间。用户提问时它再根据问题向量在房间里找到最接近的内容。最后这些内容被送给大模型成为模型回答问题时的参考资料。所以总结下来Embedding 负责把文本变成向量 向量数据库负责存储这些向量并快速找到相似向量 RAG 则把检索出来的内容交给大模型让模型基于资料生成回答。向量数据库更像是给模型外挂了一个可以快速查询的资料房间模型本身负责生成语言向量数据库负责帮它找资料。这就是向量数据库最核心的作用。写在后面到这里我们可以简单总结一下。这篇文章其实只讲了一件事如何把人类语言放进一个计算机可以处理的数学空间里。文本先被分词器切成 token再变成 token id。但 token id 只是编号本身没有语义。所以模型需要通过 embedding把这些编号变成向量。向量的意义在于它可以被计算。我们可以计算两个向量之间的距离、方向和相似度。于是“猫”和“狗”这种在人类语言中相近的概念就可以在向量房间里被放到更接近的位置。当然这个房间一开始不是整齐的。它是在模型训练过程中通过不断预测、犯错、计算 loss、反向传播、更新参数一点点被整理出来的。真实的向量房间也不是三维房间而是几百维、几千维甚至更高维的空间。PCA 这类方法则像是给这个高维房间拍一张低维照片让我们能大概看见里面的结构。再往后如果我们把大量文档、网页、知识库都转换成向量就需要一个地方来存它们、查它们这就是向量数据库。用户提问时系统也会把问题变成向量然后去向量数据库里找到最相似的文本片段再交给大模型生成回答。这也是 RAG 的基础。总的来说就是Embedding 负责把文字变成向量 向量空间负责表达语义关系 PCA 帮我们观察和压缩这个空间 向量数据库负责存储和检索这些向量 RAG 则把检索出来的资料交给大模型让模型基于资料回答问题。理解了这些便能够把之前的llm构建和后续多种应用相串联起来了。今日身体不适先写到此处吧。