Évaluer les demandes RAG avec RAGAs

Évaluer les demandes Réparation-Achat-Groupé avec Réparation-Achat-Groupé Amplifié

Un cadre avec des métriques et des données générées par LLM pour évaluer les performances de votre pipeline de génération augmentée par récupération

Tableau de bord stylisé des performances pour la génération augmentée par récupération

Aujourd’hui, nous savons qu’il est facile de créer un prototype d’une application de Génération Augmentée par Récupération (GAR), mais la rendre prête pour la production est très difficile. Obtenir des performances satisfaisantes pour le pipeline GAR est particulièrement difficile en raison des différents composants d’un pipeline GAR :

  • Composant de récupération : récupère un contexte supplémentaire à partir d’une base de données externe pour que le LLM puisse répondre à la requête.
  • Composant de génération : génère une réponse basée sur une invite augmentée avec les informations récupérées.

Lors de l’évaluation d’un pipeline GAR, vous devez évaluer à la fois les composants séparément et ensemble afin de comprendre si et où le pipeline GAR a encore besoin d’améliorations. De plus, pour comprendre si les performances de votre application GAR s’améliorent, vous devez l’évaluer quantitativement. Pour cela, vous aurez besoin de deux éléments : une métrique d’évaluation et un ensemble de données d’évaluation.

Actuellement, déterminer les bonnes métriques d’évaluation et collecter de bonnes données de validation est un domaine de recherche actif. Comme il s’agit d’un sujet en évolution rapide, nous assistons actuellement à l’apparition de différentes approches pour les frameworks d’évaluation GAR, telles que le triade de métriques GAR, ROUGE, ARES, BLUE et RAGAs [1]. Cet article se concentrera sur la façon dont vous pouvez évaluer un pipeline GAR en utilisant RAGAs [1].

Qu’est-ce que RAGAs

RAGAs (Récupération-Augmentation Générée Assessment) est un framework (GitHub, Docs) qui vous fournit les ingrédients nécessaires pour vous aider à évaluer votre pipeline GAR au niveau des composants.

Données d’évaluation

Ce qui est intéressant avec RAGAs, c’est qu’il a commencé en tant que framework pour une évaluation “sans référence” [1]. Cela signifie qu’au lieu de devoir s’appuyer sur des étiquettes de vérité terrain annotées par des humains dans l’ensemble de données d’évaluation, RAGAs utilise des LLMs sous le capot pour effectuer les évaluations.

Pour évaluer le pipeline GAR, RAGAs attend les informations suivantes :

  • question : La requête de l’utilisateur qui est l’entrée du pipeline GAR. L’entrée.
  • answer : La réponse générée par le pipeline GAR. La sortie.
  • contexts : Les contextes récupérés à partir de la source de connaissances externe utilisée pour répondre à la question.
  • ground_truths : La vraie réponse à la question. C’est la seule information annotée par des humains. Cette information est uniquement requise pour la métrique context_recall (voir Métriques d’évaluation).

L’utilisation des LLMs pour une évaluation sans référence est un sujet de recherche actif. Bien que l’utilisation d’un minimum de données annotées par des humains rende cette méthode d’évaluation moins coûteuse et plus rapide, il y a encore des discussions sur ses lacunes, comme le biais [3]. Cependant, certains articles ont déjà montré des résultats prometteurs [4]. Pour des informations détaillées, consultez la section “Related Work” du document RAGAs [1].

Notez que le cadre s’est étendu pour fournir des mesures et des paradigmes qui nécessitent des étiquettes de vérité terrain (par exemple, context_recall et answer_correctness, voir Evaluation Metrics).

De plus, le cadre vous fournit des outils pour la génération automatisée de données de test.

Métriques d’évaluation

Les RAGAs vous fournissent quelques métriques pour évaluer un composant RAG pipeline par composant ainsi que de bout en bout.

