一文看懂Embedding:用代码给大家讲清这个核心概念

今天我们要聊一个AI领域的关键技术——Embedding(嵌入)。不要被术语吓到,接下来我会用最直观的方式,配合代码示例,让你彻底明白它是什么!

什么是Embedding?

简单来说,Embedding就是把文字、图片或其他数据转换成数字的形式,让计算机能够理解和处理。就像我们给每个单词分配一个「数字身份证」,但这个身份证不是简单的编号,而是包含丰富信息的「多维特征向量」。

先举一个生动的栗子
想象一下,我们要给世界上所有食物编码:
汉堡:[-0.2, 0.8, 0.3]
沙拉:[0.5, -0.3, 0.1]
冰淇淋:[0.1, 0.9, -0.4]
数字的正负和大小代表了食物的特征(如甜度、健康程度、温度)。这样计算机就能通过数字计算发现「汉堡和冰淇淋都是高热量食物」。

Embedding就是大模型自己的语言,任何需要跟大模型沟通的文字、图像、视频都需要转换为大模型所能理解的语言:Embedding,它才能处理。处理完成后,它再翻译成人类能理解的文字、图像等。这也是大模型最强大的核心能力之一,多模态处理能力。

重点:代码实战

好,接下来直接上代码,看Embedding如何工作

# 导入必要的库
from sentence_transformers import SentenceTransformer

# 加载模型
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')

# 定义句子列表
sentences = [
    '我喜欢吃苹果',
    '苹果公司9月要发布新手机iPhone 17',
    '今天的天气真好,蓝天白云',
    "香蕉是一种热带水果"
]

# 生成Embedding向量
embeddings = model.encode(sentences)

print("生成的Embedding的向量维度:", embeddings.shape)

# 输出全部
# print("Embedding向量的具体内容:", embeddings)

# 输出上面句子的向量前10维
for i, sentence in enumerate(sentences):
    print(f"'{sentence}': {embeddings[i][:10]} ...")


# 计算句子间的相似度
from sklearn.metrics.pairwise import cosine_similarity

# 计算余弦相似度
similarities = cosine_similarity(embeddings)

print("句子相似度矩阵:")
for i in range(len(sentences)):
    for j in range(len(sentences)):
        if i <= j:  # 避免重复输出
            sim = similarities[i][j]
            print(f"'{sentences[i]}' vs '{sentences[j]}': {sim:.3f}")

输出如下:

生成的Embedding的向量维度: (4, 384)

'我喜欢吃苹果': [-0.37381974  1.1482197  -0.10418612  0.09360497 -0.66173714  0.2802788
1.6347399   0.14204119  0.8921655  -0.16619411] ...
'苹果公司9月要发布新手机iPhone 17': [-0.2590392   0.6924811   0.18627527 -0.5357205  -0.07483669 -0.19914986
0.8918247   0.05937493  0.6875115   0.24681543] ...
'今天的天气真好,蓝天白云': [-0.3749065   0.74014777  0.16411266 -0.21965387 -0.48084465 -0.22723575
1.4115497   0.11568774  0.76047236 -0.31601837] ...
'香蕉是一种热带水果': [-0.11292891  0.5817749   0.06361266  0.02144676 -0.511007    0.1269096
1.2333398   0.3227354   1.0315524   0.00547485] ...

句子相似度矩阵:
'我喜欢吃苹果' vs '我喜欢吃苹果': 1.000
'我喜欢吃苹果' vs '苹果公司9月要发布新手机iPhone 17': 0.445
'我喜欢吃苹果' vs '今天的天气真好,蓝天白云': 0.782
'我喜欢吃苹果' vs '香蕉是一种热带水果': 0.823
'苹果公司9月要发布新手机iPhone 17' vs '苹果公司9月要发布新手机iPhone 17': 1.000
'苹果公司9月要发布新手机iPhone 17' vs '今天的天气真好,蓝天白云': 0.642
'苹果公司9月要发布新手机iPhone 17' vs '香蕉是一种热带水果': 0.544
'今天的天气真好,蓝天白云' vs '今天的天气真好,蓝天白云': 1.000
'今天的天气真好,蓝天白云' vs '香蕉是一种热带水果': 0.866
'香蕉是一种热带水果' vs '香蕉是一种热带水果': 1.000

注:上面的代码会默认从hugging face官方仓库下载模型,需要翻墙!!!!!

接下来再用ModelScope的方式实现一遍:

(ModelScope阿里云提供的一个中文版的HuggingFace)

from langchain_community.embeddings import ModelScopeEmbeddings

# 初始化句子嵌入pipeline
model_id = "damo/nlp_corom_sentence-embedding_chinese-base"
embedding_model = ModelScopeEmbeddings(model_id=model_id)

# 定义句子列表
sentences = [
    '我喜欢吃苹果',
    '苹果公司9月要发布新手机iPhone 17',
    '今天的天气真好,蓝天白云',
    "香蕉是一种热带水果"
]

embeddings = embedding_model.embed_documents(sentences)

# 输出全部
# print("Embedding向量的具体内容:", embeddings)

# 输出上面句子的向量前10维
for i, sentence in enumerate(sentences):
    print(f"'{sentence}': {embeddings[i][:10]} ...")


from sklearn.metrics.pairwise import cosine_similarity

# 计算余弦相似度矩阵
similarity_matrix = cosine_similarity(embeddings)

print("句子之间的余弦相似度矩阵:")
for i in range(len(sentences)):
    for j in range(len(sentences)):
        if i <= j:  # 避免重复输出
            print(f"'{sentences[i]}' vs '{sentences[j]}' 的相似度: {similarity_matrix[i][j]:.4f}")

