Seguici sui social

Intelligenza generale artificiale

Potenza dei reranker e recupero in due fasi per la generazione aumentata di recupero

mm
Recupero generazione aumentata

Quando si tratta di elaborazione del linguaggio naturale (NLP) e di recupero delle informazioni, la capacità di recuperare in modo efficiente e accurato le informazioni rilevanti è fondamentale. Mentre il campo continua ad evolversi, nuove tecniche e metodologie vengono sviluppate per migliorare le prestazioni dei sistemi di recupero, in particolare nel contesto di Recupero generazione aumentata (STRACCIO). Una di queste tecniche, nota come recupero in due fasi con reranker, è emersa come una potente soluzione per affrontare i limiti intrinseci dei metodi di recupero tradizionali.

In questo articolo discutiamo le complessità del recupero e del reranker in due fasi, esplorandone i principi sottostanti, le strategie di implementazione e i vantaggi che offrono nel migliorare l'accuratezza e l'efficienza dei sistemi RAG. Forniremo anche esempi pratici e frammenti di codice per illustrare i concetti e facilitare una comprensione più profonda di questa tecnica all'avanguardia.

Comprendere il recupero della generazione aumentata (RAG)

agente svedese LLM

Prima di immergerci nello specifico del recupero in due fasi e del reranking, rivisitiamo brevemente il concetto di Retrieval Augmented Generation (RAG). RAG è una tecnica che estende la conoscenza e le capacità dei modelli linguistici di grandi dimensioni (LLM) fornendo loro l'accesso a fonti di informazione esterne, come database o raccolte di documenti. Fare riferimento di più dall'articolo “Un approfondimento sulla generazione aumentata di recupero in LLM".

Il tipico processo RAG prevede i seguenti passaggi:

  1. domanda: Un utente pone una domanda o fornisce un'istruzione al sistema.
  2. Recupero: il sistema interroga un database vettoriale o una raccolta di documenti per trovare informazioni rilevanti per la query dell'utente.
  3. aumentare: le informazioni recuperate vengono combinate con la query o l'istruzione originale dell'utente.
  4. Generazione: Il modello linguistico elabora l'input aumentato e genera una risposta, sfruttando le informazioni esterne per migliorare l'accuratezza e la completezza del suo output.

Sebbene il RAG abbia dimostrato di essere una tecnica potente, non è priva di sfide. Uno dei problemi chiave risiede nella fase di recupero, in cui i metodi di recupero tradizionali potrebbero non riuscire a identificare i documenti più rilevanti, portando a risposte non ottimali o imprecise da parte del modello linguistico.

La necessità di recupero e riclassificazione in due fasi

I metodi di recupero tradizionali, come quelli basati sulla corrispondenza delle parole chiave o sui modelli di spazio vettoriale, spesso hanno difficoltà a catturare le relazioni semantiche sfumate tra query e documenti. Questa limitazione può comportare il recupero di documenti che sono solo superficialmente rilevanti o che mancano informazioni cruciali che potrebbero migliorare significativamente la qualità della risposta generata.

Per affrontare questa sfida, ricercatori e professionisti si sono rivolti al recupero in due fasi con i reranker. Questo approccio prevede un processo in due fasi:

  1. Recupero iniziale: nella prima fase, un insieme relativamente ampio di documenti potenzialmente rilevanti viene recuperato utilizzando un metodo di recupero rapido ed efficiente, come un modello di spazio vettoriale o una ricerca basata su parole chiave.
  2. Riclassificazione: nella seconda fase, viene utilizzato un modello di riclassificazione più sofisticato per riordinare i documenti inizialmente recuperati in base alla loro rilevanza per la query, portando di fatto i documenti più rilevanti in cima all'elenco.

Il modello di riclassificazione, spesso una rete neurale o un'architettura basata su trasformatore, è specificamente addestrato per valutare la pertinenza di un documento rispetto a una determinata query. Sfruttando le capacità avanzate di comprensione del linguaggio naturale, il reranker può catturare le sfumature semantiche e le relazioni contestuali tra la query e i documenti, ottenendo una classificazione più accurata e pertinente.

