ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从箭头到语义坐标:一文讲透向量概念与AI应用

从箭头到语义坐标:一文讲透向量概念与AI应用

向量这个词,很多人第一次听到是在数学课上,第二次听到是在机器学习或者大模型的话题里,然后就开始犯迷糊——同一个词,怎么一会儿是箭头,一会儿是数组,一会儿又变成了“语义空间里的坐标”?我见过不少朋友,写代码调库没问题,但一被问到“向量到底是个啥”,就卡壳了。这篇东西不打算复述教材,而是想用大白话把向量这个概念从数学里的“箭头”一路讲到AI里的“语义坐标”,把中间那些容易断片的地方接上。不管你是刚接触编程的学生,还是做业务想搞懂推荐系统、检索系统的朋友,看完应该能对向量建立一个连贯的直觉,而不是背一堆定义。

1. 先把向量从数学课本里拽出来

1.1 向量最朴素的样子:一支有方向的箭头

数学课本里对向量的定义通常是“既有大小又有方向的量”。这句话本身没错,但它太抽象了,抽象到很多人背下来了却不知道在说什么。我更喜欢换一个说法:向量就是一支箭头,它告诉你“往哪个方向走、走多远”。

想象你站在一个空旷的广场上,我告诉你“往前走三步”。这句话里其实藏着一个向量:方向是“前”,大小是“三步”。如果我再补一句“然后往右走四步”,这就是第二个向量。两个向量接在一起,你最终到达的位置,就是这两个向量相加的结果。这就是向量加法最直观的画面——首尾相接,从起点指向终点。

这个画面很重要,因为后面讲的所有东西,本质上都是这支箭头的变形。你在纸上画一支箭头,箭头有长度,有指向,这就是二维向量。你把它放进坐标系里,起点放在原点,箭头尖落在哪个点,那个点的坐标就是这支箭头的“数字身份”。比如箭头尖落在(3, 4),那这个向量就可以写成(3, 4)。注意,这里(3, 4)不是一个点,而是一个“从原点出发、指向(3, 4)这个位置的位移”。点和向量的区别,是很多人第一个容易混淆的地方。

1.2 坐标表示:向量为什么能写成一串数字

刚才说箭头尖落在(3, 4),向量就写成(3, 4),这一步其实做了一个很重要的转换:把几何图形翻译成了数字。这个转换是整个向量概念能进入计算机的钥匙。

为什么可以这样翻译?因为在一个固定的坐标系里,每一支从原点出发的箭头,都唯一对应一个终点位置,而终点位置又唯一对应一组坐标。反过来,给定一组坐标,你也能唯一画出一支箭头。这种一一对应关系,让“箭头”和“数字串”成了同一个东西的两种说法。数学家管这叫“同构”,我们不用记这个词,只要记住:谈向量的时候,几何直觉和数字表示可以随时切换,哪个方便用哪个。

这里有个细节值得说清楚。二维向量是两个数,三维向量是三个数,那四维、五维呢?几何上你画不出来了,但数字表示完全不受影响——四个数就是四维向量,一百个数就是一百维向量。这就是向量这个概念最厉害的地方:它从看得见的箭头出发,却能一路扩展到看不见的高维空间。计算机处理向量,从来不是去画箭头,而是直接处理这一串数字。所以你在代码里看到的向量,永远是一个数组,比如[3, 4]或者[0.2, -1.5, 7.8]。

1.3 维度的含义:每个位置代表一个“测量角度”

既然高维向量就是一串数字,那这串数字里每一位到底代表什么?这是理解向量的关键一步,也是很多人从数学过渡到应用时最容易断片的地方。

我的理解是:向量的每一维,代表对同一个对象的一个“测量角度”。举个生活化的例子。假设你要描述一个人的体型,你量了身高、体重、肩宽三个数,写成(175, 70, 45)。这三个数合在一起,就是这个人在这三个测量角度下的“向量表示”。第一维是身高方向上的数值,第二维是体重方向上的数值,第三维是肩宽方向上的数值。单独看某一维没意义,合起来才能刻画这个人的体型特征。

