Embedding 入门:为什么向量能表示"语义"
做 AI 应用绕不开 embedding。它听起来玄,但核心 idea 很朴素。
词的表示:从离散到连续
计算机不认识“苹果”和“橘子”,它只认识数字。最原始的办法是给每个词编个号:苹果=1,橘子=2,桌子=3。但这有个致命问题 —— 编号本身不携带任何语义,1 和 2 的关系,跟 1 和 3 的关系,没区别。
embedding 的做法是:给每个词一个高维向量(比如 1536 维的浮点数列表),让“意思相近的词,向量也相近”。
训练目标:上下文预测
这些向量怎么来的?通过让模型做大量“猜上下文”的练习。一个词周围经常出现哪些词,它的向量就被调整得跟那些词接近。练过海量文本后,几何关系就浮现了:
国王 - 男人 + 女人 ≈ 女王北京 - 中国 + 日本 ≈ 东京
这种“向量加减 ≈ 语义关系”的现象,就是 embedding 有用的根本原因。
相似度 = 余弦距离
两个向量“有多像”,用余弦相似度衡量:两个向量夹角的余弦。方向越一致,值越接近 1,语义越相关。
import numpy as np
def cosine(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
它解锁了什么:向量检索
有了 embedding,就可以做传统关键词搜索做不到的事 —— 按意思搜。搜“怎么提高服务器性能”,能召回标题是“后端优化与扩容”的文档,哪怕一个字都不重合。
这就是 RAG(检索增强生成)的检索基础:把知识库每段话转成向量存起来,用户提问也转成向量,找最相似的几段喂给 LLM 作上下文。LLM 负责生成,embedding 负责找。
一句话:embedding 把“语义”变成了可以算距离的坐标,让“找意思相近的东西”从 impossible 变成了
O(log n)。
一点提醒
embedding 不是万能。它对精确匹配(找个订单号、查个具体 SKU)反而不如传统倒排索引。工程里通常是混合检索:关键词命中 + 语义召回,两者取并集再排序。