Avete difficoltà con l'intelligenza artificiale o lo sviluppo full-stack? I nostri esperti sono qui per guidarvi: consulenza personalizzata, integrazione tecnica e molto altro. Contattateci a [email protected].

Creare un modello di ricerca semantica con trasformatori di frasi per un'applicazione RAG

Implementare una pipeline di Retrieval Augmented Generation (RAG) perfezionando il proprio modello di ricerca semantica è un approccio potente per migliorare l'accuratezza e la pertinenza dei sistemi di risposta alle domande.

Questa tecnica combina i punti di forza della ricerca semantica e dell'intelligenza artificiale generativa, consentendo al sistema di comprendere meglio le domande degli utenti e di generare risposte più accurate e contestualmente rilevanti. Grazie alla messa a punto di un modello di ricerca semantica tramite Sentence Transformers, gli sviluppatori possono adattare il modello al loro dominio specifico, migliorando le prestazioni complessive della pipeline RAG.

Ricerca semantica

Che cos'è la ricerca semantica?

La ricerca semantica è una tecnica di ricerca dei dati che va oltre i tradizionali metodi di ricerca basati sulle parole chiave. Utilizza algoritmi di elaborazione del linguaggio naturale e di apprendimento automatico per migliorare l'accuratezza dei risultati di ricerca, considerando l'intento del ricercatore e il significato contestuale dei termini utilizzati nella sua interrogazione. Questo approccio mira a comprendere il significato sottostante alla query di ricerca e al contenuto delle pagine web, anziché limitarsi a far corrispondere le parole chiave. In questo modo, la ricerca semantica può fornire risultati più pertinenti, anche se non contengono le parole esatte utilizzate nella query originale.

Per raggiungere questo obiettivo, la ricerca semantica impiega varie tecniche, come la disambiguazione del senso delle parole, l'estrazione dei concetti e l'espansione delle query. Utilizza anche la ricerca vettoriale e l'apprendimento automatico per restituire risultati che corrispondono all'intento e al contesto dell'utente. La ricerca semantica è ampiamente utilizzata nei motori di ricerca web, come Google, ed è alimentata da tecnologie come il Knowledge Graph, che memorizza dati strutturati sulle entità e sulle loro relazioni. Ciò consente ai motori di ricerca di comprendere il significato delle query di ricerca e di fornire risultati più accurati e significativi.

La ricerca semantica è molto utile per le aziende che vogliono rispondere a domande sulla propria conoscenza del dominio, come la documentazione tecnica, i contratti, le descrizioni dei prodotti...

Che cos'è la Retrieval Augmented Generation (RAG)?

Ricerca semantica

La Retrieval Augmented Generation (RAG) è una tecnica che migliora l'accuratezza e l'affidabilità dei modelli generativi di intelligenza artificiale, come i Large Language Models (LLM), incorporando fonti di dati esterne per fornire informazioni più accurate e aggiornate dal punto di vista contestuale. Integra una componente di reperimento con un modello generativo, consentendo al sistema di cercare e recuperare informazioni rilevanti da un database o da una base di conoscenza per integrare la sua conoscenza interna quando genera le risposte.

Questo approccio garantisce che il modello di intelligenza artificiale possa fornire risposte basate sui fatti più attuali e affidabili e consente agli utenti di verificare le fonti delle informazioni utilizzate nelle risposte del modello. La RAG aiuta a fondare il modello di IA su fonti di conoscenza esterne, migliorando la qualità dei suoi risultati e fornendo un modo per aggiornare il modello senza la necessità di un'ampia riqualificazione.

La RAG è un'ottima strategia per mitigare le potenziali allucinazioni dei modelli di intelligenza artificiale generativa. La RAG aiuta a costruire un sistema di risposta alle domande che abbia il meglio dei due mondi: accuratezza dei fatti e risposte umane generate in linguaggio naturale.

Che cos'è la biblioteca dei trasformatori di frasi?

Trasformatori di frasi