输出如下:

'我喜欢吃苹果': [0.32604819536209106, -0.24579137563705444, 0.14939190447330475, -0.18595966696739197, -0.2441755086183548, -0.5086973309516907, -0.4876851439476013, -0.01850845105946064, 0.44076400995254517, -0.019114553928375244] ...
'苹果公司9月要发布新手机iPhone 17': [0.1550225019454956, -0.2128225564956665, 0.2851581275463104, -0.8280717730522156, 0.5369096994400024, -0.7610117793083191, -0.14223024249076843, -0.8344448208808899, -0.31277164816856384, -0.0666898638010025] ...
'今天的天气真好,蓝天白云': [0.6082981824874878, 0.3789174258708954, 0.004537384957075119, -0.027960695326328278, 0.46887874603271484, -0.5822398662567139, -0.4064663350582123, -1.11110520362854, 0.24349763989448547, 0.1817186176776886] ...
'香蕉是一种热带水果': [0.38078010082244873, -0.6754599213600159, 0.1290031373500824, -0.14763924479484558, -0.011951431632041931, -0.23197220265865326, -0.3167392313480377, -1.2026702165603638, -0.014405147172510624, 0.2859038710594177] ...

句子之间的余弦相似度矩阵:
'我喜欢吃苹果' vs '我喜欢吃苹果' 的相似度: 1.0000
'我喜欢吃苹果' vs '苹果公司9月要发布新手机iPhone 17' 的相似度: 0.4424
'我喜欢吃苹果' vs '今天的天气真好,蓝天白云' 的相似度: 0.4736
'我喜欢吃苹果' vs '香蕉是一种热带水果' 的相似度: 0.6298
'苹果公司9月要发布新手机iPhone 17' vs '苹果公司9月要发布新手机iPhone 17' 的相似度: 1.0000
'苹果公司9月要发布新手机iPhone 17' vs '今天的天气真好,蓝天白云' 的相似度: 0.4052
'苹果公司9月要发布新手机iPhone 17' vs '香蕉是一种热带水果' 的相似度: 0.4137
'今天的天气真好,蓝天白云' vs '今天的天气真好,蓝天白云' 的相似度: 1.0000
'今天的天气真好,蓝天白云' vs '香蕉是一种热带水果' 的相似度: 0.4308
'香蕉是一种热带水果' vs '香蕉是一种热带水果' 的相似度: 1.0000

两种实现方式大体上结果是一样的,因为是不同的模型,所以向量值会有差异。(上面两种实现方式三方依赖可能会存在冲突,建议使用不同的环境尝试喔!)


是不是很神奇!计算机通过Embedding发现:
1、「我喜欢吃苹果」和「香蕉是一种热带水果」相似度很高(都是水果)
2、但与「苹果公司」相似度很低(虽然都有"苹果"二字)
3、和「天气」基本不相关
这就是Embedding的魔力——理解语义而不仅仅是字面!

为什么Embedding如此重要?

  1. 让计算机理解语言:不再是简单的关键词匹配,而是真正的语义理解

  2. 赋能推荐系统:Netflix、淘宝都在用Embedding理解你的喜好

  3. 驱动搜索引擎:Google搜索背后的核心科技之一

  4. 聊天机器人:ChatGPT等AI对话系统的基石

目前流行的Embedding模型

平台模型名称主要特点典型应用场景
Hugging FaceBAAI/bge-m3 多语言、性能强劲,在 MTEB 基准测试中排名靠前多语言语义搜索、检索增强生成 (RAG)
BAAI/bge-large-zh-v1.5 专注于中文优化,在中文社区非常受欢迎中文文本处理、问答系统、知识库检索
thenlper/gte-base 英语通用模型,在多种任务上表现稳定英语语义相似度、文本分类
intfloat/e5-large-v2 英语通用模型,通过指令微调提升文本表示能力文本检索、相似度计算
moka-ai/m3e-base 专门针对中文优化,在中文语义相似度和文本分类任务上表现良好中文文本处理、社交媒体分析
ModelScopedamo/nlp_corom_sentence-embedding_chinese-base 达摩院中文通用领域模型,支持最长512文本输入中文通用领域文本向量化
damo/nlp_gte_sentence-embedding_chinese-base 达摩院中文通用领域模型,提供 base、large、small 多种规格中文通用领域文本向量化
damo/nlp_corom_sentence-embedding_english-base 达摩院英文通用领域模型英文通用领域文本向量化
paraphrase-MiniLM-L6-v2 轻量级(约90MB),速度快,在语义相似度任务上表现良好,在 ModelScope 上也可获取快速原型开发、语义相似度计算、资源受限环境
all-MiniLM-L6-v2 轻量级通用模型,体积小速度快,在 ModelScope 上也可获取快速原型开发、中小型项目
Qwen3-Embedding 系列 通义千问最新开源,提供 0.6B/4B/8B 三种尺寸,支持多语言,8B版本在 MTEB 多语言榜单表现优异多语言检索、RAG 系统

说在最后

Embedding就像是一座桥梁,连接了人类语言和计算机数字世界。它通过将文字转换为富含语义的数字向量,让机器能够真正「理解」我们的语言。
下次当你使用智能搜索、推荐系统或与AI对话时,就知道背后是Embedding技术在默默工作啦!


希望这篇讲解对你有帮助!如果有任何问题,欢迎在评论区留言讨论。

记得关注我,不然下次可能找不到啦!后续相关资料及源代码通过公众号发送。如果你有什么特别想了解的话题,欢迎留言告诉我~

(本次相关源码如需获取,请关注vx公众号:优趣AI,回复 ufunai-embedding 获取,扫一扫即获取)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值