Panoramica sull'incorporazione
L'embedding è un concetto di apprendimento automatico per la mappatura dei dati in uno spazio ad alta dimensionalità, in cui i dati di semantica simile sono collocati vicini. Essendo in genere una rete neurale profonda di BERT o di altre famiglie di trasformatori, il modello di embedding può rappresentare efficacemente la semantica di testo, immagini e altri tipi di dati con una serie di numeri noti come vettori. Una caratteristica fondamentale di questi modelli è che la distanza matematica tra i vettori nello spazio ad alta dimensionalità può indicare la somiglianza della semantica del testo o delle immagini originali. Questa proprietà sblocca molte applicazioni di information retrieval, come i motori di ricerca web come Google e Bing, la ricerca di prodotti e le raccomandazioni sui siti di e-commerce e il recente paradigma Retrieval Augmented Generation (RAG) nell'IA generativa.
Esistono due categorie principali di incorporazioni, ognuna delle quali produce un tipo diverso di vettore:
Incorporazione densa: La maggior parte dei modelli di embedding rappresenta le informazioni come un vettore in virgola mobile di centinaia o migliaia di dimensioni. L'output è chiamato vettori "densi", poiché la maggior parte delle dimensioni ha valori non nulli. Ad esempio, il popolare modello di embedding open-source BAAI/bge-base-en-v1.5 produce vettori di 768 numeri in virgola mobile (vettore float a 768 dimensioni).
Incorporazione rada: Al contrario, i vettori di output degli incorporamenti sparsi hanno la maggior parte delle dimensioni pari a zero, ovvero vettori "sparsi". Questi vettori hanno spesso dimensioni molto più elevate (decine di migliaia o più), determinate dalla dimensione del vocabolario dei token. I vettori sparsi possono essere generati da reti neurali profonde o da analisi statistiche di corpora di testo. Grazie alla loro interpretabilità e alle migliori capacità di generalizzazione al di fuori del dominio, gli embeddings sparsi sono sempre più adottati dagli sviluppatori come complemento agli embeddings densi.
Milvus è un database vettoriale progettato per la gestione, l'archiviazione e il recupero di dati vettoriali. Grazie all'integrazione dei modelli di embedding e reranking mainstream, è possibile trasformare facilmente il testo originale in vettori ricercabili o rerankare i risultati utilizzando modelli potenti per ottenere risultati più accurati per la RAG. Questa integrazione semplifica la trasformazione del testo ed elimina la necessità di componenti aggiuntivi di embedding o reranking, semplificando così lo sviluppo e la convalida delle RAG.
Per creare le incorporazioni in azione, vedere Utilizzo del modello di PyMilvus per generare incorporazioni di testo.
Funzione di incorporamento | Tipo | API o Open-sourced |
---|---|---|
openai | Denso | API |
trasformatore di frasi | Denso | Aperto |
bm25 | Sparso | Fornito da terzi |
Splade | Sparse | In licenza |
bge-m3 | Ibrido | In licenza libera |
voyageai | Denso | API |
jina | Denso | API |
cohere | Denso | API |
Istruttore | Denso | Aperto |
Mistral AI | Denso | API |
Nomic | Denso | API |
mGTE | Ibrido | Fornito in modo aperto |
Esempio 1: Usare la funzione di embedding predefinita per generare vettori densi
Per utilizzare le funzioni di embedding con Milvus, occorre prima installare la libreria client PyMilvus con il sottopacchetto model
che racchiude tutte le utilità per la generazione di embedding.
pip install "pymilvus[model]"
Il sottopacchetto model
supporta diversi modelli di embedding, da OpenAI, Sentence Transformers, BGE M3, BM25, fino ai modelli preaddestrati SPLADE. Per semplicità, questo esempio utilizza DefaultEmbeddingFunction
, che è un modello di trasformatore di frasi interamente MiniLM-L6-v2; il modello ha una dimensione di circa 70 MB e verrà scaricato al primo utilizzo:
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)
L'output previsto è simile al seguente:
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,)
Esempio 2: Generazione di vettori densi e radi in un'unica chiamata con il modello BGE M3
In questo esempio, utilizziamo il modello ibrido BGE M3 per incorporare il testo in vettori densi e radi e utilizzarli per recuperare i documenti rilevanti. I passaggi complessivi sono i seguenti:
Incorporare il testo in vettori densi e radi utilizzando il modello BGE-M3;
Creare una collezione Milvus per memorizzare i vettori densi e sparsi;
Inserire i dati in Milvus;
Cercare e ispezionare il risultato.
Per prima cosa, è necessario installare le dipendenze necessarie.
from pymilvus.model.hybrid import BGEM3EmbeddingFunction
from pymilvus import (
utility,
FieldSchema, CollectionSchema, DataType,
Collection, AnnSearchRequest, RRFRanker, connections,
)
Utilizzare BGE M3 per codificare i documenti e le query per il recupero dell'embedding.
# 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])
Esempio 3: Generare vettori sparsi usando il modello BM25
BM25 è un metodo ben noto che utilizza le frequenze di occorrenza delle parole per determinare la rilevanza tra query e documenti. In questo esempio, mostreremo come utilizzare BM25EmbeddingFunction
per generare embeddings sparsi sia per le query che per i documenti.
Per prima cosa, importare la classe BM25EmbeddingFunction.
from pymilvus.model.sparse import BM25EmbeddingFunction
In BM25, è importante calcolare le statistiche dei documenti per ottenere l'IDF (Inverse Document Frequency), che può rappresentare lo schema dei documenti. L'IDF è una misura della quantità di informazioni fornite da una parola, cioè se è comune o rara in tutti i documenti.
# 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 = "Where was Turing born?"
bm25_ef = BM25EmbeddingFunction()
# 2. fit the corpus to get BM25 model parameters on your documents.
bm25_ef.fit(docs)
# 3. store the fitted parameters to disk to expedite future processing.
bm25_ef.save("bm25_params.json")
# 4. load the saved params
new_bm25_ef = BM25EmbeddingFunction()
new_bm25_ef.load("bm25_params.json")
docs_embeddings = new_bm25_ef.encode_documents(docs)
query_embeddings = new_bm25_ef.encode_queries([query])
print("Dim:", new_bm25_ef.dim, list(docs_embeddings)[0].shape)
Il risultato atteso è simile al seguente:
Dim: 21 (1, 21)