Valutare le applicazioni RAG con le RAGAs

Esaminare le App RAG con le RAGAs

Un framework con metriche e dati generati da LLM per valutare le prestazioni del tuo pipeline di generazione arricchita tramite recupero

Dashboard delle prestazioni stilizzate per la generazione arricchita tramite recupero

Ormai sappiamo che costruire una prova di concetto per un’applicazione di generazione arricchita tramite recupero (RAG) è facile, ma renderla pronta per la produzione è molto difficile. Ottenere le prestazioni del pipeline RAG a un livello soddisfacente è particolarmente difficile a causa dei diversi componenti in un pipeline RAG:

  • Componente Retrieval: recupera contesti aggiuntivi da un database esterno per l’LLM per rispondere alla query.
  • Componente Generator: genera una risposta basata su un prompt arricchito con le informazioni recuperate.

Nella valutazione di un pipeline RAG, è necessario valutare separatamente sia i componenti che insieme per capire se e dove il pipeline RAG ha ancora bisogno di miglioramenti. Inoltre, per capire se le prestazioni dell’applicazione RAG stanno migliorando, è necessario valutarle quantitativamente. Per questo, avrai bisogno di due ingredienti: una metrica di valutazione e un dataset di valutazione.

Attualmente, trovare le metriche di valutazione adatte e raccogliere buoni dati di validazione è un campo di ricerca attivo. Poiché si tratta di un argomento in rapida evoluzione, stiamo assistendo all’apparizione di vari approcci per i framework di valutazione RAG, come la Triade di metriche RAG, ROUGE, ARES, BLUE e RAGAs [1]. Questo articolo si concentrerà su come puoi valutare un pipeline RAG utilizzando RAGAs [1].

Cos’è RAGAs

RAGAs (Valutazione della generazione arricchita tramite recupero) è un framework (GitHub, Docs) che fornisce gli ingredienti necessari per aiutarti a valutare il tuo pipeline RAG a livello di componente.

Dati di valutazione

Ciò che è interessante di RAGAs è che è iniziato come un framework per la valutazione “senza riferimento” [1]. Ciò significa che, invece di dover fare affidamento su etichette di verità di riferimento annotate dall’uomo nel dataset di valutazione, RAGAs sfrutta gli LLM in modo integrale per condurre le valutazioni.

Per valutare il pipeline RAG, RAGAs si aspetta le seguenti informazioni:

  • domanda: la query dell’utente che è l’input del pipeline RAG. Input.
  • risposta: la risposta generata dal pipeline RAG. Output.
  • contesti: i contesti recuperati dalla fonte di conoscenza esterna utilizzati per rispondere alla domanda.
  • ground_truths: la risposta di verità obiettiva alla domanda. Questa è l’unica informazione annotata dall’uomo. Questa informazione è richiesta solo per la metrica context_recall (vedi Metriche di valutazione).

Sfruttare gli LLM per la valutazione senza riferimento è un argomento di ricerca attivo. Sebbene l’utilizzo del minor numero possibile di dati annotati dall’uomo renda il metodo di valutazione più conveniente e veloce, vi è ancora qualche discussione sui suoi svantaggi, come il bias [3]. Tuttavia, alcuni articoli hanno già mostrato risultati promettenti [4]. Per informazioni dettagliate, consulta la sezione “Lavoro correlato” del documento RAGAs [1].

Si noti che il framework si è ampliato per fornire metriche e paradigmi che richiedono etichette di ground truth (ad esempio, context_recall e answer_correctness, vedi Metriche di valutazione).

Inoltre, il framework mette a disposizione strumenti per la generazione automatica di dati di test.

Metriche di valutazione

I RAGAs ti forniscono alcune metriche per valutare in modo component-wise e end-to-end un componente di pipeline RAG.