La libreria Sentence Transformers è un potente framework Python progettato per l'incorporazione di testi all'avanguardia. Si basa su reti neurali trasformatrici come BERT, RoBERTa, XLM-R e altre, che consentono di ottenere le migliori prestazioni in diversi compiti, tra cui la ricerca semantica, l'estrazione di parafrasi, il confronto della similarità semantica, il clustering e altro ancora. Questa libreria permette una facile messa a punto dei metodi di incorporazione delle frasi, consentendo la creazione di incorporazioni di frasi specifiche per ogni compito, adatte a soddisfare esigenze specifiche. Per saperne di più, visitate il sito web di Sentence Transformers

La libreria offre un'ampia selezione di modelli Sentence Transformers pre-addestrati per oltre 50 lingue, disponibili sulla piattaforma Hugging Face. Gli utenti possono anche addestrare o perfezionare i propri modelli utilizzando la libreria, fornendo la flessibilità necessaria per creare modelli personalizzati per casi d'uso unici. Il team di Sentence Transformers ha recentemente rilasciato una nuova versione principale (v3) che migliora notevolmente le capacità di questa libreria, in particolare quelle di messa a punto.

La libreria Sentence Transformers è veloce, completa e ben curata, ed è per questo che la utilizziamo in questo tutorial.

Creare il proprio modello di ricerca semantica

Creare il proprio modello di ricerca semantica è un ottimo modo per ottenere risultati accurati e garantire una latenza molto bassa. Questo è ancora più vero se si implementa il proprio modello di ricerca semantica su una GPU.

Per prima cosa, creiamo un piccolo dataset contenente i nostri dati. Creare un file CSV a 1 colonna (chiamato "dataset.csv") contenente la seguente documentazione tecnica sulle stampanti HP (in uno scenario reale si vorranno includere molti più esempi, naturalmente):

"HP® LaserJets have unmatched printing speed, performance and reliability that you can trust. Enjoy Low Prices and Free Shipping when you buy now online."
"Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty)."
"HP LaserJet ; Lowest cost per page on mono laser printing. · $319.99 ; Wireless options available. · $109.00 ; Essential management features. · $209.00."

Ogni riga può contenere fino a 512 token (equivalenti a circa 400 parole) e per massimizzare l'accuratezza si consiglia di rimanere al di sotto di 128 token (equivalenti a circa 100 parole). Ora che abbiamo i nostri 3 documenti nel nostro set di dati, possiamo codificare i dati usando il nostro modello con Sentence Transformers. Creare uno script Python come segue (assicurarsi che PyTorch e Sentence Transformers siano installati).

from sentence_transformers import SentenceTransformer
import csv
import torch

model_name = 'paraphrase-multilingual-mpnet-base-v2'
encoded_model_path = 'semantic_search_model.pt'
dataset_path = 'dataset.csv'

bi_encoder = SentenceTransformer(model_name)

passages = []
with open(dataset_path) as csv_file:
    csv_reader = csv.reader(csv_file)
    for row in csv_reader:
        passages.append(row[0])
        
corpus_embeddings = bi_encoder.encode(
    passages, batch_size=32, convert_to_tensor=True, show_progress_bar=True)

torch.save(corpus_embeddings, encoded_model_path)

