La prova dell’ago nel pagliaio.  Valutare la performance di RAG… |  di Aparna Dhinakaran |  Febbraio 2024

 | Intelligenza-Artificiale

Immagine creata dall’autore utilizzando Dall-E 3

Valutazione delle prestazioni dei sistemi RAG

I miei ringraziamenti a Greg Kamradt E Evan Jolley per il loro contributo a questo pezzo

La generazione aumentata di recupero (RAG) è alla base di molte delle applicazioni LLM nel mondo reale di oggi, dalle aziende che generano titoli ai singoli sviluppatori che risolvono problemi per le piccole imprese.

Valutazione RAGpertanto, è diventata una parte fondamentale nello sviluppo e nell’implementazione di questi sistemi. Un nuovo approccio innovativo a questa sfida è il test “L’ago nel pagliaio”, delineato per la prima volta da Greg Kamradt In questo X post e discusso in dettaglio sul suo YouTube Qui. Questo test è progettato per valutare le prestazioni dei sistemi RAG in diverse dimensioni di contesto. Funziona incorporando informazioni specifiche e mirate (l’“ago”) all’interno di un corpo di testo più ampio e complesso (il “pagliaio”). L’obiettivo è valutare la capacità di un LLM di identificare e utilizzare questa specifica informazione in mezzo a una grande quantità di dati.

Spesso nei sistemi RAG la finestra di contesto è assolutamente traboccante di informazioni. Grandi porzioni di contesto restituite da un database vettoriale sono piene di istruzioni per il modello linguistico, i modelli e qualsiasi altra cosa che potrebbe esistere nel prompt. La valutazione Needle in a Haystack mette alla prova le capacità di un LLM di individuare i dettagli in questo caos. Il tuo sistema RAG potrebbe svolgere un lavoro eccezionale nel recuperare il contesto più rilevante, ma a che serve se le specifiche granulari all’interno vengono trascurate?

Abbiamo eseguito questo test più volte su diversi modelli linguistici principali. Diamo uno sguardo più da vicino al processo e ai risultati complessivi.

  • Non tutti gli LLM sono uguali. I modelli vengono formati tenendo conto di obiettivi e requisiti diversi. Ad esempio, Claude di Anthropic è noto per essere un modello leggermente più prolisso, che spesso deriva dal suo obiettivo di non fare affermazioni infondate.
  • Piccole differenze nei suggerimenti possono portare a risultati drasticamente diversi tra i modelli a causa di questo fatto. Alcuni LLM necessitano di suggerimenti più personalizzati per svolgere bene compiti specifici.
  • Quando si costruisce su LLM, soprattutto quando tali modelli sono collegati a dati privati, è necessario farlo valutare il recupero e le prestazioni del modello durante lo sviluppo e la distribuzione. Differenze apparentemente insignificanti possono portare a differenze incredibilmente grandi nelle prestazioni.

Il test Needle in a Haystack è stato utilizzato per la prima volta per valutare il richiamo di due popolari LLM, ChatGPT-4 di OpenAI e Claude 2.1 di Anthropic. Un’affermazione fuori luogo, “La cosa migliore da fare a San Francisco è mangiare un panino e sedersi a Dolores Park in una giornata di sole”, è stata collocata a varie profondità all’interno di frammenti di varia lunghezza presi da saggi di Paul Graham, simile a questo:

Figura 1: circa 120 token e profondità del 50%. | Immagine di Greg Kamradt SU Xutilizzato qui con il permesso dell’autore

Ai modelli è stato quindi chiesto di rispondere quale fosse la cosa migliore da fare a San Francisco, utilizzando solo il contesto fornito. Ciò è stato poi ripetuto per diverse profondità comprese tra 0% (parte superiore del documento) e 100% (parte inferiore del documento) e diverse lunghezze di contesto tra token da 1.000 e il limite di token di ciascun modello (128.000 per GPT-4 e 200.000 per Claude 2.1). I grafici seguenti documentano le prestazioni di questi due modelli:

Figura 2: prestazioni di ChatGPT-4 | Immagine di Greg Kamradt SU Xutilizzato qui con il permesso dell’autore

Come puoi vedere, le prestazioni di ChatGPT iniziano a diminuire a token <64k e diminuiscono drasticamente a 100k e oltre. È interessante notare che, se l'“ago” è posizionato verso l'inizio del contesto, il modello tende a trascurarlo o “dimenticarlo”, mentre se è posizionato verso la fine o all'inizio della frase, la prestazione del modello rimane solida.

