Embedding 到底是什么,为什么一句话可以变成一串向量

举报
yd_248795310 发表于 2026/10/17 19:35:09 2026/10/17
【摘要】 Embedding 到底是什么,为什么一句话可以变成一串向量在使用大语言模型、RAG、向量数据库或者语义搜索时,经常会看到一个词:Embedding。比如,我们可以把下面这句话:今天天气不错,适合出去散步。转换成类似这样的数字:[0.182, -0.427, 0.063, 0.751, -0.214, ...]实际的 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、向量数据库、语义搜索,很多概念其实就会顺畅很多。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。