Vantaggi del recupero in due fasi e del reranker

L'adozione del recupero in due fasi con reranker offre numerosi vantaggi significativi nel contesto dei sistemi RAG:

  1. Migliore precisione: Riclassificando i documenti inizialmente recuperati e promuovendo quelli più rilevanti in alto, il sistema può fornire informazioni più accurate e precise al modello linguistico, portando a risposte generate di qualità superiore.
  2. Problemi fuori dominio mitigati: I modelli di incorporamento utilizzati per il recupero tradizionale sono spesso addestrati su corpora di testo di uso generale, che potrebbero non catturare adeguatamente il linguaggio e la semantica specifici del dominio. I modelli di riclassificazione, d’altro canto, possono essere addestrati su dati specifici del dominio, mitigando il problema “fuori dominio” e migliorando la pertinenza dei documenti recuperati all’interno di domini specializzati.
  3. Scalabilità: L'approccio a due fasi consente una scalabilità efficiente sfruttando metodi di recupero rapidi e leggeri nella fase iniziale, riservando al contempo il processo di riclassificazione più intensivo dal punto di vista computazionale per un sottoinsieme più piccolo di documenti.
  4. Flessibilità: i modelli di riclassificazione possono essere scambiati o aggiornati indipendentemente dal metodo di recupero iniziale, garantendo flessibilità e adattabilità alle esigenze in evoluzione del sistema.

ColBERT: interazione tardiva efficiente ed efficace

Uno dei modelli di spicco nel campo del riclassificazione è ColBERT (Interazione tardiva contestualizzata su BERT). ColBERT è un modello di riclassificazione dei documenti che sfrutta le capacità di comprensione profonda del linguaggio di BERT introducendo al contempo un nuovo meccanismo di interazione noto come "interazione tardiva".

ColBERT: ricerca di passaggi efficiente ed efficace tramite l'interazione tardiva contestualizzata su BERT

ColBERT: ricerca di passaggi efficiente ed efficace tramite l'interazione tardiva contestualizzata su BERT

Il meccanismo di interazione tardiva in ColBERT consente un recupero efficiente e preciso elaborando query e documenti separatamente fino alle fasi finali del processo di recupero. Nello specifico, ColBERT codifica in modo indipendente la query e il documento utilizzando BERT, quindi utilizza una fase di interazione leggera ma potente che modella la loro somiglianza a grana fine. Ritardando ma mantenendo questa interazione a grana fine, ColBERT può sfruttare l'espressività dei modelli linguistici profondi e contemporaneamente acquisire la capacità di precalcolare le rappresentazioni dei documenti offline, accelerando notevolmente l'elaborazione delle query.

L'architettura di interazione tardiva di ColBERT offre numerosi vantaggi, tra cui una migliore efficienza computazionale, scalabilità con le dimensioni della raccolta di documenti e applicabilità pratica per scenari del mondo reale. Inoltre, ColBERT è stato ulteriormente migliorato con tecniche come la supervisione denoizzata e la compressione residua (in ColBERTv2), che perfezionano il processo di addestramento e riducono l'ingombro spaziale del modello pur mantenendo un'elevata efficacia di recupero.

Questo frammento di codice dimostra come configurare e utilizzare il modello jina-colbert-v1-en per indicizzare una raccolta di documenti, sfruttando la sua capacità di gestire contesti lunghi in modo efficiente.

Implementazione del recupero in due fasi con Rerankers

Ora che abbiamo compreso i principi alla base del recupero in due fasi e del reranking, esploriamo la loro implementazione pratica nel contesto di un sistema RAG. Sfrutteremo le librerie e i framework più diffusi per dimostrare l'integrazione di queste tecniche.

Impostare l'ambiente

Prima di immergerci nel codice, impostiamo il nostro ambiente di sviluppo. Utilizzeremo Python e diverse librerie NLP popolari, tra cui Hugging Face Transformers, Sentence Transformers e LanceDB.

# Install required libraries
!pip install datasets huggingface_hub sentence_transformers lancedb

Preparazione dei dati