À un niveau de composant, les RAGAs vous fournissent des mesures pour évaluer le composant de recherche (context_relevancy et context_recall) et le composant génératif (faithfulness et answer_relevancy) séparément [2]:

  • Précision du contexte mesure le rapport signal-bruit du contexte récupéré. Cette mesure est calculée en utilisant la question et les contexts.
  • Rappel du contexte mesure si toutes les informations pertinentes nécessaires pour répondre à la question ont été récupérées. Cette mesure est calculée en fonction de la ground_truth (il s’agit de la seule mesure du cadre qui repose sur des étiquettes de vérité terrain annotées par des humains) et des contexts.
  • Fidélité mesure l’exactitude factuelle de la réponse générée. Le nombre d’énoncés corrects des contextes donnés est divisé par le nombre total d’énoncés dans la réponse générée. Cette mesure utilise la question, les contexts et la answer.
  • Pertinence de la réponse mesure la pertinence de la réponse générée par rapport à la question. Cette mesure est calculée en utilisant la question et la answer. Par exemple, la réponse “La France se trouve en Europe occidentale.” à la question “Où se trouve la France et quelle est sa capitale ?” obtiendrait une faible pertinence de la réponse car elle ne répond qu’à la moitié de la question.

Toutes les mesures sont échelonnées dans la plage [0, 1], avec des valeurs plus élevées indiquant de meilleures performances.

Les RAGAs vous fournissent également des mesures pour évaluer le pipeline RAG de bout en bout, telles que la similitude sémantique de la réponse et la justesse de la réponse. Cet article se concentre sur les mesures au niveau des composants.

Évaluation d’une application RAG avec RAGAs

Cette section utilise RAGAs pour évaluer un pipeline RAG minimal pour vous montrer comment utiliser RAGAs et vous donner une intuition sur ses métriques d’évaluation.

Prérequis

Assurez-vous d’avoir installé les packages Python requis :

  • langchain, openai et weaviate-client pour le pipeline RAG
  • ragas pour évaluer le pipeline RAG
#!pip install langchain openai weaviate-client ragas

De plus, définissez vos variables d’environnement pertinentes dans un fichier .env à la racine de votre répertoire. Pour obtenir une clé d’API OpenAI, vous avez besoin d’un compte OpenAI, puis de “Créer une nouvelle clé secrète” sous Clés API.

OPENAI_API_KEY="<VOTRE_CLÉ_API_OPENAI>"

Mise en place de l’application RAG

Avant de pouvoir évaluer votre application RAG, vous devez la configurer. Nous utiliserons une pipeline RAG classique. Cette section sera brève car nous utiliserons la même configuration décrite en détail dans l’article suivant.

Retrieval-Augmented Generation (RAG) : De la théorie à la mise en œuvre avec LangChain et OpenAI

De la théorie de l’article académique initial à sa mise en œuvre en Python avec OpenAI, Weaviate et LangChain

towardsdatascience.com

Tout d’abord, vous devez préparer les données en chargeant et en découpant les documents.

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)# Chargement des donnéesdataloader = TextLoader('./state_of_the_union.txt')documents = loader.load()# Découpage des donnéestext_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)chunks = text_splitter.split_documents(documents)

Ensuite, générez les embeddings vectoriels pour chaque morceau à l’aide du modèle d’embedding OpenAI et stockez-les dans la base de données vectorielles.

from langchain.embeddings import OpenAIEmbeddingsfrom langchain.vectorstores import Weaviateimport weaviatefrom weaviate.embedded import EmbeddedOptionsfrom dotenv import load_dotenv,find_dotenv# Chargement de la clé API OpenAI depuis le fichier .envload_dotenv(find_dotenv())# Configuration de la base de données vectoriellesclient = weaviate.Client(  embedded_options = EmbeddedOptions())# Remplissage de la base de données vectoriellesvectorstore = Weaviate.from_documents(    client = client,        documents = chunks,    embedding = OpenAIEmbeddings(),    by_text = False)# Définition de la base de données vectorielles en tant que système de recherche pour activer la recherche sémantiquerétriever = vectorstore.as_retriever()

Enfin, configurez un modèle de prompt et le modèle LLM OpenAI, puis combinez-les avec le composant retriever pour former une pipeline RAG.

from langchain.chat_models import ChatOpenAIfrom langchain.prompts import ChatPromptTemplatefrom langchain.schema.runnable import RunnablePassthroughfrom langchain.schema.output_parser import StrOutputParser# Définition du modèle LLMllm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)# Définition du modèle de prompttemplate = """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)# Configuration de la pipeline RAGrag_chain = (    {"context": retriever,  "question": RunnablePassthrough()}     | prompt     | llm    | StrOutputParser() )

Préparation des données pour l’évaluation

Étant donné que RAGAs vise à être un cadre d’évaluation sans référence, les préparatifs nécessaires pour l’ensemble de données d’évaluation sont minimes. Vous devrez préparer des paires de question et ground_truths à partir desquelles vous pourrez préparer les autres informations par inférence comme suit :

from datasets import Datasetquestions = ["Que dit le président à propos du juge Breyer?",              "Que dit le président à propos du PDG d'Intel?",             "Que dit le président à propos de la violence par arme à feu?",            ]ground_truths = [["Le président a déclaré que le juge Breyer a consacré sa vie au service du pays et l'a remercié pour son engagement."],                ["Le président a déclaré que Pat Gelsinger est prêt à augmenter l'investissement d'Intel à 100 milliards de dollars."],                ["Le président a demandé au Congrès d'adopter des mesures éprouvées pour réduire la violence par arme à feu."]]answers = []contexts = []# Inférencefor query in questions:  answers.append(rag_chain.invoke(query))  contexts.append([docs.page_content for docs in retriever.get_relevant_documents(query)])# Conversion en dictionnairedata = {    "question": questions,    "answer": answers,    "contexts": contexts,    "ground_truths": ground_truths}# Conversion du dictionnaire en ensemble de donnéesdataset = Dataset.from_dict(data)

Si vous n’êtes pas intéressé par la mesure de context_recall, vous n’avez pas besoin de fournir les informations ground_truths. Dans ce cas, vous devez simplement préparer les questions.

Évaluation de l’application RAG

Tout d’abord, importez toutes les mesures que vous souhaitez utiliser à partir de ragas.metrics. Ensuite, vous pouvez utiliser la fonction evaluate() et simplement passer les mesures pertinentes et l’ensemble de données préparé.

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()

Vous pouvez voir ci-dessous les scores RAGAs résultants pour les exemples :

Scores RAGAs de précision de contexte, de rappel de contexte, de fidélité et de pertinence de réponse.

Nous pouvons faire les observations suivantes :

  • context_relevancy (rapport signal/bruit du contexte récupéré) : Bien que LLM juge tout le contexte comme étant pertinent pour la dernière question, il juge également que la plupart du contexte récupéré pour la deuxième question est sans pertinence. Selon cette mesure, vous pouvez expérimenter avec différents nombres de contextes récupérés pour réduire le bruit.
  • context_recall (si toutes les informations pertinentes nécessaires pour répondre à la question ont été récupérées) : Les LLM évaluent que les contextes récupérés contiennent les informations pertinentes nécessaires pour répondre correctement aux questions.
  • faithfulness (exactitude factuelle de la réponse générée) : Bien que LLM juge que les première et dernière questions sont correctement répondues, la réponse à la deuxième question, qui affirme à tort que le président n’a pas mentionné le CEO d’Intel, est jugée avec une fidélité de 0,5.
  • answer_relevancy (pertinence de la réponse générée par rapport à la question) : Toutes les réponses générées sont jugées comme étant assez pertinentes par rapport aux questions.

Comme mentionné dans Données d’évaluation, utiliser LLM pour l’évaluation sans référence est un domaine de recherche actif. Je suis curieux de voir comment ce sujet évoluera.

Résumé