这个视角一建立,向量就从数学概念变成了描述工具。描述一首歌,你可以用节奏、响度、音高变化等维度组成一个向量;描述一篇文章,你可以用词频、句子长度、标点密度等维度组成一个向量。维度不是天生的,是你根据想刻画什么而选出来的。选哪些维度、每个维度怎么量化,这本身就是一门手艺,后面讲词向量的时候还会回到这一点。

2. 向量的运算到底在算什么

2.1 加法与数乘:两种最基础的操作

向量的运算不多,最基础的就两个:加法和数乘。但这两个操作的含义,比公式本身有意思得多。

先说加法。两个向量相加,就是对应位置上的数字分别相加。比如(1, 2)加(3, 4)等于(4, 6)。几何上,这就是把两支箭头首尾接起来。这个操作在应用里对应的是“叠加”。你有一个表示用户偏好的向量,还有一个表示商品特征的向量,两者相加,可以理解成把两种信息合并到一起。当然,实际应用里直接相加不一定合理,但“向量加法等于信息叠加”这个直觉是对的。

再说数乘。一个数乘以一个向量,就是把这个向量的每个数字都乘以这个数。比如2乘以(1, 2)等于(2, 4)。几何上,这是把箭头拉长到原来的两倍,方向不变。如果乘的是负数,箭头就反向。数乘对应的是“缩放”或者“加权”。你有一个表示重要程度的向量,乘以一个权重系数,就是在调整它的影响力大小。这两个操作看起来简单,但它们是后面所有复杂运算的积木。

2.2 点积:衡量两个向量“合不合拍”

如果只能保留一个向量运算,我会选点积。点积是两个向量对应位置相乘再求和,比如(1, 2)和(3, 4)的点积是1×3 + 2×4 = 11。这个数字看起来平平无奇,但它藏着一个非常重要的几何含义:它衡量两个向量的方向有多一致。

具体来说,两个向量的点积,等于它们长度的乘积再乘以它们夹角的余弦。夹角越小,余弦越接近1,点积越大;夹角越大,余弦越接近0甚至负数,点积越小甚至为负。所以点积大,说明两个向量“合拍”;点积接近零,说明两个向量“正交”,也就是方向垂直、互不相关;点积为负,说明方向相反。

这个性质在应用里极其重要。推荐系统判断用户和商品是否匹配,检索系统判断查询和文档是否相关,本质上都是在算两个向量的点积或者余弦相似度。余弦相似度就是把点积再除以两个向量的长度,把长度因素去掉,只看方向。为什么很多系统用余弦相似度而不是直接用点积?因为长度有时候是干扰项——一篇长文档的词频向量天然比短文档的数值大,直接算点积会偏向长文档,除以长度之后就公平了。

2.3 用一个小例子把点积算透

光说公式容易飘,我们拿一个具体的小例子走一遍。假设有两个二维向量,A是(3, 4),B是(6, 8)。先算点积:3×6 + 4×8 = 18 + 32 = 50。再算长度:A的长度是根号下(9+16)等于5,B的长度是根号下(36+64)等于10。那么余弦相似度就是50除以(5×10),等于1。余弦为1,说明两个向量方向完全一致——确实,B正好是A的两倍,方向当然一样。

再换一个例子。A是(1, 0),B是(0, 1)。点积是0,余弦是0,说明两者正交、完全不相关。这个例子很直观:一个指向右,一个指向上,方向垂直,确实没有共同成分。

最后看一个负相关的例子。A是(1, 0),B是(-1, 0)。点积是-1,余弦是-1,说明方向完全相反。在语义场景里,这可以理解成两个意思相反的描述。

这三个例子走完,你应该能感觉到:点积和余弦相似度不是抽象公式,而是一把尺子,专门量“两个东西的方向有多接近”。这把尺子后面会反复出现。

3. 从几何向量到数据向量:一次关键的思维跳跃

