嵌入向量概述
嵌入向量是机器学习中的一个概念,用于将数据映射到高维空间中,语义相似的数据会被放置在相近的位置。嵌入模型通常是来自 BERT 或其他 Transformer 系列的深度神经网络,可以有效地用一系列被称为向量的数字来表示文本、图像和其他数据类型的语义。这些模型的一个关键特性是,高维空间中向量之间的数学距离可以表示原始文本或图像语义的相似性。这一特性为许多信息检索应用提供了可能,如 Google 和 Bing 等网络搜索引擎、电商网站的产品搜索和推荐,以及最近在生成式 AI 中流行的检索增强生成(RAG)范式。
嵌入向量主要分为两大类,每类产生不同类型的向量:
-
密集嵌入向量:大多数嵌入模型将信息表示为数百到数千维的浮点向量。输出被称为"密集"向量,因为大多数维度都有非零值。例如,热门的开源嵌入模型 BAAI/bge-base-en-v1.5 输出 768 个浮点数的向量(768 维浮点向量)。
-
稀疏嵌入向量:相比之下,sparse embedding 的输出向量大多数维度为零,即"稀疏"向量。这些向量通常具有更高的维度(数万或更多),这由标记词汇的大小决定。稀疏向量可以由深度神经网络或文本语料库的统计分析生成。由于其可解释性和观察到的更好的域外泛化能力,稀疏嵌入向量越来越多地被开发者采用,作为密集嵌入向量的补充。
Milvus 是一个专为向量数据管理、存储和检索而设计的向量数据库。通过集成主流的嵌入模型和 reranking 模型,您可以轻松地将原始文本转换为可搜索的向量,或使用强大的模型对结果进行重新排序,以实现更准确的 RAG 结果。这种集成简化了文本转换过程,消除了对额外嵌入或重新排序组件的需要,从而简化了 RAG 的开发和验证。
要在实际应用中创建嵌入向量,请参考 使用 PyMilvus 的模型生成文本嵌入向量。
嵌入函数 | 类型 | API 或开源 |
---|---|---|
openai | 密集 | API |
sentence-transformer | 密集 | 开源 |
Splade | 稀疏 | 开源 |
bge-m3 | 混合 | 开源 |
voyageai | 密集 | API |
jina | 密集 | API |
cohere | 密集 | API |
Instructor | 密集 | 开源 |
Mistral AI | 密集 | API |
Nomic | 密集 | API |
mGTE | 混合 | 开源 |
Model2Vec | 混合 | 开源 |
Gemini | 混合 | 私有 |
示例 1:使用默认嵌入函数生成密集向量
要在 Milvus 中使用嵌入函数,首先需要安装带有 model
子包的 PyMilvus 客户端库,该子包包含了生成嵌入向量的所有工具。
pip install "pymilvus[model]"
model
子包支持各种嵌入模型,从 OpenAI、Sentence Transformers、BGE M3 到 SPLADE 预训练模型。为了简单起见,此示例使用 DefaultEmbeddingFunction
,它是 all-MiniLM-L6-v2 sentence transformer 模型,该模型约 70MB,会在首次使用时下载:
from pymilvus import model
# 这将下载 "all-MiniLM-L6-v2",一个轻量级模型。
ef = model.DefaultEmbeddingFunction()
# 要生成嵌入向量的数据
docs = [
"Artificial intelligence was founded as an academic discipline in 1956.",
"Alan Turing was the first person to conduct substantial research in AI.",
"Born in Maida Vale, London, Turing was raised in southern England.",
]
embeddings = ef.encode_documents(docs)
# 打印嵌入向量
print("Embeddings:", embeddings)
# 打印嵌入向量的维度和形状
print("Dim:", ef.dim, embeddings[0].shape)
预期输出类似于以下内容:
Embeddings: [array([-3.09392996e-02, -1.80662833e-02, 1.34775648e-02, 2.77156215e-02,
-4.86349640e-03, -3.12581174e-02, -3.55921760e-02, 5.76934684e-03,
2.80773244e-03, 1.35783911e-01, 3.59678417e-02, 6.17732145e-02,
...
-4.61330153e-02, -4.85207550e-02, 3.13997865e-02, 7.82178566e-02,
-4.75336798e-02, 5.21207601e-02, 9.04406682e-02, -5.36676683e-02],
dtype=float32)]
Dim: 384 (384,)
示例 2:使用 BGE M3 模型在一次调用中生成密集和稀疏向量
在这个示例中,我们使用 BGE M3 混合模型将文本嵌入为密集和稀疏向量,并使用它们来检索相关文档。整体步骤如下:
-
使用 BGE-M3 模型将文本嵌入为密集和稀疏向量;
-
设置 Milvus Collection 来存储密集和稀疏向量;
-
将数据插入到 Milvus;
-
搜索并检查结果。
首先,我们需要安装必要的依赖项。
from pymilvus.model.hybrid import BGEM3EmbeddingFunction
from pymilvus import (
utility,
FieldSchema, CollectionSchema, DataType,
Collection, AnnSearchRequest, RRFRanker, connections,
)
使用 BGE M3 对文档和查询进行编码以用于嵌入向量检索。
# 1. 准备一个小型语料库进行搜索
docs = [
"Artificial intelligence was founded as an academic discipline in 1956.",
"Alan Turing was the first person to conduct substantial research in AI.",
"Born in Maida Vale, London, Turing was raised in southern England.",
]
query = "Who started AI research?"
# BGE-M3 模型可以将文本嵌入为密集和稀疏向量。
# 它包含在 pymilvus 的可选 `model` 模块中,要安装它,
# 只需运行 "pip install pymilvus[model]"。
bge_m3_ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")
docs_embeddings = bge_m3_ef(docs)
query_embeddings = bge_m3_ef([query])