什么是 embedding?
embedding 把含义变成坐标,机器才有可能对语言做计算。它是搜索、RAG 和注意力共同的地基。
先动手,再深入阅读
用向量比较文字含义 · 6 分钟神经网络没法把 dog 这个词拿去做乘法。它只能对数字做运算。
分词往前走了一半:给 dog 分配一个 ID,比如 5847。但这个 ID 是个标签,不是数量。token 5847 并不比 token 5846「更多」,两者也不会仅仅因为 ID 相邻就有关系。拿词表 ID 做数学运算是没有意义的。
embedding 解决了这个问题。它不给每个 token 分一个任意数字,而是给每个 token 一串几百个数字——一个向量——并让它的位置满足距离对应含义。
含义就是位置
想象一张地图,每个词都占一个点,而它的排布不是按字母顺序,而是按语义。
dog 和 puppy 靠得很近。dog 和 cat 也离得不远——是不同的动物,但在语言里角色相似。dog 和 democracy 则相隔很远。真实的 embedding 用的是几百上千个维度而不是两个,但这个直觉跨得过去:靠得近就是相似。
没有人手工指派这些位置。它们是学出来的。训练过程中,出现在相似上下文里的 token 会被反复地互相推近,在极其大量的文本上重复无数次。这个排布是使用模式留下的沉积。
干活的是分布式假设:在相似上下文里出现的词,含义往往相似。把它变成一个优化目标,几何结构就自然落出来了。
方向也承载含义
令人意外的不是相似的东西会聚在一起。而是空间里的方向居然是有意义的。
经典的演示:取 king 的向量,减去 man,加上 woman,你落在 queen 附近。看来存在一条一致的「性别」方向,还有另一条「王室」方向,而且它们可以叠加。
类似的结构也出现在单数/复数、现在时/过去时,以及国家/首都的配对里。从来没人告诉过模型这些范畴存在。它们之所以出现,是因为把它们编码下来有助于预测下一个 token。
有两点要记住。这些类比在演示里比在一般情况下干净——真实的 embedding 空间比这些例子所暗示的要凌乱。以及,这个空间会继承训练文本里存在的一切关联,包括有害的那些,因为它是人们实际写作方式的压缩记录。
静态与上下文相关
早期的 embedding 给每个 token 恰好一个向量。bank 只有一个位置,永远如此,不管你说的是河岸还是储蓄账户。
现代模型做得更好。初始 embedding 只是一个起点,之后网络的每一层都会根据邻居调整每个 token 的向量。到了上层,bank 在「river bank」里和在「bank account」里占据的是真正不同的位置。
这套调整机制就是自注意力,因此 embedding 是理解 transformer 如何工作的直接前置知识。注意力本质上就是一个让向量按相关程度彼此更新的过程。
于是流程是这样推进的:token → 静态 embedding → 经上下文调整的向量,一层又一层。
embedding 直接用来做什么
除了作为内部零件,embedding 本身就是一个独立的产品。
语义搜索。 给查询做 embedding,给每篇文档做 embedding,返回最近的邻居。这样即便没有共享关键词也能找到相关内容——「怎么让我的代码不崩」能匹配上一篇标题为「异常处理」的文档,因为驱动匹配的是含义,不是字符串重合。
检索增强生成。 RAG正是建立在这上面:给文档做 embedding,给进来的问题做 embedding,检索最接近的文本块,把它们作为上下文交给模型。embedding 是这个系统里负责检索的那一半。
聚类与去重。 给相似的工单分组,找出近乎重复的文章,发现主题随时间漂移。
分类。 给带标签的样本做 embedding,给新样本做 embedding,把它标成最近邻的标签。成效往往好得惊人,而需要的机械装置又如此之少。
所有这些都要求有个地方存向量,还得有快速找邻居的办法——见什么是向量数据库?和相似度检索到底是怎么运作的。
比较向量
比较两个向量,度量的不是它们的端点隔多远,而是它们有多大程度指向同一个方向。这个度量就是余弦相似度(cosine similarity):1.0 表示方向完全一致,0 表示无关,负数表示方向相反。
之所以优先看方向而不是原始距离,是因为向量的模长往往编码着无关紧要的东西——比如一个词出现的频率——而方向承载语义内容。同一主题、长度差很多的两篇文档,仍然应该算作相似。
要点回顾
- embedding 把 token 变成向量,其位置的安排让距离代表相似度。
- 位置是从上下文里学来的,从不手工指派;空间中的方向编码性别、时态这类关系。
- 现代模型让每个向量在逐层传递时按上下文调整自己——这个调整步骤就是注意力。
- 语义搜索、RAG、聚类、分类都是它的直接应用。
下一篇: LLM 到底是怎么写字的? —— 这些向量所驱动的生成循环。