3.1 向量不再描述空间位置,而是描述“特征”

前面讲的向量,不管是二维还是三维,都还能画出来,指向的是空间里的某个位置或方向。但真正让向量在工程里大放异彩的,是人们做了一次思维跳跃:不再用向量描述空间位置,而是用向量描述一个对象的特征。

这个跳跃听起来抽象,其实很自然。前面说描述体型用(身高, 体重, 肩宽),这就是用向量描述特征。这里的三个数字不再对应空间里的x、y、z轴,而是对应三个“特征维度”。向量所在的“空间”也不再是物理空间,而是一个抽象的“特征空间”。在这个空间里,每个对象是一个点,点与点之间的距离和方向关系,反映的是对象之间的相似程度。

这次跳跃的意义在于:一旦对象变成了向量,所有为向量设计的运算和工具,就都能用在对象上了。判断两个人像不像,可以算他们特征向量的距离;判断两篇文章像不像,可以算它们特征向量的余弦相似度。向量成了一个通用的“接口”,把五花八门的对象统一成了计算机能处理的形式。

3.2 特征工程:选哪些维度是门手艺

既然对象可以用特征向量表示,那接下来的问题就是:选哪些维度?每个维度怎么算?这就是特征工程要解决的问题。

选维度这件事,没有标准答案,取决于你想解决什么问题。做用户画像,你可能会选年龄、消费频次、偏好品类等维度;做文本分类,你可能会选词频、句子长度、情感词密度等维度。维度选得好,向量就能抓住对象的本质差异;维度选得不好,向量里全是噪声,后面再怎么算都白搭。

这里有个常见的误区:很多人以为维度越多越好。实际上维度多了有两个麻烦。一是计算成本上升,高维向量的存储和运算都更贵。二是“维度灾难”,维度太高时,点与点之间的距离会变得没有区分度,反而影响效果。所以实际做特征工程,往往要在“信息量”和“维度数”之间找平衡。这个平衡怎么找,靠经验,也靠实验——先上一批维度,看效果,再增删调整。

3.3 归一化:让不同量纲的维度能公平比较

特征向量还有一个绕不开的坑:不同维度的量纲不一样。身高是厘米级,体重是十公斤级,消费金额可能是千元级。如果直接把这些数字放进向量算距离,数值大的维度会主导结果,数值小的维度几乎不起作用。

解决办法是归一化,把每个维度都缩放到一个统一的范围内,比如都缩到0到1之间,或者都做成均值为0、方差为1的标准分布。归一化之后,每个维度对距离的贡献就相对公平了。这一步在实操里非常关键,我见过不少项目效果不好,排查半天发现是忘了做归一化,某个大数值维度把其他维度全压住了。

归一化的具体做法,最常用的是最小最大缩放和标准化两种。最小最大缩放是把每个维度线性映射到[0, 1],适合分布比较均匀的情况;标准化是减均值除标准差,适合分布接近正态的情况。选哪种,看数据分布,也看后续用什么算法。这一步没有万能公式,得看具体情况。

4. 词向量:让词语变成可以计算的向量

4.1 为什么词语需要变成向量

前面讲的特征向量,维度是人手工选的。但处理语言的时候,手工选维度就行不通了——词语之间的关系太复杂,你很难手工列出几百个维度来刻画一个词的含义。于是就有了词向量:让算法从大量文本里自动学出每个词该用什么向量表示。

词向量的核心想法是:一个词的含义,由它周围经常出现的词决定。这个想法来自语言学里的一句老话——“观其伴,知其义”。如果两个词经常出现在相似的上下文里,那它们的含义大概率相近。算法通过大量文本统计这种共现关系,就能给每个词学出一个向量,使得含义相近的词,向量也相近。

这个思路的妙处在于,它把“理解词义”这个看起来很玄的问题,转化成了“统计共现、优化向量”这个可以计算的问题。学出来的向量,每一维不再有明确的人工含义,但整体上编码了词语的语义信息。这也是为什么词向量经常被说成“语义空间里的坐标”。

4.2 语义空间:距离近就是意思近

词向量学出来之后,每个词就成了一个高维空间里的点。这个空间叫“语义空间”。在语义空间里,两个词向量的距离近,就说明两个词意思近;距离远,就说明意思差得远。

这个性质让很多操作变得可能。比如找近义词,就是在这个空间里找离目标词最近的几个词。比如做文本分类,可以把一篇文章里所有词的向量平均一下,得到文章向量,再拿文章向量去做分类。比如做检索,把查询和文档都变成向量,算余弦相似度,相似度高的排前面。

语义空间还有一个有意思的性质:某些语义关系会表现为向量之间的固定偏移。经典例子是“国王”的向量减去“男人”的向量再加上“女人”的向量,结果会接近“女王”的向量。这说明语义空间里的方向也携带信息,某些方向对应着性别、时态之类的语义维度。当然,这种性质不是每个模型都稳定具备,但它直观地展示了向量表示的能力。

4.3 从词向量到句向量、文档向量

词向量解决的是单个词的表示,但实际任务往往要处理句子或整篇文档。怎么从词向量得到句向量或文档向量?常见做法有几种。

最简单的是平均法:把句子里所有词的向量加起来取平均。这个方法简单快速,但丢掉了词序信息,“狗咬人”和“人咬狗”会得到差不多的向量。改进的做法是加权平均,给重要的词更高权重,比如用词的逆文档频率做权重。再进一步是用专门的模型,比如基于神经网络的编码器,把整个句子编码成一个向量,这类模型能捕捉词序和句法结构,效果更好但计算更重。

选哪种方法,取决于任务对精度的要求和计算资源的限制。做粗筛可以用平均法,做精排可以用模型编码。实际系统里经常是组合使用,先用轻量方法快速过滤,再用重量方法精细排序。

5. 向量在工程系统里到底怎么用

5.1 相似度检索:向量数据库登场

当向量数量多到一定程度,逐个算相似度就太慢了。这时候就需要向量数据库或者向量检索库,专门做“给定一个查询向量,快速找出最相似的若干个向量”这件事。

这类工具的核心是近似最近邻搜索。精确地找最近邻,在百万级、亿级向量上代价太高,所以工程上通常接受一点点精度损失,换取大幅度的速度提升。常见的近似算法有基于树的、基于哈希的、基于图的几大类。基于图的方法这几年比较流行,因为它在大规模数据上召回率和速度的平衡做得不错。

选型的时候要考虑几个因素:数据规模、维度高低、对召回率的要求、是否支持增量更新、部署复杂度。数据量小的时候,简单的暴力搜索库就够用;数据量大、要求高召回,就得上专门的向量检索系统。这里没有银弹,得按实际情况权衡。

5.2 推荐系统里的双塔结构

推荐系统是向量用得最密集的场景之一。一个常见的架构是双塔模型:一边把用户特征编码成用户向量,一边把物品特征编码成物品向量,然后算两个向量的相似度作为推荐分数。

为什么用双塔?因为用户向量和物品向量可以离线算好、存起来,线上只需要做向量检索,响应速度快。这个结构把“理解用户”和“理解物品”解耦了,两边可以各自迭代。当然,双塔也有局限:用户和物品的交互信息在编码阶段没有直接用到,可能损失一些精度。所以实际系统里经常是双塔做召回,再用更复杂的模型做精排。

这个架构里,向量的质量直接决定推荐效果。用户向量要能抓住用户的真实偏好,物品向量要能抓住物品的真实特征,两者在同一个空间里才有可比性。训练的时候要让相关的用户和物品向量靠近、不相关的远离,这就是对比学习或者类似训练目标在做的事。

5.3 大模型时代:向量作为“记忆”和“检索”的接口

这两年大模型火了,向量又多了一个重要角色:作为检索增强生成里的检索接口。做法是把知识库里的文档切成块,每块编码成向量存起来;用户提问时,把问题也编码成向量,去知识库里找最相似的文档块,再把找到的内容拼进提示词里让模型生成回答。