A livello di componente, i RAGAs ti forniscono metriche per valutare separatamente il componente di recupero (context_relevancy e context_recall) e il componente generativo (faithfulness e answer_relevancy) [2]:

  • Precisione del contesto misura il rapporto segnale/rumore del contesto recuperato. Questa metrica viene calcolata utilizzando la domanda e i contesti.
  • Recall del contesto misura se tutte le informazioni rilevanti necessarie per rispondere alla domanda sono state recuperate. Questa metrica viene calcolata in base al ground_truth (questa è l’unica metrica nel framework che si basa su etichette di ground truth annotate da umani) e ai contesti.
  • Fedeltà misura l’accuratezza fattuale della risposta generata. Il numero di affermazioni corrette dai contesti forniti è diviso per il numero totale di affermazioni nella risposta generata. Questa metrica utilizza la domanda, i contesti e la risposta.
  • Rilevanza della risposta misura quanto la risposta generata sia pertinente alla domanda. Questa metrica viene calcolata utilizzando la domanda e la risposta. Ad esempio, la risposta “La Francia si trova in Europa occidentale” alla domanda “Dove si trova la Francia e qual è la sua capitale?” otterrebbe una bassa rilevanza della risposta perché risponde solo a metà della domanda.

Tutte le metriche sono scalate nell’intervallo [0, 1], con valori più alti che indicano una migliore performance.

I RAGAs forniscono anche metriche per valutare l’intera pipeline RAG end-to-end, come la similitudine semantica delle risposte e la correttezza delle risposte. Questo articolo si concentra sulle metriche a livello di componente.

Valutazione di un’applicazione RAG con RAGAs

In questa sezione si utilizzano i RAGAs per valutare una pipeline RAG minima per mostrarti come utilizzare i RAGAs e darti un’intuizione sulle sue metriche di valutazione.

Prerequisiti

Assicurati di avere installati i pacchetti Python necessari:

  • langchain, openai e weaviate-client per la pipeline RAG
  • ragas per valutare la pipeline RAG
#!pip install langchain openai weaviate-client ragas

Inoltre, definisci le tue variabili d’ambiente rilevanti in un file .env nella tua directory principale. Per ottenere una chiave API OpenAI, devi avere un account OpenAI e quindi “Crea nuova chiave segreta” sotto API keys.

OPENAI_API_KEY="<LA_TUA_OPENAI_API_KEY>"

Configurazione dell’applicazione RAG

Prima di poter valutare la tua applicazione RAG, è necessario configurarla. Utilizzeremo una pipeline RAG di base. Questa sezione sarà breve poiché utilizzeremo la stessa configurazione descritta in dettaglio nell’articolo seguente.

Generatione supportata da recupero (Retrieval-Augmented Generation, RAG): dalla teoria all’implentazione di LangChain

Dalla teoria dell’articolo accademico originale alla sua implementazione in Python con OpenAI, Weaviate e LangChain

towardsdatascience.com

Prima di tutto, devi preparare i dati caricando e suddividendo i documenti.

import requestsfrom langchain.document_loaders import TextLoaderfrom langchain.text_splitter import CharacterTextSplitterurl = "https://raw.githubusercontent.com/langchain-ai/langchain/master/docs/docs/modules/state_of_the_union.txt"res = requests.get(url)with open("state_of_the_union.txt", "w") as f:    f.write(res.text)# Carica i datidataloader = TextLoader('./state_of_the_union.txt')documents = loader.load()# Suddividi i datitext_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)chunks = text_splitter.split_documents(documents)

In seguito, genera i vettori di embedding per ogni suddivisione utilizzando il modello di embedding di OpenAI e memorizzali nel database dei vettori.

from langchain.embeddings import OpenAIEmbeddingsfrom langchain.vectorstores import Weaviateimport weaviatefrom weaviate.embedded import EmbeddedOptionsfrom dotenv import load_dotenv,find_dotenv# Carica la chiave API di OpenAI dal file .envload_dotenv(find_dotenv())# Configura il database dei vettoriclient = weaviate.Client(  embedded_options = EmbeddedOptions())# Popola il database dei vettorivectorstore = Weaviate.from_documents(    client = client,        documents = chunks,    embedding = OpenAIEmbeddings(),    by_text = False)# Definisci il vectorstore come retriever per abilitare la ricerca semanticaretriever = vectorstore.as_retriever()

