Embedding Model 是一种机器学习模型,它的核心任务是将离散的、高维的符号(如单词、句子、图片、用户、商品等)转换成连续的、低维的向量(称为“嵌入”或“向量表示”),并且这个向量能有效地捕捉原始符号的语义、关系或特征。
1.1 通俗理解
Embedding Model是让计算机“理解”世界的核心工具,把“文字、图片、音频”等信息变成一串有意义的数字我们称之为“向量” 。
类比:假设用3个数字描述水果:
苹果 → [0.9, 0.1, 0.3]
香蕉 → [0.8, 0.5, 0.0]
橙子 → [0.7, 0.2, 0.4]
数字越接近 = 特征越相似(如苹果和橙子的三组数字都很接近,因为都是圆形水果)
这里我们使用Python 中 Gensim 库,如果没有安装的童鞋执行如下进行安装
pip install gensim -i https://pypi.tuna.tsinghua.edu.cn/simple
简单介绍:Gensim 是一个专注于非结构化文本处理的 Python 库,主要用于主题建模、文档相似度和词向量训练。可通过如下链接获取资料
gensim库学习
: 初识:Python库gensim-CSDN博客
官网: https://radimrehurek.com/gensim/
GitHub: https://github.com/RaRe-Technologies/gensim、
示例代码
# 本脚本演示如何使用Gensim库进行Word2Vec词向量训练与相似度计算
# 包含:语料准备、模型训练、词向量输出与词语相似度计算
from gensim.models import Word2Vec # 导入Word2Vec模型类
# 1. 语料准备(已分词)
sentences = [["猫", "吃", "鱼"], ["狗", "啃", "骨头"]] # 两个简单的中文句子,已分词
# 2. 训练Word2Vec模型
model = Word2Vec(sentences, vector_size=3, window=2, min_count=1) # 训练Word2Vec模型,向量维度为3,窗口大小为2,最小词频为1
# 3. 输出词向量
print(model.wv["猫"]) # 输出“猫”对应的词向量(示例输出如[-0.1, 0.8, 0.2])
# 4. 计算词语相似度
print(model.wv.similarity("猫", "狗")) # 计算“猫”和“狗”的词向量余弦相似度
在大模型中判断两个句子是否相似,主要通过以下步骤实现
相似度判断流程:
模型将每个句子转换为向量化数字
例如:
句子A: 早上好,你吃饭了吗
句子B: 早上好,我吃饭了
向量化
句子A → [0.23, -0.45, 0.12, ..., 0.78]
句子B → [0.25, -0.42, 0.15, ..., 0.75]
将向量化后的数值进行余弦计算
计算两个向量夹角的余弦值
公式:cos(θ) = (A·B) / (||A|| × ||B||)
其中:
A·B 是向量点积
||A|| 和 ||B|| 是向量模长
看最后计算出来的值接近哪个范围进行判断
余弦值范围:[-1, 1]
1:完全相同(向量方向完全一致)
0:无关(向量正交)
-1:完全相反
from sentence_transformers import SentenceTransformer, util
# 加载预训练模型
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
# 定义句子
sentences = [
"早上好,你吃饭了吗", # 句子A
"早上好,我吃饭了" # 句子B
]
# 生成嵌入向量
embeddings = model.encode(sentences)
# 计算余弦相似度
cosine_sim = util.pytorch_cos_sim(embeddings[0], embeddings[1])
print(f"余弦相似度: {cosine_sim.item():.4f}") # 输出: 0.9263
在Embedding技术中,N元语法(N-gram)的核心作用是引入局部上下文信息,以增强词或子词表示的语义丰富性、区分性和鲁棒性。 它主要用于解决单纯基于词(word)的Embedding(如经典的Word2Vec)的一些局限性。
N-Gram 是自然语言处理(NLP)中的基础概念,指文本中连续的 N 个项(item)组成的序列。这里的"项"可以是:
字符(character)
音节(syllable)
单词(word)
或其他语言单位
N-Gram 类型详解
类型 | 公式 | 示例(文本:"今天天气好") |
---|---|---|
1-gram | $P(w_i)$ | 今, 天, 天, 气, 好 |
2-gram | $P(w_i|w_{i-1})$ | 今天, 天天, 天气, 气好 |
3-gram | $P(w_i|w_{i-2},w_{i-1})$ | 今天天, 天天, 天气, 气好 |
4-gram | $P(w_i|w_{i-3}...w_{i-1})$ | 今天天气, 天天, 天气, 气好 |
捕捉局部上下文与一词多义(Polysemy):
问题: 同一个词在不同上下文中可能有完全不同的含义(例如,“苹果”在“吃苹果”和“苹果手机”中意思不同)。单纯的词Embedding(每个词一个固定向量)无法区分这种差异。
N-gram解决方案: 使用N-gram(尤其是Bi-gram, Tri-gram)作为构建Embedding的基本单元或特征。例如,在“吃苹果”中,“吃苹果”这个bi-gram会有一个特定的表示;在“苹果手机”中,“苹果手机”这个bi-gram会有另一个表示。这样,同一个词“苹果”在不同的N-gram组合中会获得不同的上下文感知的向量表示(间接地),从而更好地捕捉一词多义。
增强对未登录词/稀有词的处理(OOV & Rare Words):
问题: 在大型语料库中,总会出现一些在训练集中从未出现过的词(Out-Of-Vocabulary, OOV)或者出现频率极低的词(Rare Words)。基于词的模型无法为这些词生成有意义的向量(通常映射到统一的
向量)。
N-gram解决方案(子词Embedding): 这是N-gram在Embedding中最成功的应用之一(如fastText, Byte Pair Encoding)。核心思想是:
一个词由更小的单元(字符N-gram)组成。
训练时,不是直接为整个词学习一个向量,而是为词中所有可能的字符N-gram学习向量。
一个词的最终Embedding是其所有组成字符N-gram向量的求和或平均。
优势: 即使一个词从未在训练集中出现过,只要它的组成字符N-gram在训练集中出现过,就能通过组合这些N-gram的向量来生成一个相对合理的词向量。这对于处理拼写错误、派生词、复合词以及形态丰富的语言(如德语、土耳其语)特别有效。
提供更细粒度的语义信息:
N-gram(尤其是较小的n)可以捕捉词内部的形态结构(如前缀、后缀、词根)和词之间的紧密搭配关系(如固定短语“纽约”、“机器学习”)。这些信息对于理解词义和短语含义至关重要,是单纯词级Embedding可能忽略的。
作为特征输入:
在一些模型中,显式的N-gram特征(如Bi-gram, Tri-gram)可以直接作为额外的特征,与词Embedding拼接(concatenate)在一起,输入到下游任务(如文本分类、序列标注)的模型中。这为模型提供了更直接的局部上下文线索。
向量数据库(Vector Database) 是专为存储、索引和检索高维向量(例如 Embedding 生成的语义向量)而设计的数据库。它的核心作用是解决传统数据库难以高效处理的 “相似性搜索” 问题。
本质:向量数据库是AI时代的“相似性搜索引擎”,让机器理解的数据(向量)变得可高效检索,是大模型应用的关键基础设施。
常见的向量数据库:FALSS、Milvus、Pinecone
输入数据 → 通过模型生成 Embedding 向量 → 存入向量数据库 → 用户输入查询 → 查询被向量化 → 在数据库中搜索相似向量 → 返回相似结果
能力 | 传统数据库(SQL/NoSQL) | 向量数据库 |
---|---|---|
数据类型 | 结构化数据(行/文档)如MySQL存储Excel格式数据 | 高维非结构化特征向量 |
核心查询方式 | 精确匹配(SQL/条件) | 相似度搜索(ANN) |
适用场景 | 交易、统计分析 | 语义理解、内容推荐 |
数据关联逻辑 | 基于键值/关系 | 基于向量空间距离 |
2)传统数据库检索
3)向量数据库特点