这个流程里,向量承担的是“语义索引”的功能。它让系统能按意思找内容,而不是按关键词匹配。关键词匹配的问题是,用户问“怎么退款”,文档里写的是“如何申请退货”,字面不重合就匹配不上;向量检索能跨过字面差异,按语义找。

这里有个实操细节值得注意:文档切块的大小很影响效果。切得太碎,每块信息不完整;切得太大,一块里混了多个主题,检索精度下降。常见做法是按段落或按固定长度切,块之间留一点重叠,避免关键信息被切断。这个参数得根据文档类型和问题类型调,没有统一值。

6. 几个容易踩的坑和我的经验

6.1 维度不是越高越好

前面提过维度灾难,这里再强调一次。我见过有人做文本向量,一上来就用几千维,结果检索效果反而不如几百维。原因是高维空间里点与点之间的距离趋于均匀,区分度下降,而且计算和存储成本都上去了。

我的经验是:先从较低维度试起,比如一两百维,看效果;效果不够再逐步加维度,同时监控检索精度和速度的变化。很多场景下,几百维已经够用,盲目堆维度是浪费资源。

6.2 距离度量选错,效果全歪

向量检索里常用的距离度量有余弦相似度、欧氏距离、内积等。这几个不是随便选的,选错了效果会明显变差。

余弦相似度只看方向不看长度,适合文本这类长度差异大、但方向更能反映语义的场景。欧氏距离看绝对位置,适合特征已经归一化、长度本身有意义的场景。内积同时受方向和长度影响,适合长度也携带信息的场景。选之前先想清楚:你的向量长度是噪声还是信号?是噪声就去掉,用余弦;是信号就保留,用内积或欧氏距离。

6.3 向量要更新,别一劳永逸

数据在变,向量也得跟着变。用户偏好会漂移,物品特征会更新,文档库会新增内容。如果向量长期不更新,检索和推荐的效果会慢慢衰减。

实操上要设计好更新机制:全量重建成本高但一致性好,增量更新成本低但可能引入不一致。常见做法是定期全量重建加日常增量更新结合。更新频率看数据变化速度,变化快的场景可能每天甚至每小时都要更新,变化慢的场景每周或每月更新就够。

6.4 别忘了评估

向量好不好,最终要看下游任务的效果。做检索就看召回率和准确率,做推荐就看点击率和转化率,做分类就看分类指标。不要只看向量本身的某种“质量指标”,那和实际效果不一定对得上。

评估的时候要准备好标注数据或者线上实验。离线评估快但可能和线上不一致,线上实验准但成本高。我的习惯是先用离线评估快速迭代,候选方案收敛后再上线上小流量验证,避免直接全量上线踩大坑。

7. 给不同起点读者的上手路径

如果你是从数学角度想搞懂向量,建议先把二维、三维的几何直觉打牢,画图理解加法、数乘、点积的几何含义,再往高维推广。高维画不出来没关系,数字运算的规则是一样的,靠代数直觉补几何直觉。

如果你是做开发想用向量,建议直接从实际任务入手,比如做一个简单的文本相似度检索:把几句话编码成向量,算余弦相似度,看排序结果。跑通之后再逐步加复杂度,换更好的编码模型、上向量检索库、调距离度量。边做边理解,比先啃理论再动手效率高。

如果你是做业务想理解向量在系统里的角色,建议重点搞清楚“向量是对象的特征表示”和“相似度衡量对象关系”这两点,再结合具体系统看向量在哪一步产生、在哪一步使用。不需要会推导公式,但要知道每个环节的输入输出是什么、可能出什么问题。

向量这个概念,从一支箭头到语义空间里的坐标,跨度很大,但内核是一致的:用一组数字刻画一个对象,用数字之间的关系刻画对象之间的关系。把这个内核抓住,剩下的都是在这个内核上长出来的具体技术和工程取舍。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进