Infine, configura un template di prompt e il modello di linguaggio naturale (LLM) di OpenAI e combinale con il componente retriever in una pipeline RAG.

from langchain.chat_models import ChatOpenAIfrom langchain.prompts import ChatPromptTemplatefrom langchain.schema.runnable import RunnablePassthroughfrom langchain.schema.output_parser import StrOutputParser# Definisci il LLMllm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)# Definisci il template del prompttemplate = """Sei un assistente per compiti di domanda e risposta. Utilizza i seguenti frammenti di contesto recuperato per rispondere alla domanda. Se non conosci la risposta, puoi dire di non saperlo. Utilizza al massimo due frasi e mantieni la risposta concisa.Domanda: {question} Contesto: {context} Risposta:"""prompt = ChatPromptTemplate.from_template(template)# Configura la pipeline RAGrag_chain = (    {"contest": retriever,  "domanda": RunnablePassthrough()}     | prompt     | llm    | StrOutputParser() )

Preparazione dei dati di valutazione

Poiché RAGAs si propone come un framework di valutazione senza riferimenti, le preparazioni richieste per il set di dati di valutazione sono minime. Dovrai preparare coppie di domande e ground_truths da cui potrai ricavare le informazioni rimanenti tramite inferenza, come mostrato di seguito:

from datasets import Datasetquestions = ["Cosa ha detto il presidente riguardo al giudice Breyer?",              "Cosa ha detto il presidente riguardo al CEO di Intel?",             "Cosa ha detto il presidente riguardo alla violenza armata?",            ]ground_truths = [["Il presidente ha dichiarato che il giudice Breyer ha dedicato la sua vita al servizio del paese e lo ha ringraziato per il suo servizio."],                ["Il presidente ha dichiarato che Pat Gelsinger è pronto ad aumentare gli investimenti di Intel a $100 miliardi."],                ["Il presidente ha chiesto al Congresso di adottare misure comprovate per ridurre la violenza armata."]]answers = []contexts = []# Inferenzaper query in questions:  answers.append(rag_chain.invoke(query))  contexts.append([docs.page_content for docs in retriever.get_relevant_documents(query)])# Converti in dictdata = {    "domanda": questions,    "risposta": answers,    "contesti": contexts,    "ground_truths": ground_truths}# Converti in datasetdataset = Dataset.from_dict(data)

Se non sei interessato alla metrica context_recall, non è necessario fornire le informazioni sui ground_truths. In questo caso, tutto ciò di cui hai bisogno è preparare le question.

Valutazione dell’applicazione RAG

Prima di tutto, importa tutte le metriche che desideri utilizzare da ragas.metrics. Successivamente, puoi utilizzare la funzione evaluate() e passare semplicemente le metriche rilevanti e il dataset preparato.

from ragas import evaluatefrom ragas.metrics import (    faithfulness,    answer_relevancy,    context_recall,    context_precision,)result = evaluate(    dataset = dataset,     metrics=[        context_precision,        context_recall,        faithfulness,        answer_relevancy,    ],)df = result.to_pandas()

Sotto, puoi vedere i punteggi RAGAs risultanti per gli esempi:

Punteggi RAGAs per la precisione del contesto, il richiamo del contesto, la fedeltà e la rilevanza della risposta.

