想象一个游戏。我给你三个词:国王、王后、苹果。你闭着眼,要回答"国王和王后的关系,更像国王和苹果的关系吗?"
你显然做不到------你得先把这三个词放进某个坐标系里,然后量它们之间的距离。这个坐标系就是 Embedding(词嵌入)。
这篇文章讲清楚:AI 是怎么把"国王"变成一个 1536 维的数字向量,然后知道"国王 - 男人 + 女人 ≈ 王后"的。你不需要线性代数------理解核心思想就够了。
从"独热编码"说起:为什么 One-Hot 是最蠢的表示方式
假设我们的词典只有 5 个词:[苹果, 香蕉, 猫, 狗, 电脑]。
最简单的表示方式------给每个词一个编号:
css
苹果 → [1, 0, 0, 0, 0]
香蕉 → [0, 1, 0, 0, 0]
猫 → [0, 0, 1, 0, 0]
狗 → [0, 0, 0, 1, 0]
电脑 → [0, 0, 0, 0, 1]
这叫独热编码(One-Hot Encoding)。它有两个致命的缺陷:
- 维度爆炸:词典里有 50000 个词 → 每个词是一个 50000 维的向量。而且维度越高,99.99% 的元素都是 0------浪费。
- 没有"距离"概念 :在这个空间里,
苹果到香蕉的距离 =苹果到电脑的距离 =苹果到猫的距离。所有词之间"都一样远"------AI 无法知道哪些词是相似的。
独热编码记住了"苹果的编号是 0",但它对"苹果是什么"一无所知。
Embedding 的核心思想:用邻居定义一个词
语言学家 Firth 在 1957 年说过一句话,后来成了 NLP 的金科玉律:
"You shall know a word by the company it keeps." "一个词的意义,由它身边的词决定。"
苹果 和 香蕉 在真实文本里,它们"身边"的词经常相同:
arduino
"我喜欢吃苹果" → 左边是"吃",右边是空
"我喜欢吃香蕉" → 左边也是"吃",右边也是空
"苹果很好吃" → 右边是"很好吃"
"香蕉很好吃" → 右边也是"很好吃"
"买了一些苹果" → 左边是"买了"
"买了一些香蕉" → 左边也是"买了"
苹果 和 香蕉 在大量文本中,它们的上下文(周围词)高度重叠 → AI 推断它们"像"。
而 苹果 和 电脑 的上下文几乎不重叠:
arduino
"苹果很好吃" → 出现在食谱、水果
"电脑很好用" → 出现在数码产品、办公
所以 AI 给 苹果 和 香蕉 分配了相近的向量值,给 苹果 和 电脑 分配了距离较远的向量值。AI 不需要知道"什么是苹果"------它只需要知道"苹果和其他词的共存模式"就能把意义学到。
降维可视化:把 1536 维压到 2 维后一目了然
真实的 Embedding 向量通常是 768 维(BERT)或 1536 维(GPT-3)。人脑看不了一千多列的表格。但用 PCA 或 t-SNE 算法压到二维后:
markdown
水果区
🍎 苹果
🍌 香蕉
🍊 橘子
🐱 猫
动物区 🐶 狗
💻 电脑
电器区 📱 手机
同类的词自动聚在一起------不是人类告诉 AI"苹果属于水果",而是 AI 从文本统计中发现"苹果和香蕉的上下文很像,所以才被放在附近"。
最著名的"发现":国王 - 男人 + 女人 ≈ 王后
2013 年 Word2Vec 的一个实验结果震动了整个 NLP 领域:
scss
国王(向量) - 男人(向量) + 女人(向量) ≈ 王后(向量)
向量运算可以表达"语义关系":
巴黎 - 法国 + 意大利 ≈ 罗马
走路 - 走 + 跑 ≈ 跑步
AI 没有作弊------它从来没被显式地教"巴黎是法国的首都"。它只是从海量文本中学到:"巴黎"和"法国"的上下文关系 ≈ "罗马"和"意大利"的上下文关系。方向向量 (巴黎 - 法国) 恰好对应了"首都关系"。
这种"从数据中自动涌现结构"是 Embedding 最神奇的地方------你只需要告诉模型"多看看,自己找规律",它就能在向量空间里自动编码大量世界知识。
怎么用 Embedding:先"向量化",再"找邻居"
理解了 Embedding 是什么,你就能用它做几个很实际的事:
语义搜索:
用户输入 → Embedding 模型 → 查询向量
文档库 → Embedding 模型 → 每个文档一个向量
查询向量和所有文档向量做余弦相似度排序 → 最相似的 5 个文档 = 搜索结果
传统关键词搜"苹果手机" → 返回包含"苹果"和"手机"字符串的文档。Embedding 搜"苹果手机" → 返回涉及"iPhone"、"智能手机"等语义相似的文档------即使这些文档一个字都没提到"苹果"。
相似推荐:
arduino
"这篇文章的向量" 和 "用户读过的所有文章的向量" 做相似度 → 推荐最相似但还没读过的
RAG(检索增强生成)--- 你给 AI 装一个"资料库"的真正引擎:
markdown
1. 把公司的所有文档切成小段
2. 每段用 Embedding 模型转成向量
3. 用户问问题时 → 问题也转成向量 → 找最相似的前 5 段
4. 把这 5 段原文塞进 AI 的上下文 → AI:"基于你公司文档,答案如下"
这就是 RAG 的全部原理------一句话总结:用 Embedding 找到了"最相关的内容",然后把这些内容粘贴到 AI 的输入框里。 不需要重新训练模型------模型还是原来的模型,只是它"看"到了跟你的问题最相关的那几条资料。
Embedding 的一个硬限制:它是"静态的"
大多数 Embedding 模型(比如 text-embedding-3-small)是固定的------训练完成后不再更新。"苹果"在训练数据里大多数指水果------你的语料里大多数"苹果"也指水果------Embedding 就学得了"苹果 ≈ 水果"。
但如果你的公司内部文档里"苹果"总是指"苹果支付团队"------Embedding 模型不知道这一点。它训练的语料来自公共互联网,没有见过你的内部术语。这时候你需要 Finetuning(微调)------让 Embedding 模型在你的内部数据上"再学一遍"------本质就是让它重新理解"在你的世界里,这些词的意思是什么"。
一句话总结
Embedding 是 AI 理解语言的方式------它把每个词、每句话变成一个高维向量。向量之间的距离代表语义相似度。国王 - 男人 + 女人 ≈ 王后 不是魔法------是统计规律在向量空间里的自然涌现。而 RAG 就是靠这个机制------把你的问题和公司文档都向量化,找出最相似的那几条,塞进 AI 的上下文------AI 就能"回答跟你的业务有关的问题",而你不需要训练一个新模型。