Milvus 视角看主流嵌入式模型(Embeddings)
嵌入是一种机器学习概念,用于将数据映射到高维空间,其中语义相似的数据被紧密排列在一起。嵌入模型通常是 BERT 或其他 Transformer 系列的深度神经网络,它能够有效地用一系列数字(称为向量)来表示文本、图像和其他数据类型的语义。这些模型的一个关键特性是,高维空间中向量之间的数学距离可以指示原始文本或图像语义的相似性。这一特性解锁了许多信息检索应用,例如 Google 和 Bing 等网络搜索引擎、电商网站上的产品搜索和推荐,以及最近流行的生成式人工智能中的检索增强生成 (RAG) 范式。
嵌入主要有两种类别,每种类别都会产生不同类型的向量:
-
密集嵌入:大多数嵌入模型将信息表示为数百到数千维的浮点向量。由于大多数维度都具有非零值,因此输出被称为“密集”向量。例如,流行的开源嵌入模型 BAAI/bge-base-en-v1.5 输出 768 个浮点数的向量(768 维浮点向量)。
-
稀疏嵌入:相比之下,稀疏嵌入的输出向量大多数维度为零,即“稀疏”向量。这些向量通常具有更高的维度(数万甚至更高),这取决于标记词汇量的大小。稀疏向量可以通过深度神经网络或文本语料库的统计分析生成。由于稀疏嵌入具有可解释性且在领域外具有更佳的泛化能力,它越来越多地被开发人员用作密集嵌入的补充。
Milvus 是一款专为矢量数据管理、存储和检索而设计的矢量数据库。通过集成主流的嵌入和重排序模型,您可以轻松地将原始文本转换为可搜索的向量,或使用强大的模型对结果进行重排序,从而为 RAG 获得更准确的结果。这种集成简化了文本转换,无需额外的嵌入或重排序组件,从而简化了 RAG 的开发和验证。
要实际创建嵌入,请参阅使用 PyMilvus 的模型生成文本嵌入。
Embedding Function | Type | API or Open-sourced |
---|---|---|
openai | Dense | API |
sentence-transformer | Dense | Open-sourced |
Splade | Sparse | Open-sourced |
bge-m3 | Hybrid | Open-sourced |
voyageai | Dense | API |
jina | Dense | API |
cohere | Dense | API |
Instructor | Dense | Open-sourced |
Mistral AI | Dense | API |
Nomic | Dense | API |
mGTE | Hybrid | Open-sourced |
Model2Vec | Hybrid | Open-sourced |
Gemini | Hybrid | Private |
示例 1:使用默认嵌入函数生成密集向量
要在 Milvus 中使用嵌入函数,首先安装 PyMilvus 客户端库以及model
包含所有用于嵌入生成的实用程序的子包。
pip install "pymilvus[model]"
该model
子包支持各种嵌入模型,从OpenAI、Sentence Transformers、BGE M3到SPLADE预训练模型。为简单起见,本示例使用了DefaultEmbeddingFunction
全MiniLM-L6-v2句子 Transformer 模型,该模型大小约为 70MB,首次使用时需要下载:
from pymilvus import model# This will download "all-MiniLM-L6-v2", a light weight model.
ef = model.DefaultEmbeddingFunction()# Data from which embeddings are to be generated
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
print("Embeddings:", embeddings)
# Print dimension and shape of 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 集合来存储稠密向量和稀疏向量;
-
将数据插入到Milvus;
-
搜索并检查结果。
首先,我们需要安装必要的依赖项。
from pymilvus.model.hybrid import BGEM3EmbeddingFunction
from pymilvus import (utility,FieldSchema, CollectionSchema, DataType,Collection, AnnSearchRequest, RRFRanker, connections,
)
使用 BGE M3 对文档和查询进行编码以进行嵌入检索。
# 1. prepare a small corpus to search
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 model can embed texts as dense and sparse vectors.
# It is included in the optional `model` module in pymilvus, to install it,
# simply run "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])