A scopo dimostrativo, utilizzeremo il set di dati "ai-arxiv-chunked" di Hugging Face Datasets, che contiene oltre 400 documenti ArXiv sull'apprendimento automatico, sull'elaborazione del linguaggio naturale e su modelli linguistici di grandi dimensioni.

from datasets import load_dataset

dataset = load_dataset("jamescalam/ai-arxiv-chunked", split="train")

<pre>

Successivamente, preelaboreremo i dati e li divideremo in parti più piccole per facilitare il recupero e l'elaborazione efficienti.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

def chunk_text(text, chunk_size=512, overlap=64):
tokens = tokenizer.encode(text, return_tensors="pt", truncation=True)
chunks = tokens.split(chunk_size - overlap)
texts = [tokenizer.decode(chunk) for chunk in chunks]
return texts

chunked_data = []
for doc in dataset:
text = doc["chunk"]
chunked_texts = chunk_text(text)
chunked_data.extend(chunked_texts)

Per la fase di recupero iniziale, utilizzeremo un modello Sentence Transformer per codificare i nostri documenti e query in rappresentazioni vettoriali dense, quindi eseguiremo una ricerca approssimativa del vicino più vicino utilizzando un database vettoriale come LanceDB.
from sentence_transformers import SentenceTransformer
from lancedb import lancedb

# Load Sentence Transformer model
model = SentenceTransformer('all-MiniLM-L6-v2')

# Create LanceDB vector store
db = lancedb.lancedb('/path/to/store')
db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())

# Index documents
for text in chunked_data:
vector = model.encode(text).tolist()
db.insert_document('docs', vector, text)

from sentence_transformers import SentenceTransformer
from lancedb import lancedb

# Load Sentence Transformer model
model = SentenceTransformer('all-MiniLM-L6-v2')

# Create LanceDB vector store
db = lancedb.lancedb('/path/to/store')
db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())

# Index documents
for text in chunked_data:
vector = model.encode(text).tolist()
db.insert_document('docs', vector, text)

Con i nostri documenti indicizzati, possiamo eseguire il recupero iniziale trovando i vicini più vicini a un dato vettore di query.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

def chunk_text(text, chunk_size=512, overlap=64):
tokens = tokenizer.encode(text, return_tensors="pt", truncation=True)
chunks = tokens.split(chunk_size - overlap)
texts = [tokenizer.decode(chunk) for chunk in chunks]
return texts

chunked_data = []
for doc in dataset:
text = doc["chunk"]
chunked_texts = chunk_text(text)
chunked_data.extend(chunked_texts)

Riclassificazione

Dopo il recupero iniziale, utilizzeremo un modello di riclassificazione per riordinare i documenti recuperati in base alla loro rilevanza per la query. In questo esempio utilizzeremo il riranker ColBERT, un modello veloce e accurato basato su trasformatore progettato specificamente per il ranking dei documenti.

from lancedb.rerankers import ColbertReranker

reranker = ColbertReranker()

# Rerank initial documents
reranked_docs = reranker.rerank(query, initial_docs)

La sezione Currents, dedicata a opere audaci e innovative di artisti emergenti e affermati, include la prima statunitense di Mare’s Nest di Ben Rivers, descritto come “un enigmatico road movie ambientato in un mondo post-apocalittico governato da bambini”. Tra gli altri titoli spiccano Dracula di Radu Jude e With Hasan in Gaza di Kamal Aljafari. reranked_docs L'elenco ora contiene i documenti riordinati in base alla loro rilevanza per la query, come determinato dal riclassificazione ColBERT.

Aumento e generazione

Con i documenti riclassificati e rilevanti in mano, possiamo procedere alle fasi di potenziamento e generazione della pipeline RAG. Utilizzeremo un modello linguistico dalla libreria Hugging Face Transformers per generare la risposta finale.

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

tokenizer = AutoTokenizer.from_pretrained("t5-base")
model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")

# Augment query with reranked documents
augmented_query = query + " " + " ".join(reranked_docs[:3])

# Generate response from language model
input_ids = tokenizer.encode(augmented_query, return_tensors="pt")
output_ids = model.generate(input_ids, max_length=500)
response = tokenizer.decode(output_ids[0], skip_special_tokens=True)