Questo script scarica e utilizza paraphrase-multilingual-mpnet-base-v2 come modello di base e lo usa per codificare i nostri dati. È possibile scegliere tra i molti modelli pre-addestrati disponibili, a seconda delle proprie esigenze (dimensioni del modello, caso d'uso, lingue supportate, ...). A seconda del vostro hardware, dovrete adattare il parametro "batch_size" per accelerare il processo di codifica.

Una volta creato, è possibile utilizzare il modello per l'inferenza con il seguente script Python:

import csv
from sentence_transformers import SentenceTransformer, util
import torch

bi_encoder = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')
semantic_search_model = torch.load('semantic_search_model.pt')

passages = []
with open('app/custom_model/dataset.csv') as csv_file:
    csv_reader = csv.reader(csv_file)
    for row in csv_reader:
        passages.append(row[0])

question_embedding = bi_encoder.encode(
    "How long is the warranty on the HP Color LaserJet Pro?", convert_to_tensor=True)
hits = util.semantic_search(
    question_embedding, semantic_search_model, top_k=3)
hits = hits[0]

result = {"search_results": [
    {"score": hit['score'], "text": passages[hit['corpus_id']]} for hit in hits]}

Lo script di inferenza di cui sopra restituisce i seguenti risultati:

{
"search_results": [
    {
        "score": 0.99,
        "text": "Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty)."
    },
    {
        "score": 0.74,
        "text": "All consumer PCs and printers come with a standard one-year warranty. Care packs provide an enhanced level of support and/or an extended period of coverage for your HP hardware. All commercial PCs and printers come with either a one-year or three-year warranty."
    },
    {
        "score": 0.68,
        "text": "In-warranty plan · Available in 2-, 3-, or 4-year extension plans · Includes remote problem diagnosis support and Next Business Day Exchange Service."
    },
    ]
}

Nel nostro script di inferenza, il parametro "top_k" determina il numero di risultati che vogliamo restituire. Nel risultato, mostriamo il testo corrispondente dal set di dati con un punteggio di confidenza. Questo punteggio è importante perché ci aiuta a decidere se accettare o meno la risposta.

Generare una risposta in linguaggio naturale con l'IA generativa

Come si può notare, il limite principale della ricerca semantica è che il modello restituisce il testo grezzo del dataset senza rispondere direttamente alla domanda. Vogliamo quindi fornire a un modello di intelligenza artificiale generativa un contesto per rispondere alla domanda iniziale in linguaggio naturale.

Possiamo ottenere facilmente questo risultato sfruttando un LLM avanzato come GPT-4 su OpenAI o LLaMA 3 e ChatDolphin su NLP Cloud. Si può decidere di mantenere il miglior risultato del modello di ricerca semantica e passarlo come contesto all'LLM, oppure di mantenere diversi risultati. Ecco un esempio immediato che utilizza solo il risultato migliore:

Context: Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty).
Based on the above context, answer the following question: How long is the warranty on the HP Color LaserJet Pro?

Questa richiesta restituisce qualcosa di simile:

The warranty on the HP Color LasertJet Pro lasts at least 1 year.

Modello di ricerca semantica con dati codificati VS memorizzazione delle incorporazioni in un database vettoriale

In un sistema di Retrieval-Augmented Generation (RAG), la creazione di un modello di ricerca semantica con dati locali codificati o l'utilizzo di un database vettoriale sono due opzioni interessanti.

Quando codifichiamo i nostri dati, li convertiamo in tensori e poi abbiamo la possibilità di caricarli su una GPU. D'altra parte, un database vettoriale è un database specializzato progettato per memorizzare, indicizzare e interrogare in modo efficiente questi vettori ad alta dimensione.

Per le aziende che desiderano ottenere latenze molto basse, è consigliabile codificare i propri dati e caricarli in una GPU per migliorare i tempi di calcolo. Tuttavia, ciò va a scapito della flessibilità, poiché i dati devono essere codificati nuovamente ogni volta che il set di dati cambia. Se i dati sottostanti cambiano molto frequentemente, potrebbe essere più semplice estrarre le incorporazioni e memorizzarle in modo incrementale in un database vettoriale (come PG Vector, ad esempio).

Conclusione

La Retrieval Augmented Generation è fondamentale per le aziende che vogliono rispondere a domande su dati specifici, come documentazione tecnica, contratti, ecc. Il RAG è un componente chiave di un chatbot di assistenza, ad esempio.

Sentence Transformers è un'ottima libreria che può essere utilizzata per creare il proprio modello di ricerca semantica basato sui propri dati. Se implementato su una GPU e abbinato a un modello di intelligenza artificiale generativa avanzata, questo modello si rivela estremamente potente.

Se non siete interessati a creare e distribuire da soli il vostro modello di ricerca semantica basato sui Sentence Transformers, potete farlo facilmente con un clic su NLP Cloud. Provate subito la ricerca semantica su NLP Cloud!

Se avete domande su RAG, sulla ricerca semantica e sui Sentence Transformers, non esitate a chiedercele, è sempre un piacere consigliarvi!

Julien
CTO di NLP Cloud