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 fuori dal dominio, gli embedding sparsi sono sempre più adottati dagli sviluppatori come complemento agli embedding 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 tradizionali, è 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 |
Splade | Sparse | In licenza libera |
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 a titolo gratuito |
Esempio 1: Usare la funzione di incorporamento 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, 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,
)
Usare BGE M3 per codificare i documenti e le query per il recupero degli 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])