🚀 Prova Zilliz Cloud, la versione completamente gestita di Milvus, gratuitamente—sperimenta prestazioni 10 volte più veloci! Prova Ora>>

milvus-logo
LFAI
  • Home
  • Blog
  • Introduzione all'integrazione di PyMilvus con i modelli incorporati

Introduzione all'integrazione di PyMilvus con i modelli incorporati

  • Engineering
June 05, 2024
Stephen Batifol

Milvus è un database vettoriale open-source progettato specificamente per le applicazioni di IA. Se state lavorando all'apprendimento automatico, all'apprendimento profondo o a qualsiasi altro progetto legato all'IA, Milvus offre un modo robusto ed efficiente per gestire dati vettoriali su larga scala.

Ora, con l'integrazione del modulo modello in PyMilvus, l'SDK Python per Milvus, è ancora più facile aggiungere modelli di Embedding e Reranking. Questa integrazione semplifica la trasformazione dei dati in vettori ricercabili o il reranking dei risultati per ottenere risultati più accurati, come nel caso della Retrieval Augmented Generation (RAG).

In questo blog esamineremo i modelli di embedding denso, i modelli di embedding sparse e i re-ranker e dimostreremo come utilizzarli nella pratica usando Milvus Lite, una versione leggera di Milvus che può essere eseguita localmente nelle vostre applicazioni Python.

Incorporazioni dense e sparse

Prima di illustrarvi come utilizzare le nostre integrazioni, analizziamo le due principali categorie di embedding vettoriali.

Leincorporazioni vettoriali rientrano generalmente in due categorie principali: Embeddings densi e Embeddings sparsi.

  • Gli embeddings densi sono vettori ad alta densità in cui la maggior parte o tutti gli elementi sono non nulli, il che li rende ideali per codificare la semantica del testo o il significato sfumato.

  • Gli embeddings sparsi sono vettori ad alta densità con molti elementi nulli, più adatti a codificare concetti esatti o adiacenti.

Milvus supporta entrambi i tipi di incorporazioni e offre una ricerca ibrida. La ricerca ibrida consente di effettuare ricerche su diversi campi vettoriali all'interno della stessa collezione. Questi vettori possono rappresentare diverse sfaccettature dei dati, utilizzare diversi modelli di embedding o impiegare diversi metodi di elaborazione dei dati, combinando i risultati con i ri-ranker.

Come utilizzare le nostre integrazioni di embedding e reranking

Nelle sezioni seguenti verranno illustrati tre esempi pratici di utilizzo delle nostre integrazioni per generare embedding e condurre ricerche vettoriali.

Esempio 1: Usare la funzione di embedding predefinita per generare vettori densi

Per utilizzare le funzioni di embedding e reranking con Milvus, è necessario installare il client pymilvus con il pacchetto model.

pip install "pymilvus[model]"

Questo passo installerà Milvus Lite, che consente di eseguire Milvus localmente all'interno della propria applicazione Python. Include anche il sottopacchetto model, che comprende tutte le utilità per l'embedding e il reranking.

Il sottopacchetto del modello supporta diversi modelli di embedding, tra cui quelli di OpenAI, Sentence Transformers, BGE-M3, BM25, SPLADE e i modelli pre-addestrati di Jina AI.

Questo esempio utilizza il modello DefaultEmbeddingFunction, basato per semplicità sul modello all-MiniLM-L6-v2 Sentence Transformer. 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 lightweight 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:", embeddings)
# Print dimension and shape of embeddings
print("Dim:", ef.dim, embeddings[0].shape)

Il risultato atteso dovrebbe essere 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: 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 per query e documenti.

In BM25 è importante calcolare le statistiche dei documenti per ottenere l'IDF (Inverse Document Frequency), che può rappresentare i modelli dei documenti. L'IDF misura la quantità di informazioni fornite da una parola, se è comune o rara in tutti i documenti.

from pymilvus.model.sparse import BM25EmbeddingFunction

# 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 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)

Esempio 3: Utilizzo di un ReRanker

Un sistema di ricerca mira a trovare i risultati più rilevanti in modo rapido ed efficiente. Tradizionalmente, metodi come BM25 o TF-IDF sono stati utilizzati per classificare i risultati della ricerca in base alla corrispondenza delle parole chiave. I metodi più recenti, come la similarità del coseno basata sull'embedding, sono semplici, ma a volte non tengono conto delle sottigliezze del linguaggio e, soprattutto, dell'interazione tra i documenti e l'intento della query.

È qui che l'uso di un riarrangiatore è utile. Un re-ranker è un modello avanzato di intelligenza artificiale che prende l'insieme iniziale di risultati di una ricerca - spesso forniti da una ricerca basata su embeddings e token - e li rivaluta per garantire che si allineino meglio all'intento dell'utente. Il sistema guarda oltre la corrispondenza superficiale dei termini per considerare l'interazione più profonda tra la query di ricerca e il contenuto dei documenti.

Per questo esempio, utilizzeremo Jina AI Reranker.

from pymilvus.model.reranker import JinaRerankFunction

jina_api_key = "<YOUR_JINA_API_KEY>"

rf = JinaRerankFunction("jina-reranker-v1-base-en", jina_api_key)

query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"

documents = [
   "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
   "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
   "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
   "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
]

results = rf(query, documents)

for result in results:
   print(f"Index: {result.index}")
   print(f"Score: {result.score:.6f}")
   print(f"Text: {result.text}\n")

Il risultato atteso è simile al seguente:

Index: 1
Score: 0.937096
Text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.

Index: 3
Score: 0.354210
Text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.

Index: 0
Score: 0.349866
Text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.

Index: 2
Score: 0.272896
Text: In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.

Diventa un protagonista su GitHub e unisciti al nostro Discord!

Se vi è piaciuto questo post, considerate l'idea di stellinare Milvus su GitHub e sentitevi liberi di unirvi al nostro Discord! 💙

Like the article? Spread the word

Continua a Leggere