Créer une application RAG de preuve de concept est facile, mais rendre sa performance prête pour la production est difficile. Comme un projet d’apprentissage automatique, vous devriez évaluer la performance du pipeline RAG avec un ensemble de données de validation et une mesure d’évaluation.

Cependant, étant donné qu’un pipeline RAG est composé de plusieurs composants qui doivent être évalués séparément et en combinaison, vous aurez besoin d’un ensemble de mesures d’évaluation. De plus, générer un ensemble de données de validation de haute qualité à partir d’annotateurs humains est difficile, prend du temps et est coûteux.

Cet article a introduit le cadre d’évaluation RAGAs [1]. Le cadre propose quatre mesures d’évaluation – context_relevancy, context_recall, faithfulness et answer_relevancy – qui composent ensemble le score RAGAs. De plus, RAGAs utilise LLMs en interne pour une évaluation sans référence afin d’économiser des coûts.

Maintenant que vous avez les outils pour évaluer la performance de votre application RAG, je vous recommande de mettre en place un pipeline d’expérimentation et de commencer à ajuster la performance en utilisant les stratégies de réglage suivantes :

Un guide sur 12 stratégies de réglage pour les applications RAG prêtes pour la production

Comment améliorer les performances de votre pipeline de génération avec augmentation de la récupération (RAG) avec ces “hyperparamètres” et…

towardsdatascience.com

Vous pouvez trouver le code pour générer cet ensemble de données dans ce dépôt GitHub.

Vous avez aimé cette histoire ?

Abonnez-vous gratuitement pour être informé(e) lorsque je publie une nouvelle histoire.

Recevez un e-mail chaque fois que Leonie Monigatti publie.

Recevez un e-mail à chaque fois que Leonie Monigatti publie. En vous inscrivant, vous créerez un compte VoAGI si vous n’en avez pas déjà un…

VoAGI.com

Retrouvez-moi sur LinkedIn, Twitter et Kaggle !

Clause de non-responsabilité

Je suis Developer Advocate chez Weaviate, une base de données vectorielle open source, au moment de la rédaction de cet article.

Références

[1] Es, S., James, J., Espinosa-Anke, L., & Schockaert, S. (2023). RAGAs : Evaluation automatisée de la génération augmentée par la récupération. Prépublication arXiv :2309.15217.

[2] Documentation RAGAs (2023). Documentation (consulté le 11 décembre 2023)

[3] Wang, P., Li, L., Chen, L., Zhu, D., Lin, B., Cao, Y., … & Sui, Z. (2023). Les grands modèles de langage ne sont pas des évaluateurs impartiaux. Prépublication arXiv :2305.17926.

[4] Liu, Y., Iter, D., Xu, Y., Wang, S., Xu, R., & Zhu, C. (2023). G-eval : Évaluation Nlg utilisant gpt-4 avec une meilleure alignement humain, mai 2023. Prépublication arXiv :2303.16634, 6.

Images

Sauf indication contraire, toutes les images sont créées par l’auteur.

We will continue to update IPGirl; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

AI

Révolutionner la segmentation panoptique avec FC-CLIP un cadre d'intelligence artificielle (IA) unifié à une seule étape.

La segmentation d’image est une tâche fondamentale de vision par ordinateur dans laquelle une image est divisée...

AI

L'essor de l'IA conduit à une industrie technologique où règne la loi du plus fort.

Vous seriez d'accord avec moi pour dire que l'industrie technologique est en train de subir une transformation radica...

Actualités sur l'IA

PayPal rend JunoDB open-source son magasin de clés-valeurs distribué

Paypal a récemment publié en open-source JunoDB, un stockage de clés-valeurs distribué construit sur RocksDB. Chaque ...

AI

Les deux modèles de base Llama 2 de Meta sont désormais disponibles dans Amazon SageMaker JumpStart.

Aujourd'hui, nous sommes ravis d'annoncer que les modèles de base Llama 2 développés par Meta sont disponibles pour l...