一、「Embedding」到底是什么?
Embedding "就是把文本映射到向量空间",打个比方:就是给每一段文本(词 / 句子 / 文档)发一个「语义 GPS 坐标」:
- 语义越接近的文本,坐标在向量空间里就离得越近;
- 语义越不相关的,坐标就离得越远。
举个例子: "银行、金钱、苹果" 的例子:
- "银行" 和 "金钱" 语义强相关,所以它们的 GPS 坐标离得近,余弦相似度 0.5;
- "银行" 和 "苹果" 语义几乎无关,坐标离得远,相似度只有 0.25;
- 而 "银行" 和它自己的坐标完全重合,相似度是 1。
One-hot 为什么不行?
因为它给每个词的坐标都是 "完全正交" 的
最早的 One-Hot 编码是非黑即白 的逻辑,只有 0 和 1 两种状态。每个词语都是独立孤立的向量,彼此完全没有关联。有个很大的硬伤:很多词语字面毫无交集,但语义高度相关,比如银行和金钱。One-Hot 完全识别不出这种深层关联,只会判定两者毫无关系,根本没法做语义匹配。
后面引入余弦相似度就解决了这个问题:通过计算向量空间里两个向量的夹角,量化语义相似度。数值为 1 代表完全相同,0 代表毫无关联,-1 代表语义完全相反。靠这种方式,就能精准识别出字面不同、但意思相近的文本,完美弥补了 One-Hot 的缺陷。
二、「Word2Vec/GloVe」:怎么捕捉 "国王 - 男人 + 女人 = 女王"?
Word2Vec 的 CBOW 和 Skip-Gram:
- CBOW:用上下文预测中心词(比如用 "我 ___ 苹果" 预测 "吃");
- Skip-Gram:用中心词预测上下文(比如用 "吃" 预测 "我、苹果")。这两种方法本质上都是让模型在 "词和词的共现关系" 里,学到语义相关性------ 比如 "银行" 经常和 "金钱、存钱、取钱" 一起出现,模型就会给它们分配相近的向量。
而 GloVe 为什么能捕捉更复杂的关系?
因为它不只是看 "局部上下文"(Word2Vec 只看窗口内的词),还会看全局词共现矩阵------ 统计整个语料库中,每两个词一起出现的次数。举个例子:语料库中,"国王" 和 "男人" 一起出现的次数、"女王" 和 "女人" 一起出现的次数、"国王" 和 "女王" 一起出现的次数,会形成一个稳定的比例。GloVe 会把这个比例编码到向量的不同维度里:
向量的某几个维度专门编码 "性别" 属性:男人和女人的向量在这几个维度上差异很大; 某几个维度专门编码 "王权" 属性:国王和女王的向量在这几个维度上很接近。所以当你做 "国王(王权 + 男性) - 男人(男性) + 女人(女性)" 时,相当于把 "男性属性" 去掉,加上 "女性属性",剩下的就是 "王权 + 女性" 的向量,正好对应 "女王"。这就是你说的 "词对之间的向量差异反映共现概率"------ 本质是把词的语义属性拆成了向量的不同维度,做加减就能组合出不同的词。
三、数据检索:「倒排索引」和向量库有啥区别?
传统的关键词检索方法:倒排索引、B 树、哈希索引"。
举个例子,假设我们有 3 个文档:
- 文档 1:银行 存钱 安全
- 文档 2:苹果 水果 好吃
- 文档 3:银行 取钱 柜台
1. 什么是 "正排索引"?
就是我们平时想的 "文档→内容":
文档 1 → 包含词:银行、存钱、安全
文档 2 → 包含词:苹果、水果、好吃
文档 3 → 包含词:银行、取钱、柜台
搜 "银行" 的时候,你得遍历所有文档,一个个看里面有没有 "银行",文档多了(比如百万级)就很慢。
2. 什么是 "倒排索引"?
把顺序反过来,变成 "词→出现在哪些文档里":
- 银行 → 文档 1 (词频 1)、文档 3 (词频 1)
- 存钱 → 文档 1 (词频 1)
- 安全 → 文档 1 (词频 1)
- 苹果 → 文档 2 (词频 1)
- ...(其他词同理)搜 "银行" 的时候,直接去索引里找 "银行" 这个词,就能直接拿到对应的文档 1 和文档 3,不用遍历所有文档,速度快很多。
3. 它和向量库(比如 FAISS)的本质区别?
| 维度 | 倒排索引(比如 Elasticsearch) | 向量库(比如 FAISS) |
|---|---|---|
| 匹配逻辑 | 关键词精确匹配(词必须完全一样) | 语义模糊匹配(同义词、相关词都能匹配) |
| 核心优势 | 速度极快,适合大规模关键词检索 | 能捕捉语义,解决 "词不达意" 的问题 |
| 缺陷 | 同义词、近义词搜不到(比如搜 "取款",找不到 "取钱" 的文档) | 召回的结果可能语义相关但关键词不匹配,需要过滤 |
B 树、哈希索引,也是传统数据库的索引结构,和倒排索引一样,都是基于关键词的检索,而向量库是基于 Embedding 的相似度检索,这是 RAG 里 "混合检索" 的基础 ------ 很多企业级 RAG 会同时用倒排 + 向量检索,兼顾关键词精确匹配和语义模糊匹配,后面会讲。
-
倒排索引 核心是关键词精准匹配 ,结构逻辑特别简单:以词语为核心,绑定对应的文档编号 + 词频 。不再是按文档找关键词,而是反过来:先搜关键词,直接就能查到这个词出现在哪些指定文档 里,不用遍历全部文档,检索速度极快。简单说:倒排索引适合定点找带特定关键词的文档,只认字面精准匹配。
-
向量库检索 不走关键词匹配逻辑,是全局语义检索。不纠结文字表面一不一样,依托 Embedding 向量,在整个知识库中匹配语义相近的内容。哪怕提问用词和文档用词完全不同,只要语义贴合,就能被检索出来,也是 RAG 知识库最核心的检索方式。
业内还会把这俩对称叫:
- 稀疏检索 = 倒排索引 + 布尔关键词检索
- 稠密检索 = 向量库 + Embedding 语义检索
四、「Transformer 位置编码」
Transformer 的自注意力机制,它有个天生的问题:不认识词的顺序。比如把句子 "我吃苹果" 打乱成 "苹果吃我",自注意力算出来的权重分布几乎是一样的 ------ 因为它只看词和词的相似度,不管它们在句子里的位置。但这两个句子的意思完全相反,模型必须知道词的顺序,所以才需要「位置编码」。
位置编码的核心作用,就是给每个词加一个 "位置标签" :
- 给句子里的第 1 个词、第 2 个词、第 3 个词... 分别生成一个独一无二的 "位置向量";
- 把这个位置向量加到词的 Embedding 向量里,变成 "词的语义 + 位置信息" 的混合向量;
- 这样模型在计算注意力的时候,就能区分 "第 1 个位置的'我'" 和 "第 3 个位置的'我'",从而理解句子的顺序。
Transformer 里用的是「正弦 / 余弦位置编码」,简单说就是用不同频率的正弦、余弦函数,给不同位置生成不同的向量,这样位置越近的词,位置向量越相似,位置越远的词,位置向量差异越大,刚好能体现句子的顺序。