Possiamo fare le seguenti osservazioni:

  • context_relevancy (rapporto segnale-rumore del contesto recuperato): Mentre LLM giudica tutto il contesto come rilevante per l’ultima domanda, giudica anche che la maggior parte del contesto recuperato per la seconda domanda è irrilevante. In base a questa metrica, potresti sperimentare con diversi numeri di contesti recuperati per ridurre il rumore.
  • context_recall (se tutte le informazioni rilevanti necessarie per rispondere alla domanda sono state recuperate): Gli LLM valutano che i contesti recuperati contengano le informazioni rilevanti necessarie per rispondere correttamente alle domande.
  • faithfulness (accuratezza fattuale della risposta generata): Mentre LLM giudica che le prime e ultime domande siano state risposte correttamente, la risposta alla seconda domanda, che afferma erroneamente che il presidente non ha menzionato il CEO di Intel, viene giudicata con una fedeltà del 0,5.
  • answer_relevancy (quanto la risposta generata è rilevante per la domanda): Tutte le risposte generate vengono giudicate come abbastanza rilevanti per le domande.

Come menzionato in Evaluation Data, l’utilizzo di LLM per l’evaluazione senza riferimento è un campo di ricerca attivo. Sono curioso di vedere come evolverà questo argomento.

Riassunto

Creare un’applicazione RAG di prova è facile, ma renderne le prestazioni pronte per la produzione è difficile. Come un progetto di apprendimento automatico, dovresti valutare le prestazioni del tuo pipeline RAG con un dataset di validazione e una metrica di valutazione.

Tuttavia, poiché una pipeline RAG è composta da più componenti che devono essere valutate separatamente e in combinazioni, avrai bisogno di un set di metriche di valutazione. Inoltre, generare un dataset di validazione di alta qualità da annotatori umani è difficile, richiede tempo e è costoso.

Questo articolo ha presentato il framework di valutazione delle RAGAs [1]. Il framework propone quattro metriche di valutazione: context_relevancy, context_recall, faithfulness e answer_relevancy, che insieme compongono il punteggio RAGAs. Inoltre, RAGAs sfrutta gli LLM per l’evaluazione senza riferimento per risparmiare costi.

Ora che hai gli strumenti per valutare le prestazioni della tua applicazione RAG, ti consiglio di creare una pipeline di sperimentazione e iniziare a migliorare le prestazioni con le seguenti strategie di ottimizzazione:

Una guida su 12 strategie di ottimizzazione per applicazioni RAG pronte per la produzione

Come migliorare le prestazioni della tua pipeline di generazione con augmentazione di recupero (RAG) con questi “iperparametri” e…

towardsdatascience.com

Puoi trovare il codice per generare questo dataset nel repository GitHub corrispondente.

Ti è piaciuta questa storia?

Iscriviti gratuitamente per ricevere una notifica quando pubblico una nuova storia.

Ricevi una email ogni volta che Leonie Monigatti pubblica un’articolo.

Ricevi una email ogni volta che Leonie Monigatti pubblica un articolo. Registrandoti, creerai un account VoAGI se non ne hai già uno…

VoAGI.com

Trova il mio profilo su LinkedIn, Twitter, e Kaggle!

Avvertenza

Sono un Developer Advocate presso Weaviate, un database vettoriale open source, al momento della stesura di questo articolo.

Riferimenti

[1] Es, S., James, J., Espinosa-Anke, L., & Schockaert, S. (2023). RAGAs: Valutazione automatizzata di generazione con recupero. arXiv preprint arXiv:2309.15217.

[2] Documentazione RAGAs (2023). Documentazione (accesso Dec 11, 2023)

[3] Wang, P., Li, L., Chen, L., Zhu, D., Lin, B., Cao, Y., … & Sui, Z. (2023). I modelli di lingua estesa non sono valutatori imparziali. arXiv preprint arXiv:2305.17926.

[4] Liu, Y., Iter, D., Xu, Y., Wang, S., Xu, R., & Zhu, C. (2023). G-eval: Valutazione Nlg utilizzando gpt-4 con un migliore allineamento umano, maggio 2023. arXiv preprint arXiv:2303.16634, 6.

Immagini

Se non diversamente specificato, tutte le immagini sono create dall’autore.