print(response)

Nello snippet di codice sopra, aumentiamo la query originale con i primi tre documenti riclassificati, creando un augmented_query. Passiamo quindi questa query aumentata a un modello linguistico T5, che genera una risposta in base al contesto fornito.

La sezione Currents, dedicata a opere audaci e innovative di artisti emergenti e affermati, include la prima statunitense di Mare’s Nest di Ben Rivers, descritto come “un enigmatico road movie ambientato in un mondo post-apocalittico governato da bambini”. Tra gli altri titoli spiccano Dracula di Radu Jude e With Hasan in Gaza di Kamal Aljafari. response la variabile conterrà l'output finale, sfruttando le informazioni esterne dai documenti recuperati e riclassificati per fornire una risposta più accurata e completa alla query originale.

Tecniche avanzate e considerazioni

Sebbene l'implementazione di cui abbiamo parlato fornisca una solida base per l'integrazione del recupero in due fasi e del riranking in un sistema RAG, esistono diverse tecniche e considerazioni avanzate che possono migliorare ulteriormente le prestazioni e la robustezza dell'approccio.

  1. Espansione della query: per migliorare la fase di recupero iniziale, è possibile utilizzare tecniche di espansione della query, che comportano l'ampliamento della query originale con termini o frasi correlati. Ciò può aiutare a recuperare un insieme più diversificato di documenti potenzialmente rilevanti.
  2. Riclassificazione dell'ensemble: invece di fare affidamento su un singolo modello di riclassificazione, puoi combinare più riclassificatori in un insieme, sfruttando i punti di forza di diversi modelli per migliorare le prestazioni complessive.
  3. Ottimizzazione dei riranker: Sebbene i modelli di riclassificazione pre-addestrati possano essere efficaci, ottimizzarli su dati specifici del dominio può migliorare ulteriormente la loro capacità di acquisire semantica specifica del dominio e segnali di pertinenza.
  4. Recupero iterativo e riclassificazione: in alcuni casi, una singola iterazione di recupero e riclassificazione potrebbe non essere sufficiente. Puoi esplorare approcci iterativi, in cui l'output del modello linguistico viene utilizzato per perfezionare il processo di query e recupero, portando a un sistema più interattivo e dinamico.
  5. Bilanciare rilevanza e diversità: Sebbene i reranker mirano a promuovere i documenti più rilevanti, è essenziale trovare un equilibrio tra rilevanza e diversità. Incorporare tecniche di promozione della diversità può aiutare a evitare che il sistema sia eccessivamente ristretto o parziale nelle sue fonti di informazione.
  6. Metriche di valutazione: per valutare l'efficacia del tuo approccio di recupero e riclassificazione in due fasi, dovrai definire metriche di valutazione appropriate. Questi possono includere metriche tradizionali di recupero delle informazioni come precisione, richiamo e rango reciproco medio (MRR), nonché metriche specifiche per attività personalizzate in base al caso d'uso.

Conclusione

Il Retrieval Augmented Generation (RAG) è emerso come una potente tecnica per migliorare le capacità di modelli linguistici di grandi dimensioni sfruttando fonti di informazione esterne. Tuttavia, i metodi di recupero tradizionali spesso hanno difficoltà a identificare i documenti più rilevanti, con conseguenti prestazioni non ottimali.

Il recupero in due fasi con reranker offre una soluzione convincente a questa sfida. Combinando una fase iniziale di recupero rapido con un modello di riclassificazione più sofisticato, questo approccio può migliorare significativamente l'accuratezza e la pertinenza dei documenti recuperati, portando in definitiva a risposte generate di qualità superiore dal modello linguistico.

Ho trascorso gli ultimi cinque anni immergendomi nell'affascinante mondo del Machine Learning e del Deep Learning. La mia passione e competenza mi hanno portato a contribuire a oltre 50 diversi progetti di ingegneria del software, con un focus particolare su AI/ML. La mia continua curiosità mi ha anche attirato verso l'elaborazione del linguaggio naturale, un campo che non vedo l'ora di esplorare ulteriormente.