RAGA (Rrecupero-UNaumentato Generazione COMEvalutazione) è un framework (GitHub, Documenti) che fornisce gli ingredienti necessari per aiutarti a valutare la pipeline RAG a livello di componente.
Dati di valutazione
La cosa interessante dei RAGA è che sono nati come quadro di riferimento per la valutazione “senza riferimenti” (1). Ciò significa che, invece di dover fare affidamento su etichette di verità di base annotate dall’uomo nel set di dati di valutazione, i RAGA sfruttano i LLM sotto il cofano per condurre le valutazioni.
Per valutare la pipeline RAG, RAGA si aspetta le seguenti informazioni:
question
: la query dell’utente che rappresenta l’input della pipeline RAG. L’ingresso.answer
: la risposta generata dalla pipeline RAG. Il risultato.contexts
: i contesti recuperati dalla fonte di conoscenza esterna utilizzata per rispondere alla domandaquestion
.ground_truths
: La risposta veritiera alla domandaquestion
. Questa è l’unica informazione annotata da esseri umani. Queste informazioni sono necessarie solo per la metricacontext_recall
(Vedere Metriche di valutazione).
Sfruttare gli LLM per una valutazione senza riferimenti è un argomento di ricerca attivo. Sebbene l’utilizzo del minor numero possibile di dati annotati dall’uomo lo renda un metodo di valutazione più economico e veloce, si discute ancora sui suoi difetti, come i bias (3). Tuttavia, alcuni studi hanno già mostrato risultati promettenti (4). Per informazioni dettagliate, consultare la sezione “Lavori correlati” del documento RAGA (1).
Si noti che il quadro è stato ampliato per fornire parametri e paradigmi che richiedono etichette di verità fondate (ad esempio, context_recall
E answer_correctness
Vedere Metriche di valutazione).
Inoltre, il framework fornisce strumenti per generazione automatica dei dati di test.
Metriche di valutazione
I RAGA te ne forniscono alcuni metrica per valutare una pipeline RAG sia dal punto di vista dei componenti che end-to-end.
Su un livello dei componentiRAGA fornisce metriche per valutare la componente di recupero (context_relevancy
E context_recall
) e la componente generativa (faithfulness
E answer_relevancy
) separatamente (2):
- Precisione del contesto misura il rapporto segnale-rumore del contesto recuperato. Questa metrica viene calcolata utilizzando il
question
e ilcontexts
. - Richiamo del contesto misure se sono state recuperate tutte le informazioni pertinenti necessarie per rispondere alla domanda. Questa metrica viene calcolata in base a
ground_truth
(questa è l’unica metrica nel quadro che si basa su etichette di verità fondate annotate dall’uomo) e ilcontexts
. - Fedeltà misura l’accuratezza fattuale della risposta generata. Il numero di affermazioni corrette provenienti dai contesti indicati viene diviso per il numero totale di affermazioni nella risposta generata. Questa metrica utilizza il
question
,contexts
e ilanswer
. - Pertinenza della risposta misura quanto sia pertinente la risposta generata alla domanda. Questa metrica viene calcolata utilizzando il
question
e ilanswer
. Ad esempio, la risposta “La Francia si trova nell’Europa occidentale.” alla domanda”Dov’è la Francia e qual è la sua capitale?” otterrebbe una risposta di pertinenza bassa perché risponde solo a metà della domanda.
Tutti i parametri vengono adattati all’intervallo (0, 1), con valori più alti che indicano prestazioni migliori.
RAGA fornisce inoltre parametri per valutare la pipeline RAG da un capo all’altro, ad esempio rispondere alla somiglianza semantica E rispondere correttamente. Questo articolo si concentra sulle metriche a livello di componente.
Questa sezione utilizza i RAGA per valutare una pipeline RAG Vanilla minima per mostrarti come utilizzare i RAGA e darti un’idea delle sue metriche di valutazione.
Prerequisiti
Assicurati di aver installato i pacchetti Python richiesti:
langchain
,openai
Eweaviate-client
per il gasdotto RAGragas
per la valutazione del gasdotto RAG
#!pip install langchain openai weaviate-client ragas
Inoltre, definisci le variabili di ambiente rilevanti in un file .env nella directory root. Per ottenere una chiave API OpenAI, è necessario un account OpenAI e quindi “Crea nuova chiave segreta” sotto Chiavi API.
OPENAI_API_KEY="<YOUR_OPENAI_API_KEY>"
Configurazione dell’applicazione RAG
Prima di poter valutare la tua applicazione RAG, devi configurarla. Utilizzeremo una pipeline RAG vanilla. Manterremo questa sezione breve poiché utilizzeremo la stessa configurazione descritta in dettaglio nel seguente articolo.
Innanzitutto, devi preparare i dati caricando e suddividendo i documenti.
import requests
from langchain.document_loaders import TextLoader
from 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)
# Load the data
loader = TextLoader('./state_of_the_union.txt')
documents = loader.load()
# Chunk the data
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = text_splitter.split_documents(documents)
Successivamente, genera gli incorporamenti di vettori per ciascun blocco con il modello di incorporamento OpenAI e archiviali nel database dei vettori.
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Weaviate
import weaviate
from weaviate.embedded import EmbeddedOptions
from dotenv import load_dotenv,find_dotenv# Load OpenAI API key from .env file
load_dotenv(find_dotenv())
# Setup vector database
client = weaviate.Client(
embedded_options = EmbeddedOptions()
)
# Populate vector database
vectorstore = Weaviate.from_documents(
client = client,
documents = chunks,
embedding = OpenAIEmbeddings(),
by_text = False
)
# Define vectorstore as retriever to enable semantic search
retriever = vectorstore.as_retriever()
Infine, configura un modello di prompt e OpenAI LLM e combinali con il componente retriever in una pipeline RAG.
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema.runnable import RunnablePassthrough
from langchain.schema.output_parser import StrOutputParser# Define LLM
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
# Define prompt template
template = """You are an assistant for question-answering tasks.
Use the following pieces of retrieved context to answer the question.
If you don't know the answer, just say that you don't know.
Use two sentences maximum and keep the answer concise.
Question: {question}
Context: {context}
Answer:
"""
prompt = ChatPromptTemplate.from_template(template)
# Setup RAG pipeline
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
Preparazione dei dati di valutazione
Poiché RAGA mira a essere un quadro di valutazione privo di riferimenti, la preparazione richiesta del set di dati di valutazione è minima. Dovrai prepararti question
E ground_truths
coppie da cui è possibile preparare le restanti informazioni tramite inferenza come segue:
from datasets import Datasetquestions = ("What did the president say about Justice Breyer?",
"What did the president say about Intel's CEO?",
"What did the president say about gun violence?",
)
ground_truths = (("The president said that Justice Breyer has dedicated his life to serve the country and thanked him for his service."),
("The president said that Pat Gelsinger is ready to increase Intel's investment to $100 billion."),
("The president asked Congress to pass proven measures to reduce gun violence."))
answers = ()
contexts = ()
# Inference
for query in questions:
answers.append(rag_chain.invoke(query))
contexts.append((docs.page_content for docs in retriever.get_relevant_documents(query)))
# To dict
data = {
"question": questions,
"answer": answers,
"contexts": contexts,
"ground_truths": ground_truths
}
# Convert dict to dataset
dataset = Dataset.from_dict(data)
Se non sei interessato al context_recall
metrica, non è necessario fornire il file ground_truths
informazione. In questo caso, tutto ciò che devi preparare sono i question
S.
Valutazione dell’applicazione RAG
Innanzitutto, importa tutte le metriche da cui desideri utilizzare ragas.metrics
. Quindi è possibile utilizzare il file evaluate()
funzione e passare semplicemente le metriche pertinenti e il set di dati preparato.
from ragas import evaluate
from 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()
Di seguito, puoi vedere i punteggi RAGA risultanti per gli esempi:
Fonte: towardsdatascience.com