Embedding 到底是什么,为什么一句话可以变成一串向量
Embedding 到底是什么,为什么一句话可以变成一串向量
在使用大语言模型、RAG、向量数据库或者语义搜索时,经常会看到一个词:Embedding。
比如,我们可以把下面这句话:
今天天气不错,适合出去散步。
转换成类似这样的数字:
[0.182, -0.427, 0.063, 0.751, -0.214, ...]
实际的 Embedding 往往不是几个数字,而可能是几百甚至几千维。
这就会产生一个很直观的问题:
一句正常的人类语言,为什么能变成一串浮点数?这些数字又代表什么?
本文就从这个问题出发,简单理解一下 Embedding 的原理以及它为什么能用来做语义搜索、RAG 和相似度计算。
1. Embedding 本质上是什么
Embedding 可以翻译成“嵌入”或者“向量表示”。
简单来说,它的作用就是:
把文字、图片、声音等复杂信息转换成计算机更容易处理的向量。
例如:
"猫"
↓
[0.21, -0.57, 0.31, 0.88, ...]
"狗"
↓
[0.19, -0.49, 0.37, 0.82, ...]
"数据库"
↓
[-0.61, 0.13, -0.74, 0.09, ...]
这些数组就是向量。
关键并不在于某一个数字代表什么,而在于:
语义相似的内容,在向量空间中的位置通常也会比较接近。
例如:
猫 ↔ 狗
汽车 ↔ 卡车
苹果 ↔ 香蕉
Linux ↔ Ubuntu
MySQL ↔ PostgreSQL
这些概念之间本身存在一定的语义关系,因此经过训练后的 Embedding 模型通常会把它们映射到相对接近的位置。
而:
猫 ↔ PostgreSQL
这种语义关联很弱的内容,对应的向量距离通常会更远。
因此,Embedding 最核心的能力实际上可以概括为一句话:
把“语义关系”转换成“空间距离”。
2. 为什么计算机需要把文字变成数字
计算机本质上并不能直接理解“猫”“服务器”“今天适合散步”这些自然语言概念。
神经网络处理的仍然是数值。
例如,对于一句:
我喜欢吃苹果
最直接的办法,可以给每个词分配一个编号:
我 = 1
喜欢 = 2
吃 = 3
苹果 = 4
于是变成:
[1, 2, 3, 4]
但这存在一个很大的问题。
假设:
苹果 = 4
香蕉 = 5
数据库 = 6
从数字上看:
苹果和香蕉差 1
香蕉和数据库也差 1
但从语义上看,显然:
苹果 ≈ 香蕉
要远比:
香蕉 ≈ 数据库
合理得多。
所以,单纯使用 ID 并不能表达词语之间的语义关系。
Embedding 就是为了解决这个问题。
它不再用一个单独的整数表示一个词,而是使用一个多维向量。
例如:
苹果:
[0.72, 0.31, -0.18, 0.66]
香蕉:
[0.69, 0.28, -0.12, 0.71]
数据库:
[-0.42, 0.83, 0.59, -0.21]
可以发现,“苹果”和“香蕉”的向量非常接近,而“数据库”的向量差异明显更大。
当然,真实模型中的维度通常远远超过 4 维,这里只是为了方便理解。
3. 一个向量里的每个数字代表什么
这是理解 Embedding 时很容易产生的误区。
很多人可能会认为:
第 1 维 = 是否是动物
第 2 维 = 是否是食物
第 3 维 = 是否是科技产品
第 4 维 = 是否是地点
现实中通常并没有这么明确。
Embedding 的每一维通常都是模型在训练过程中自动学习出来的抽象特征。
例如,一个 768 维向量:
[0.031, -0.418, 0.972, ...]
我们通常很难直接说:
第 127 维表示“是不是动物”
或者:
第 342 维表示“情绪积极程度”
语义信息往往是分布在大量维度中的。
可以把它理解成:
模型并没有人为设计一套:
动物程度
科技程度
情绪程度
地点程度
这样的表格。
而是在训练过程中自动找到了一套更适合机器进行计算的坐标系。
所以,单独看某一个维度通常没有什么意义。
真正有意义的是:
整个向量之间的相对关系。
4. “一句话”又是怎么变成向量的
词语可以变成 Embedding,一整句话当然也可以。
例如:
我今天想去吃火锅
模型在处理这句话时,首先会进行 Tokenization。
例如可能被拆成:
我
今天
想
去
吃
火锅
实际上现代模型的 Token 不一定等于一个汉字或者一个单词,也可能是词的一部分。
然后,每个 Token 首先拥有自己的向量表示。
之后经过 Transformer 等神经网络层不断计算,让每个 Token 的表示能够结合上下文。
例如:
苹果发布了新手机
和:
我买了一个苹果吃
虽然都出现了“苹果”,但上下文不同。
模型最终得到的表示也会不同。
随后,Embedding 模型会通过某种方式把整个句子的信息压缩成固定长度的向量,例如:
我今天想去吃火锅
↓
[0.12, -0.36, 0.91, 0.27, ...]
无论原来的句子有 10 个字还是 100 个字,最终都可以得到一个固定维度的向量。
比如某个模型规定输出 768 维,那么:
你好
和:
今天晚上下班以后我准备和朋友去附近新开的餐厅吃火锅
最终都会得到一个 768 维向量。
5. 为什么相似的句子会得到相似的向量
这里才是 Embedding 真正重要的地方。
例如下面三句话:
A:怎么安装 Ubuntu?
B:Ubuntu 系统应该如何安装?
C:今天晚上吃什么?
虽然 A 和 B 使用的词并不完全一样,但表达的意思非常接近。
一个训练良好的 Embedding 模型应该让:
Embedding(A)
和:
Embedding(B)
非常接近。
而 C 与它们距离较远。
这实际上来自模型的训练过程。
训练时,模型会看到大量文本,并学习哪些文本在语义上相似、哪些文本差异较大。
可以简单理解为模型不断执行:
相似文本
→ 拉近
不相似文本
→ 推远
最后形成一个巨大的高维语义空间。
在这个空间中,意思相近的文本聚集在一起。
6. 怎么判断两个向量是否接近
有了向量以后,就需要衡量两个向量之间有多相似。
Embedding 中最常见的方法之一就是:
余弦相似度(Cosine Similarity)。
公式为:
A · B
cos(A,B) = --------------
|A| × |B|
它关注的是两个向量之间的方向是否相似。
最终通常得到一个相似度值。
例如:
句子 A:如何安装 Ubuntu
句子 B:Ubuntu 安装教程
相似度:0.93
而:
句子 A:如何安装 Ubuntu
句子 C:番茄炒蛋怎么做
相似度:0.18
于是我们就可以根据相似度判断文本内容是否相关。
用 Python 简单实现余弦相似度:
import numpy as np
a = np.array([0.2, 0.5, 0.8])
b = np.array([0.3, 0.4, 0.9])
similarity = np.dot(a, b) / (
np.linalg.norm(a) * np.linalg.norm(b)
)
print(similarity)
真实系统也是类似的思路,只不过向量可能有几百甚至几千维,同时需要处理几十万乃至几亿条数据。
7. Embedding 最常见的用途:语义搜索
传统搜索通常依赖关键词。
例如数据库里有一句:
Linux 系统磁盘空间不足的排查方法
用户搜索:
服务器硬盘满了怎么办
如果单纯依赖关键词匹配:
服务器
硬盘
满了
数据库中的原文一个都没有。
传统搜索可能就很难找到。
但从人的角度:
服务器硬盘满了
和:
Linux 系统磁盘空间不足
明显表达的是相近的问题。
Embedding 可以把两句话分别转成向量:
query_vector = Embedding("服务器硬盘满了怎么办")
doc_vector = Embedding("Linux 系统磁盘空间不足的排查方法")
然后计算相似度。
如果相似度很高,就说明两者在语义上相关。
这就是:
语义搜索。
它并不是搜索“有没有同样的字”,而是在搜索:
有没有意思相近的内容。
8. RAG 为什么大量使用 Embedding
Embedding 目前最常见的应用之一就是 RAG。
RAG 的完整名称是:
Retrieval-Augmented Generation
也就是检索增强生成。
假设我们有一份几十万字的企业内部文档。
用户问:
公司的年假最多能结转多少天?
显然不适合把全部文档塞给大模型。
于是通常会提前把文档分割成很多段:
Chunk 1
Chunk 2
Chunk 3
Chunk 4
...
然后分别转换成 Embedding:
Chunk 1 → Vector 1
Chunk 2 → Vector 2
Chunk 3 → Vector 3
...
并存进向量数据库。
用户提问时,再把问题转成向量:
公司的年假最多能结转多少天?
↓
Query Vector
然后在向量数据库里找与 Query Vector 最接近的几个文档块。
例如:
Top 1:员工年假最多可以结转 5 天至下一年度
Top 2:未使用的年假需要在次年第一季度前使用
Top 3:年假按照员工工作年限计算
最后把这些内容一起提供给大模型:
已知资料:
员工年假最多可以结转 5 天至下一年度。
问题:
公司的年假最多能结转多少天?
大模型再回答:
最多可以结转 5 天。
所以 Embedding 在 RAG 中承担的其实是:
帮大模型从大量资料中先找到可能相关的内容。
9. 为什么不用数据库 LIKE 查询
有人可能会想到:
既然只是查资料,为什么不用:
SELECT *
FROM documents
WHERE content LIKE '%年假%';
对于一些简单情况当然可以。
但如果用户问:
没休完的假期能留到明年吗?
文档写的是:
员工年假最多允许结转 5 天至下一年度。
关键词可能几乎对不上。
Embedding 却可以通过语义发现:
没休完的假期
≈
年假结转
这也是向量搜索相比普通关键词搜索最大的优势之一。
当然,这并不意味着关键词搜索没有用了。
实际系统中经常会使用:
关键词检索
+
向量检索
也就是所谓的混合检索。
10. 向量数据库又是什么
当数据量只有几十条时,完全可以直接:
逐个计算余弦相似度
但如果有:
100 万条文档
每次查询都和 100 万个向量进行完整比较,效率显然会很低。
因此就出现了专门针对向量检索优化的系统。
例如常见的向量数据库或者向量检索方案会使用:
HNSW
IVF
PQ
等算法建立索引。
这样就不必遍历所有向量,而是快速找到最可能相似的一部分。
这和普通数据库建立 B+Tree 索引的思路有一些类似:
通过额外的索引结构换取更快的查询速度。
因此:
Embedding
和:
向量数据库
其实不是一回事。
Embedding 负责:
文本 → 向量
向量数据库负责:
保存向量 + 快速搜索相似向量
11. Embedding 能不能反向还原出原文
一般不能。
例如:
"Ubuntu 安装教程"
↓
[0.17, -0.28, 0.63, ...]
通常无法再通过这个向量准确反推出:
Ubuntu 安装教程
因为 Embedding 更像是在保存文本的“语义特征”,而不是对文本进行可逆编码。
这和:
Base64
完全不同。
Base64 是编码,可以解码回原文。
Embedding 是一种语义表示。
很多不同文本甚至可能得到非常接近的向量,例如:
Ubuntu 怎么安装
Ubuntu 安装方法
如何安装 Ubuntu 系统
Ubuntu 系统安装教程
它们的原文不同,但语义高度相似。
因此得到的 Embedding 也可能非常接近。
12. Embedding 也不是万能的
虽然 Embedding 很好用,但它并不是“自动理解一切”。
实际应用中仍然会遇到不少问题。
例如:
我不喜欢苹果手机
和:
我喜欢苹果手机
两句话只有一个“不”字不同,大部分词都一样。
在某些 Embedding 模型中,两者仍然可能具有较高相似度。
因为它们讨论的是相同主题:
苹果手机
但态度却完全相反。
另外,例如:
2025 年销售额是多少?
和:
2024 年销售额是多少?
语义非常接近,但实际查询目标并不一样。
所以在真正的 RAG 系统里,通常不能只依赖向量相似度。
还可能结合:
关键词搜索
Metadata Filter
Reranker
权限过滤
时间过滤
等机制提高准确性。
13. Embedding 模型之间也有区别
并不是所有 Embedding 模型生成的向量效果都一样。
不同模型可能在以下方面存在差异:
向量维度
支持语言
最大输入长度
语义检索能力
代码检索能力
多语言能力
运行速度
模型大小
例如:
有的模型更适合中文。
有的更适合英文。
有的专门针对代码搜索训练。
还有的可以同时处理:
文本
图片
把它们放进同一个向量空间。
所以实际选择 Embedding 模型时,不能只看:
向量维度越高越好
维度更高并不意味着效果一定更好,反而意味着:
占用更多存储空间
检索成本更高
网络传输量更大
最终还是需要根据业务场景测试。
14. 一个更直观的理解方式
如果还是觉得 Embedding 比较抽象,可以想象一张地图。
二维地图中,一个地点可以表示为:
经度
纬度
例如:
A = (100, 30)
B = (101, 31)
C = (150, 60)
A 和 B 距离比较近,说明它们地理位置可能接近。
Embedding 可以理解成类似的东西。
只不过普通地图是:
二维空间
而 Embedding 可能是:
768 维空间
1536 维空间
3072 维空间
在这个空间中,坐标表达的不再是地理位置,而是:
语义位置。
例如:
猫
狗
宠物
动物
可能集中在某一片区域。
而:
数据库
MySQL
PostgreSQL
SQL
位于另一片区域。
所以可以把 Embedding 想象成:
给每一句话分配了一个“语义坐标”。
15. 总结
Embedding 表面上看起来只是:
一句话
↓
一串数字
但真正重要的是,这串数字让计算机获得了一种可以计算的“语义表示”。
它实现了一个非常关键的转换:
自然语言
↓
高维向量
↓
数学计算
于是原本很难直接计算的问题:
这两句话意思像不像?
就可以变成:
这两个向量距离近不近?
也正因为如此,Embedding 成为了很多 AI 应用的重要基础。
包括:
语义搜索
RAG
推荐系统
文本聚类
相似内容检测
知识库问答
图片搜索
代码搜索
都可以看到它的身影。
如果只用一句话概括 Embedding:
Embedding 就是把文本映射到一个高维语义空间,让“意思是否相近”变成一个可以通过数学方法计算的问题。
理解这一点以后,再去看 RAG、向量数据库、语义搜索,很多概念其实就会顺畅很多。
- 点赞
- 收藏
- 关注作者
评论(0)