Synthétiser les jeux d'évaluation
Cette page décrit comment générer synthétiquement un jeu d'évaluation de haute qualité pour mesurer la qualité de votre agent.
La création manuelle d’un ensemble d’évaluation prend souvent du temps, et il est difficile de s’assurer qu’il couvre toutes les fonctionnalités de votre agent. Agent Evaluation supprime cet obstacle en générant automatiquement un ensemble d’évaluation représentatif à partir de vos documents, vous permettant d’évaluer rapidement votre agent avec une bonne couverture de cas de test.
Générer un jeu d'évaluation
Pour synthétiser les évaluations d'un agent qui utilise l'extraction de documents, utilisez la méthode generate_evals_df qui fait partie du package Python databricks-agents. Pour plus de détails sur l'API, consultez la référence du SDK Python.
Cette méthode vous demande de fournir vos documents en tant que DataFrame Pandas ou DataFrame Spark.
Le DataFrame d’entrée doit avoir les colonnes suivantes :
content: Le contenu du document analysé sous forme de chaîne de caractères.doc_uri: L'URI du document.
Vous pouvez utiliser trois paramètres supplémentaires pour contrôler la génération :
-
num_evals: Le nombre total d'évaluations à générer pour l'ensemble des documents. La fonction essaie de distribuer les évaluations générées sur l'ensemble de vos documents, en tenant compte de leur taille. Sinum_evalsest inférieur au nombre de documents, tous les documents ne seront pas couverts dans l'ensemble d'évaluation.Pour plus de détails sur la manière dont
num_evalsest utilisé pour distribuer les évaluations entre les documents, consultez Commentnum_evalsest utilisé. -
agent_description: Une description de tâche de l'agent -
question_guidelines: Un ensemble de directives qui aident à guider la génération de questions synthétiques. Il s'agit d'une chaîne de caractères libre qui sera utilisée pour lancer la génération. Voir l'exemple ci-dessous.
La sortie de generate_evals_df est un DataFrame. Les colonnes du DataFrame dépendent de l'utilisation de MLflow 3 ou de MLflow 2.
- MLflow 3
- MLflow 2
request_id: Un identifiant de requête unique.inputs: Les entrées synthétisées, dans l'API Chat Completionexpectations: dictionnaire avec deux champs :expected_facts: une liste de faits attendus dans la réponse. Cette colonne a un type de données list[string].expected_retrieved_context: Le contexte à partir duquel cette évaluation a été synthétisée, y compris le contenu du document et le doc_uri.
request_id: Un identifiant de requête unique.request: La requête synthétisée.expected_facts: une liste de faits attendus dans la réponse. Cette colonne a un type de données list[string].expected_retrieved_context: Le contexte à partir duquel cette évaluation a été synthétisée, y compris le contenu du document et le doc_uri.
Exemple
L'exemple suivant utilise generate_evals_df pour générer un ensemble d'évaluation, puis appelle directement mlflow.genai.evaluate() pour mesurer les performances de Meta Llama 3.1 sur cet ensemble d'évaluation. Le modèle Llama 3.1 n'a jamais vu vos documents, il est donc susceptible d'halluciner. Malgré tout, cette expérimentation constitue une bonne base de référence pour votre agent personnalisé.
%pip install mlflow[databricks] databricks-agents
dbutils.library.restartPython()
import mlflow
from databricks.agents.evals import generate_evals_df
from mlflow.genai.scorers import Correctness
import pandas as pd
# `docs` can be a Pandas DataFrame or a Spark DataFrame with two columns: 'content' and 'doc_uri'.
docs = pd.DataFrame.from_records(
[
{
'content': f"""
Apache Spark is a unified analytics engine for large-scale data processing. It provides high-level APIs in Java,
Scala, Python and R, and an optimized engine that supports general execution graphs. It also supports a rich set
of higher-level tools including Spark SQL for SQL and structured data processing, pandas API on Spark for pandas
workloads, MLlib for machine learning, GraphX for graph processing, and Structured Streaming for incremental
computation and stream processing.
""",
'doc_uri': 'https://spark.apache.org/docs/3.5.2/'
},
{
'content': f"""
Spark's primary abstraction is a distributed collection of items called a Dataset. Datasets can be created from Hadoop InputFormats (such as HDFS files) or by transforming other Datasets. Due to Python's dynamic nature, we don't need the Dataset to be strongly-typed in Python. As a result, all Datasets in Python are Dataset[Row], and we call it DataFrame to be consistent with the data frame concept in Pandas and R.""",
'doc_uri': 'https://spark.apache.org/docs/3.5.2/quick-start.html'
}
]
)
agent_description = """
The Agent is a RAG chatbot that answers questions about using Spark on Databricks. The Agent has access to a corpus of Databricks documents, and its task is to answer the user's questions by retrieving the relevant docs from the corpus and synthesizing a helpful, accurate response. The corpus covers a lot of info, but the Agent is specifically designed to interact with Databricks users who have questions about Spark. So questions outside of this scope are considered irrelevant.
"""
question_guidelines = """
# User personas
- A developer who is new to the Databricks platform
- An experienced, highly technical Data Scientist or Data Engineer
# Example questions
- what API lets me parallelize operations over rows of a delta table?
- Which cluster settings will give me the best performance when using Spark?
# Additional Guidelines
- Questions should be succinct, and human-like
"""
num_evals = 10
evals = generate_evals_df(
docs,
# The total number of evals to generate. The method attempts to generate evals that have full coverage over the documents
# provided. If this number is less than the number of documents, is less than the number of documents,
# some documents will not have any evaluations generated. See "How num_evals is used" below for more details.
num_evals=num_evals,
# A set of guidelines that help guide the synthetic generation. These are free-form strings that will be used to prompt the generation.
agent_description=agent_description,
question_guidelines=question_guidelines
)
display(evals)
# Evaluate the model using the newly generated evaluation set. After the function call completes, click the UI link to see the results. You can use this as a baseline for your agent.
predict_fn = mlflow.genai.to_predict_fn("endpoints:/databricks-meta-llama-3-3-70b-instruct")
results = mlflow.genai.evaluate(
predict_fn=predict_fn,
scorers=[Correctness()],
data=evals
)
L'exemple de sortie est affiché ci-dessous. Les colonnes de sortie dépendent de la version que vous utilisez de MLflow 3 ou de MLflow 2.
- MLflow 3
- MLflow 2
Dans l'exemple de sortie suivant, les colonnes request_id et expectations.expected_retrieved_context ne sont pas affichées.
inputs.messages[0].content | expectations.expected_facts |
|---|---|
À quoi sert Spark SQL dans Apache Spark ? |
|
Quels sont les outils de haut niveau pris en charge par Apache Spark, et à quelles fins servent-ils ? |
|
Quelle est l'abstraction principale dans Spark et comment les Datasets sont-ils représentés en Python ? |
|
Pourquoi tous les Datasets en Python sont-ils appelés DataFrames dans Spark ? |
|
Dans l'exemple de sortie suivant, les colonnes request_id et expected_retrieved_context ne sont pas affichées.
demande | expected_facts |
|---|---|
À quoi sert Spark SQL dans Apache Spark ? |
|
Quels sont les outils de haut niveau pris en charge par Apache Spark, et à quelles fins servent-ils ? |
|
Quelle est l'abstraction principale dans Spark et comment les Datasets sont-ils représentés en Python ? |
|
Pourquoi tous les Datasets en Python sont-ils appelés DataFrames dans Spark ? |
|
Comment num_evals est utilisé
num_evals est le nombre total d'évaluations générées pour l'ensemble des documents. La fonction distribue ces évaluations entre les documents tout en essayant de tenir compte des différences de taille des documents. Autrement dit, elle essaie de maintenir approximativement le même nombre de questions par page dans l’ensemble du document.
Si num_evals est inférieur au nombre de documents, certains documents n'auront aucune évaluation générée. Le DataFrame renvoyé par la fonction comprend une colonne avec les source_doc_ids qui ont été utilisées pour générer des évaluations. Vous pouvez utiliser cette colonne pour joindre à nouveau votre DataFrame d'origine afin de générer des évaluations pour les documents qui ont été ignorés.
Pour aider à estimer le num_evals pour une couverture souhaitée, nous fournissons la méthode estimate_synthetic_num_evals :
from databricks.agents.evals import estimate_synthetic_num_evals
num_evals = estimate_synthetic_num_evals(
docs, # Same docs as before.
eval_per_x_tokens = 1000 # Generate 1 eval for every x tokens to control the coverage level.
)
Créer un jeu d'évaluation synthétique — exemple de Notebook
Consultez le Notebook suivant pour un exemple de code permettant de créer un ensemble d'évaluation synthétique.
Notebook d'exemple d'évaluations synthétiques
Informations sur les modèles alimentant les données synthétiques
- Les données synthétiques peuvent utiliser des services tiers pour évaluer vos applications d'IA générative, y compris Azure OpenAI exploitées par Microsoft.
- Pour Azure OpenAI, Databricks s'est désabonné du monitoring des abus, de sorte qu'aucune invite ou réponse n'est stockée avec Azure OpenAI.
- Lorsque le traitement inter-géographique est désactivé, la génération de données synthétiques traite le contenu dans le Databricks Geo du Workspace. Si aucun modèle in-Geo éligible n'est disponible, la requête renvoie une erreur de restriction géographique. Lorsque le traitement inter-Geos est activé, le service de données synthétiques peut traiter du contenu dans d'autres Geos.
- La désactivation des fonctionnalités d'IA optimisées par des partenaires empêche le service de données synthétiques d'appeler les modèles optimisés par des partenaires.
- Les données envoyées au service de données synthétiques ne sont pas utilisées pour la formation de modèles.
- Les données synthétiques sont destinées à aider les clients à évaluer leurs applications d'agent, et les sorties ne doivent pas être utilisées pour entraîner, améliorer ou affiner un LLM.
Limitation
Vous ne pouvez pas créer de datasets d’évaluation synthétiques dans un Workspace avec le contrôle d’égression serverless activé.