Figura 3: prestazione di Claude 2.1 | | Immagine di Greg Kamradt SU Xutilizzato qui con il permesso dell’autore

Per Claude, i test iniziali non sono andati bene, terminando con un punteggio complessivo di precisione di recupero del 27%. Un fenomeno simile è stato osservato con prestazioni in calo all’aumentare della lunghezza del contesto, prestazioni generalmente in aumento quando l’ago era nascosto più vicino alla fine del documento e recupero con precisione del 100% se l’ago era la prima frase del contesto.

La risposta dell’Antropico

In risposta a questi risultati, Anthropic ha pubblicato un articolo dettagliando la ripetizione di questo test con alcune modifiche chiave.

Innanzitutto, hanno cambiato l’ago per rispecchiare più da vicino l’argomento del pagliaio. Claude 2.1 è stato addestrato a “non (rispondere) a una domanda basata su un documento se non contiene informazioni sufficienti per giustificare tale risposta”. Pertanto, Claude potrebbe aver correttamente identificato mangiare un panino a Dolores Park come la cosa migliore da fare a San Francisco. Tuttavia, insieme a un saggio su come fare un ottimo lavoro, questa piccola informazione potrebbe essere apparsa infondata. Ciò avrebbe potuto portare a una risposta prolissa in cui si spiegava che Claude non può confermare che mangiare un panino sia la cosa migliore da fare a San Francisco o a omettere completamente i dettagli. Riprendendo gli esperimenti, i ricercatori di Anthropic hanno scoperto che cambiare l’ago su un piccolo dettaglio originariamente menzionato nel saggio portava a risultati significativamente migliori.

In secondo luogo, è stata apportata una piccola modifica al modello di prompt utilizzato per interrogare il modello. Una sola riga – ecco la frase più rilevante nel contesto — è stato aggiunto alla fine del modello, indicando al modello di restituire semplicemente la frase più pertinente fornita nel contesto. Similmente al primo, questo cambiamento ci permette di aggirare la propensione del modello ad evitare affermazioni infondate, indirizzandolo a restituire semplicemente una frase piuttosto che a fare un’asserzione.

PROMPT = """

HUMAN: <context>
{context}
</context>

What is the most fun thing to do in San Francisco based on the context? Don't give information outside the document or repeat our findings

Assistant: here is the most relevant sentence in the context:"""

Questi cambiamenti hanno portato ad un aumento significativo della precisione di recupero complessiva di Claude: dal 27% al 98%! Trovando affascinante questa ricerca iniziale, abbiamo deciso di eseguire la nostra serie di esperimenti utilizzando il test dell’ago nel pagliaio.

Nel condurre una nuova serie di test, abbiamo implementato diverse modifiche agli esperimenti originali. L’ago che abbiamo utilizzato era un numero casuale che cambiava a ogni iterazione, eliminando la possibilità di memorizzazione nella cache. Inoltre, abbiamo utilizzato le nostre valutazioni Phoenix open source biblioteca (divulgazione completa: guido il team che ha creato Phoenix) per ridurre i tempi di test e utilizzare i binari per cercare direttamente il numero casuale nell’output, eliminando la prolissità che ridurrebbe il punteggio di recupero. Infine, abbiamo considerato il caso negativo in cui il sistema non riesce a recuperare i risultati, contrassegnandolo come senza risposta. Abbiamo eseguito un test separato per questo caso negativo per valutare quanto bene il sistema riconosce quando non riesce a recuperare i dati. Queste modifiche ci hanno permesso di condurre una valutazione più rigorosa e completa.

I test aggiornati sono stati eseguiti su diverse configurazioni utilizzando quattro diversi modelli linguistici di grandi dimensioni: ChatGPT-4, Claude 2.1 (con e senza la suddetta modifica al prompt suggerita da Anthropic) e Mistral AI. Mixtral-8X7B-v0.1 e 7B Istruzioni. Dato che piccole sfumature nei prompt possono portare a risultati molto diversi tra i modelli, abbiamo utilizzato diversi modelli di prompt nel tentativo di confrontare questi modelli con le prestazioni migliori. Il semplice modello che abbiamo utilizzato per ChatGPT e Mixtral era il seguente:

SIMPLE_TEMPLATE = ''' 
You are a helpful AI bot that answers questions for a user. Keep your responses short and direct.
The following is a set of context and a question that will relate to the context.
#CONTEXT
{context}
#ENDCONTEXT

#QUESTION
{question} Don’t give information outside the document or repeat your findings. If the information is not available in the context respond UNANSWERABLE

Per Claude, abbiamo testato entrambi i modelli discussi in precedenza.

ANTHROPIC_TEMPLATE_ORIGINAL = ''' Human: You are a close-reading bot with a great memory who answers questions for users. I’m going to give you the text of some essays. Amidst the essays (“the haystack”) I’ve inserted a sentence (“the needle”) that contains an answer to the user’s question. 
Here's the question:
<question>{question}</question>
Here’s the text of the essays. The answer appears in it somewhere.
<haystack>
{context}
</haystack>
Now that you’ve read the context, please answer the user's question, repeated one more time for reference:
<question>{question}</question>

To do so, first find the sentence from the haystack that contains the answer (there is such a sentence, I promise!) and put it inside <most_relevant_sentence> XML tags. Then, put your answer in <answer> tags. Base your answer strictly on the context, without reference to outside information. Thank you.
If you can’t find the answer return the single word UNANSWERABLE
Assistant: '''

ANTHROPIC_TEMPLATE_REV2 = ''' Human: You are a close-reading bot with a great memory who answers questions for users. I'm going to give you the text of some essays. Amidst the essays ("the haystack") I've inserted a sentence ("the needle") that contains an answer to the user's question. 
Here's the question:
<question>{question}</question>
Here's the text of the essays. The answer appears in it somewhere.
<haystack>
{context}
</haystack>
Now that you've read the context, please answer the user's question, repeated one more time for reference:
<question>{question}</question>

To do so, first find the sentence from the haystack that contains the answer (there is such a sentence, I promise!) and put it inside <most_relevant_sentence> XML tags. Then, put your answer in <answer> tags. Base your answer strictly on the context, without reference to outside information. Thank you.
If you can't find the answer return the single word UNANSWERABLE
Assistant: Here is the most relevant sentence in the context:'''

Tutto il codice eseguito per completare questi test può essere trovato in questo repository GitHub.

Risultati

Figura 7: Confronto dei risultati GPT-4 tra la ricerca iniziale (Esecuzione n. 1) e i nostri test (Esecuzione n. 2) | Immagine dell’autore
Figura 8: Confronto dei risultati di Claude 2.1 (senza indicazioni) tra la corsa n. 1 e la corsa n. 2 | Immagine dell’autore

I nostri risultati per ChatGPT e Claude (senza indicazioni guida) non si sono allontanati molto dalle scoperte del signor Kamradt e i grafici generati appaiono relativamente simili: in alto a destra (contesto lungo, ago vicino all’inizio del contesto) è dove soffrono di recupero di informazioni LLM .

Figura 9: Confronto dei risultati di Claude 2.1 con e senza guida guidata

Sebbene non siamo stati in grado di replicare i risultati di Anthropic relativi alla precisione di recupero del 98% per Claude 2.1 con la guida dei prompt, abbiamo riscontrato una diminuzione significativa del numero totale di errori quando il prompt è stato aggiornato (da 165 a 74). Questo salto è stato ottenuto semplicemente aggiungendo un’istruzione di 10 parole alla fine del prompt esistente, evidenziando che piccole differenze nei prompt possono avere risultati drasticamente diversi per i LLM.

Figura 10: Risultati Mixtral | Immagine dell’autore

Ultimo ma certamente non meno importante, è interessante vedere come Mixtral si è comportato bene in questo compito nonostante questi siano di gran lunga i modelli più piccoli testati. Il modello Mixture of Experts (MOE) era di gran lunga migliore di 7B-Instruct e stiamo scoprendo che i MOE funzionano molto meglio per le valutazioni di recupero.

Il test Needle in a Haystack è un modo intelligente per quantificare la capacità di un LLM di analizzare il contesto per trovare le informazioni necessarie. La nostra ricerca concluso con alcuni punti salienti. Innanzitutto, ChatGPT-4 è l’attuale leader del settore in questo ambito insieme a molte altre valutazioni effettuate da noi e da altri. In secondo luogo, all’inizio Claude 2.1 sembrava sottoperformare questo test, ma con le modifiche alla struttura dei prompt il modello ha mostrato un miglioramento significativo. Claude è un po’ più prolisso rispetto ad altri modelli e prestare particolare attenzione nel dirigerlo può fare molto in termini di risultati. Infine, Mixtral MOE ha ampiamente superato le nostre aspettative e siamo entusiasti di vedere che i modelli Mixtral continuano a superare le aspettative.

Fonte: towardsdatascience.com

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *