← 进阶 vibe coding向量用一组数字表示信息

免费文章 · 02 理解模型怎样生成回答

向量用一组数字表示信息


  前面讲工具时,我们提到过语义检索。它不只看有没有相同的关键词,还会尝试找到意思接近的内容。可它究竟是怎么判断“接近”的?为什么有时搜得很准,有时又会找到看似相关、实际无用的内容?

  这些问题背后,都离不开向量。理解向量,我们才能真正看懂语义检索和 Embeddings 在做什么,也能判断什么时候可以相信相似度,什么时候还需要进一步核对。以后面对 RAG、知识库、推荐和聚类等任务,也不会只停留在“调用一个 embedding 接口”。

  上一节我们看到,文本会先变成 token,再对应到 token ID。但这些 ID 只是词表中的编号,编号之间的大小和距离并不能表示意义上的关系。要让模型计算信息之间的联系,或者让检索系统比较两段内容是否接近,就需要另一种表示方式:用一组数字表示一个对象,这就是向量;把信息映射成向量的过程,则常称为 embedding。

  这一节,我们先看 token 怎样得到自己的向量,再用简单的二维例子理解方向、长度和距离,最后回到整段文本的语义检索。学完以后,你应该能够判断:两个向量什么时候可以比较、为什么维度相同也未必能混用,以及相似度为什么只能帮助我们寻找候选,不能替代事实判断。

token ID 用来查表,向量用来计算

  上一节我们已经知道,token ID 只是词表中的编号。编号本身不能表示内容之间的关系,那么模型真正计算时,用的又是什么?

  模型会为每个 token 保存一组可以学习的数值。拿到 token ID 后,就用它找到对应的那一组数,这组数就是这个 token 的向量;保存这些向量的参数表,通常称为 embedding 表。

  下面用一张人为设置的三维表看看这个过程。数值只是为了说明结构,并不来自真实模型。

token ID

对应向量

0

[0.2, 0.8, -0.1]

1

[0.3, 0.7, 0.0]

2

[-0.6, 0.1, 0.9]

  如果输入的 ID 是 [2, 0, 2],模型就依次取出第三行、第一行、第三行。ID 在这里更像一个索引:它负责找到哪一行,真正参与后续计算的是取出的向量。

  因此,词表有多少个 token,决定这张表有多少行;每个向量有多少维,则决定它有多少列。这些数值会在模型训练中不断调整,而我们平时使用已经训练好的模型时,并不会因为一次提问重新训练这张表。

  真实模型中的向量通常有很多维,而且每一维一般不能单独解释成“情绪”“颜色”或某种固定含义。信息更多是由许多维度共同表示出来的。

相似度比较的是向量之间的关系

  有了向量,接下来就能回答前面留下的问题:语义检索怎样判断两段内容是否“接近”?一种常见做法,就是比较它们对应向量之间的关系。

  为了看清这种关系,我们先把高维向量简化到二维。假设 A = [1, 1],B = [2, 2]。把它们画成从原点出发的箭头,可以看到 B 比 A 更长,但两者指向完全相同。不同的比较方式,会关注其中不同的特征

比较方式

观察什么

这两个向量的结果

余弦相似度

两个方向有多接近

1

点积

对应分量相乘后求和

1×2 + 1×2 = 4

欧氏距离

两个端点相距多远

√2 ≈ 1.414

  余弦相似度会把长度的影响去掉,所以 B 即使沿着原方向变长,只要方向不变,相似度仍然是 1;方向发生变化,相似度才会随之改变。把两个非零向量都归一化到长度 1 后,它们的点积就等于余弦相似度。

  不过,向量在几何上接近,并不天然意味着内容在语义上相近。只有经过相应训练,向量之间的方向和距离才可能反映我们关心的关系。因此,实际使用哪种相似度,也要结合 embedding 模型本身的设计和评测结果来决定。

  这也是为什么语义检索可以帮助我们找到“可能相关”的资料,却不能因为两个向量很接近,就直接认定其中的内容是正确的。

几百维的向量怎样画在平面上

  常见做法是降维,例如用 PCA(主成分分析)选择保留较多数据变化的两个方向,把高维向量投影到平面。图中只剩下部分信息,两个点在图上靠近,不能保证原始向量也同样接近;实际相似度应按原始向量与指定指标计算。本节的二维实验使用人工坐标,直接展示几何关系,没有对真实文本向量降维。

模型内部的表示和检索向量各有用途

  讲到这里,很容易产生一个疑问:前面 token 查表得到的是向量,语义检索比较的也是向量,它们是一回事吗?

  它们都用一组数字表示信息,但表示的对象和用途并不一样。token ID 查表得到的是这个 token 的初始表示,作为模型后续计算的起点。随着模型继续处理上下文,每个位置的表示也会不断变化,这些在模型内部计算中形成的表示,通常称为隐藏状态(hidden state)。

  因此,同一个 token 出现在不同句子里,最初查表得到的向量可以相同,后面的隐藏状态却可能不同,因为它已经结合了当前上下文的信息。

隐藏状态是什么

隐藏状态是模型处理文本过程中,在每个位置形成的内部向量表示。随着文本经过一层层计算,这些表示会不断结合上下文发生变化。
例如,Qwen3-Embedding-0.6B 会利用末尾位置的隐藏状态形成整段文本的表示。这里的“隐藏”,只是说它存在于模型内部计算过程中,并不是直接输出给我们的文字。

  而做语义检索时,我们通常需要把一句话或一整段资料表示成一个向量,这样才能拿查询和候选资料进行比较。Embedding 模型会先处理整段文本,再按照自己的方式从隐藏状态中提取一个整体表示。比如 Qwen3-Embedding-0.6B 会利用文本末尾位置的隐藏状态形成文本表示,默认输出 1024 维向量。

对象

表示什么

主要用途

token 初始 embedding

一个 token 的初始表示

作为模型计算的输入

隐藏状态

结合当前上下文后形成的内部表示

支持模型后续计算与生成

检索用文本 embedding

一句或一段文本的整体表示

比较查询与资料的相关程度

  这也带来一个实际限制:只有处在兼容表示空间中的向量,才适合直接比较。 即使两个 Embedding 模型都输出 1024 个数字,也不代表它们使用的是同一套“坐标”。因此,更换 Embedding 模型后,原来保存的资料向量通常也需要重新生成。

相似内容仍然可能答非所问

  向量可以帮助我们找到相近的内容,但“相近”并不等于“答案正确”。比如查询“试用账号可以导出数据吗?”,资料库里同时有“试用账号支持导出数据”和“试用账号不支持导出数据”。两条资料的主题和措辞都很接近,结论却完全相反。

  这时,相似度完成的只是第一步:从大量资料中找出可能相关的候选。 真正回答问题,还要继续判断适用版本、账号条件和原文内容。一个相似度分数本身承担不了这些工作。

运行向量实验

沿用已准备的课程实验仓库,打开向量实验。

  1. 在上方切换token ID序列,观察嵌入查表顺序。
  2. 在下方调整向量B,比较余弦相似度、点积和欧氏距离。
  3. 分别改变方向与长度,结合计算结果解释三个指标为何不同。

实验使用人工向量,不需要模型密钥。

方向相同,表示也完全相同吗?

  在二维实验中保持 A 为 [1, 1],把 B 从 [2, 2] 改成 [3, 3],再改成 [-1, 1]。哪些数值会变化?余弦为 1 能否证明两个向量完全相同?

查看答案与解析

  B 为 [2, 2] 与 [3, 3] 时,余弦都是 1,点积从 4 变成 6,欧氏距离从 √2 变成 √8。余弦为 1 只说明两个非零向量方向相同。B 改成 [-1, 1] 后与 A 垂直,点积和余弦都是 0,欧氏距离为 2。语义判断还取决于这些坐标怎样得来,不能只从数字形状推断。

  回到语义检索,余弦相似度 0.9 也不意味着“答案有 90% 的概率正确”。它只是两个向量在当前表示空间中的几何关系。换一个模型、任务或数据,这个分数的含义都可能不同;单纯提高向量维度,也不会自动让这些判断变得可靠。

  所以在实际的语义检索中,我们通常把相似度看作筛选线索,而不是事实结论

讨论

登录后参与讨论