嵌入是一種機器學習概念,用于將數據映射到高維空間,其中語義相似的數據被緊密排列在一起。嵌入模型通常是 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])