Embeddings模型
什么是Embedding模型
Embeddings(嵌入)模型是一类在自然语言处理(NLP)、计算机视觉等多个领域有着广泛应用的重要模型,下面为你详细介绍:
基本概念
Embeddings 模型的核心功能是将离散的符号(如文本中的单词、图像中的像素块等)转化为连续的向量表示,这些向量通常位于低维的实数空间中。这种向量表示能够捕捉到输入数据的语义、句法等特征,使得计算机可以更好地处理和理解这些数据。
在自然语言处理中的应用
词嵌入(Word Embeddings)
原理:将单词映射到低维向量空间,使得语义相近的单词在向量空间中距离较近。例如,“苹果”和“香蕉”在语义上都属于水果类别,它们的词向量在空间中会相对靠
常见模型
Word2Vec:由谷歌开发,有两种训练模式,分别是连续词袋模型(CBOW)和跳字模型(Skip - Gram)。CBOW 根据上下文预测当前单词,而 Skip - Gram 则根据当前单词预测上下文。
GloVe:结合了全局统计信息和局部上下文信息,通过构建词 - 词共现矩阵,并对矩阵进行分解来学习词向量。
FastText:在 Word2Vec 的基础上进行了扩展,考虑了单词的子词信息,对于未登录词(在训练集中未出现的单词)也能生成合理的向量表示。
句嵌入(Sentence Embeddings)
原理:将整个句子表示为一个向量,用于句子相似度计算、文本分类等任务
常见模型
Sentence - BERT(SBERT):基于 BERT 模型进行改造,通过对 BERT 输出进行特殊处理,得到句子的向量表示。它在句子相似度计算任务上表现出色。
InferSent:是一种基于 LSTM 网络的句嵌入模型,通过在有监督的任务上进行训练,学习句子的语义表示。
在计算机视觉中的应用
图像嵌入(Image Embeddings)
原理:将图像转换为向量表示,用于图像检索、图像分类等任务。
常见模型
ResNet:一种深度卷积神经网络,通过在大规模图像数据集上进行训练,其最后一层全连接层的输出可以作为图像的嵌入向量。
VGG:也是经典的卷积神经网络,具有简单的网络结构,其输出的特征向量可以用于图像的语义表示。
通俗易懂的描述: 嵌⼊就相当于给⽂本穿上了“数字化”的外⾐ ,⽬的是让机器更好的理解和处理。
向量空间(Vector Space)
所有的数据都变成向量,这些向量组成⼀个庞⼤的矩阵。在这个世界⾥,每个词、句⼦、图⽚、⽤ ⼾…都被表⽰成⼀个“点”(即向量),⼤家都有⾃⼰的“坐标”。 我们可以通过“距离”和“⽅向”来理解它们的关系。 Embedding 向量放在向量空间⾥,有啥⽤? 距离表⽰相似度 向量之间越近:意义越相似 向量之间越远:意义越不同
解决问题
降维:在⾼维度空间中,数据点之间可能存在很⼤的距离,使得样本稀疏,嵌⼊模型可以减少数据 稀疏性。
捕捉语义信息:Embedding不仅仅是降维,更重要的是,它能够捕捉到数据的语义信息。语义相近 的词在向量上也是相近的
特征表⽰:原始数据的特征往往难以直接使⽤,通过嵌⼊模型可以将特征转换成更有意义的表⽰。
计算效率:在低维度空间中对数据进⾏处理和分析往往更加⾼效。
应用场景
信息检索:在搜索引擎中,通过计算查询文本和文档的嵌入向量之间的相似度,快速找到相关文档。
推荐系统:将用户的历史行为和物品的特征转化为嵌入向量,通过向量相似度为用户推荐感兴趣的物品。
情感分析:将文本的嵌入向量输入到分类模型中,判断文本的情感倾向(积极、消极或中性)。
在做RGA开发时会涉及到向量数据库,在创建向量数据库时需要使⽤Embedding模型对⽂本进⾏向量化处理。在检索的时候,需要对⽤⼾输⼊进⾏向量化处理也需要⽤到Embedding模型
常用的Embeddings模型
OpenAI Embeddings模型
OpenAI Embeddings 是 OpenAI 提供的一项将文本转换为数字向量的服务。这些向量能够捕捉文本的语义信息,使得语义相近的文本在向量空间中位置相近,在诸多自然语言处理任务中发挥着关键作用。
from openai import OpenAIclient = OpenAI(api_key="", base_url="https://api.34ku.com/v1/"
)resp = client.embeddings.create(input="你好,你是一个机器人。",model="text-embedding-3-large",dimensions=512
)
print(resp.data[0].embedding)
print(len(resp.data[0].embedding))
使用langchain:
from langchain_openai import OpenAIEmbeddingsclient = OpenAIEmbeddings(api_key="",base_url="https://api.34ku.com/v1/",model="text-embedding-3-small",dimensions=512 #维度512
)
#检索向量化
query = client.embed_query("Hello world")
print(query)
print(len(query))
#文本向量化
documents = client.embed_documents(["Hello world", "foo bar baz"])
print(documents)
print(len(documents))
BGE-Large
HuggingFace 上的 BGE 模型是最好的开源嵌⼊模型之⼀。 BGE 模型由北京⼈⼯智能研究院 (BAAI) 创建。 是⼀家从事 AI 研发的私营⾮营利组织。
import osfrom langchain_community.embeddings import HuggingFaceBgeEmbeddings
from langchain_huggingface import HuggingFaceEmbeddingsmodel_name = "BAAI/bge-small-en-v1.5"
#自己电脑使用cpu,如果是gpu,可以使用cuda
model_kwargs = {'device': 'cpu'}
#可以通过环境变量HF_ENDPOINT指定huggingface的镜像地址
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
#可以通过环境变量HF_HOME指定本地模型目录
#os.environ["HF_HOME"] =#'normalize_embeddings': True 表示:将输出的 embedding 向量做 L2 归一化处理,即让每个向量的长度(模长)为 1
encode_kwargs = {'normalize_embeddings': True} # set True to compute cosine similarity"""
已过时
bge_embedding = HuggingFaceBgeEmbeddings(model_name=model_name,model_kwargs=model_kwargs,encode_kwargs=encode_kwargs
)
"""
#使用HuggingFaceEmbeddings
bge_embedding = HuggingFaceEmbeddings(model_name=model_name,model_kwargs=model_kwargs,encode_kwargs=encode_kwargs
)
#文档 embedding 与 query embedding
documents = bge_embedding.embed_documents(["hello world"])
query = bge_embedding.embed_query("hello world")
print(documents)
print(query)
Qwen3-Embedding
Qwen3 - Embedding是阿里云基于通义千问大模型Qwen3所推出的向量嵌入模型。是目前比较好用的嵌入模型
# Requires transformers>=4.51.0
# Requires sentence-transformers>=2.7.0
import osfrom sentence_transformers import SentenceTransformer
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
# Load the model
qwen3_embedding = SentenceTransformer("Qwen/Qwen3-Embedding-0.6B")resp = qwen3_embedding.encode(['I like large language models.','今天的天气非常不错!']
)print(resp[0])
print(len(resp[0]))
langchain风格使用:
from langchain_core.embeddings import Embeddings
from sentence_transformers import SentenceTransformerclass Qwen3Embeddings(Embeddings):def __init__(self, model_name: str = "Qwen/Qwen3-Embedding-0.6B"):self.qwen3_embedding = SentenceTransformer(model_name)def embed_documents(self, texts: list[str]) -> list[list[float]]:return self.qwen3_embedding.encode(texts)def embed_query(self, text: str) -> list[float]:return self.qwen3_embedding.encode([text])if __name__ == "__main__":qwen3_embedding = Qwen3Embeddings()resp = qwen3_embedding.embed_documents(['I like large language models.','今天的天气非常不错!'])qwen3_embedding.embed_query('今天的天气非常不错!')print(resp[0])print(len(resp[0]))