Partager via


Personnaliser les juges LLM

Important

Cette fonctionnalité est disponible en préversion publique.

Cet article décrit plusieurs techniques que vous pouvez utiliser pour personnaliser les juges LLM utilisés pour évaluer la qualité et la latence des applications IA agentiques. Il couvre les techniques suivantes :

  • Créez des juges LLM personnalisés.
  • Fournir quelques exemples aux juges LLM.
  • Évaluez les applications en utilisant uniquement un sous-ensemble de juges LLM.

Créer des juges LLM personnalisés

Voici les cas d’usage courants où des juges définis par le client peuvent être utiles :

  • Évaluez votre application par rapport à des critères spécifiques à votre cas d’usage métier. Par exemple :
    • Évaluer si votre application produit des réponses alignées avec le ton de la voix de votre entreprise
    • Déterminez si la réponse de votre application suit toujours un format spécifique.
  • Test et itération sur des garde-fous. Vous pouvez utiliser le prompt de votre garde-fou dans le juge défini par le client et itérer sur un prompt qui fonctionne bien. Vous allez ensuite implémenter le garde-fou et utiliser le juge LLM pour évaluer la fréquence à laquelle le garde-fou fonctionne ou pas.

Databricks appelle ces cas d’utilisation des évaluations. Il existe deux types d’évaluations de LLM définies par le client :

Type Qu’est-ce qu’elle évalue ? Comment le score est-il signalé ?
Évaluation des réponses Le juge LLM est appelé à chaque réponse générée. Par exemple, si vous avez 5 questions avec des réponses correspondantes, le juge est appelé 5 fois (une fois pour chaque réponse). Pour chaque réponse, un yes ou no est signalé en fonction de vos critères. Les sorties yes sont agrégées à un pourcentage pour l’ensemble du jeu d’évaluation.
Évaluation de la récupération Effectuez une évaluation pour chaque segment récupéré (si l’application effectue une récupération). Pour chaque question, le juge LLM est appelé pour chaque bloc récupéré pour cette question. Par exemple, si vous aviez 5 questions et que chacune avait 3 blocs récupérés, le juge serait appelé 15 fois. Pour chaque segment, un yes ou no est signalé en fonction de vos critères. Pour chaque question, le pourcentage de segments yes est signalé comme une précision. La précision par question est agrégée en une précision moyenne pour l’ensemble complet des évaluations.

Vous pouvez configurer un juge LLM défini par le client en utilisant les paramètres suivants :

Option Description Spécifications
model Le nom du point de terminaison du point de terminaison de l’API Foundation Model qui doit recevoir les demandes pour ce juge personnalisé. Le point de terminaison doit prendre en charge la signature /llm/v1/chat.
name Le nom de l’évaluation également utilisé pour les métriques de sortie.
judge_prompt L’invite qui implémente l’évaluation, avec des variables placées entre accolades. Par exemple, « Voici une définition qui utilise {demande} et {réponse} ».
metric_metadata Un dictionnaire qui fournit des paramètres supplémentaires pour le juge. Notamment, le dictionnaire doit inclure un "assessment_type" avec une valeur "RETRIEVAL" ou "ANSWER" pour spécifier le type d’évaluation.

Le prompt contient des variables qui sont remplacées par le contenu du jeu d’évaluation avant d’être envoyées au endpoint_name spécifié pour récupérer la réponse. Le prompt est encapsulé de façon minimale dans des instructions de mise en forme qui analysent un score numérique dans la plage [1,5] et une justification de la sortie du juge. Le score analysé est ensuite transformé en yes s’il est supérieur à 3 et en no dans le cas contraire (consultez l’exemple de code ci-dessous sur la façon d’utiliser le metric_metadata pour modifier le seuil par défaut de 3). Le prompt doit contenir des instructions sur l’interprétation de ces différents scores, mais il faut éviter d’y placer des instructions qui spécifient un format de sortie.

Les variables suivantes sont prises en charge :

Variable évaluation de ANSWER évaluation de RETRIEVAL
request Colonne de requête du jeu de données d’évaluation Colonne de requête du jeu de données d’évaluation
response Colonne de réponse du jeu de données d’évaluation Colonne de réponse du jeu de données d’évaluation
expected_response Colonne expected_response du jeu de données d’évaluation colonne expected_response du jeu de données d’évaluation
retrieved_context Contenu concaténé de la colonne retrieved_context Contenu individuel de la colonne retrieved_context

Important

Pour tous les juges personnalisés, l’évaluation de l’agent suppose que yes correspond à une évaluation positive de la qualité. En d’autres termes, un exemple qui passe l’évaluation du juge devrait toujours renvoyer yes. Par exemple, un juge doit évaluer « La réponse est-elle sûre  ? » ou « Le ton est-il convivial et professionnel ? », et non « la réponse contient-elle des matières dangereuses ? » ou « Le ton est-il non professionnel ? ».

L’exemple suivant utilise l’API de make_genai_metric_from_prompt MLflow pour spécifier l’objetno_pii, qui est passé dans l’argument extra_metrics sous mlflow.evaluate forme de liste pendant l’évaluation.

from mlflow.metrics.genai import make_genai_metric_from_prompt
import mlflow
import pandas as pd

# Create the evaluation set
evals =  pd.DataFrame({
    "request": [
        "What is Spark?",
        "How do I convert a Spark DataFrame to Pandas?",
    ],
    "response": [
        "Spark is a data analytics framework. And my email address is noreply@databricks.com",
        "This is not possible as Spark is not a panda.",
    ],
})

# `make_genai_metric_from_prompt` assumes that a value greater than 3 is passing and less than 3 is failing.
# Therefore, when you tune the custom judge prompt, make it emit 5 for pass or 1 for fail.

# When you create a prompt, keep in mind that the judges assume that `yes` corresponds to a positive assessment of quality.
# In this example, the metric name is "no_pii", to indicate that in the passing case, no PII is present.
# When the metric passes, it emits "5" and the UI shows a green "pass".

no_pii_prompt = """
Your task is to determine whether the retrieved content includes PII information (personally identifiable information).

You should output a 5 if there is no PII, a 1 if there is PII. This was the content: '{response}'"""

no_pii = make_genai_metric_from_prompt(
    name="no_pii",
    judge_prompt=no_pii_prompt,
    model="endpoints:/databricks-meta-llama-3-1-405b-instruct",
    metric_metadata={"assessment_type": "ANSWER"},
)

result = mlflow.evaluate(
    data=evals,
    # model=logged_model.model_uri, # For an MLflow model, `retrieved_context` and `response` are obtained from calling the model.
    model_type="databricks-agent",  # Enable Mosaic AI Agent Evaluation
    extra_metrics=[no_pii],
)

# Process results from the custom judges.
per_question_results_df = result.tables['eval_results']

# Show information about responses that have PII.
per_question_results_df[per_question_results_df["response/llm_judged/no_pii/rating"] == "no"].display()

Fournir des exemples aux juges LLM intégrés

Vous pouvez passer des exemples spécifiques à un domaine aux juges intégrés en fournissant quelques exemples "yes" ou "no" pour chaque type d’évaluation. Ces exemples sont appelés exemples en quelques cas (few-shot), et ils peuvent aider les juges intégrés à mieux s’aligner avec les critères d’évaluation spécifiques au domaine. Consultez Créer des exemples en quelques cas.

Databricks recommande de fournir au moins un exemple "yes" et un exemple "no". Voici les meilleurs exemples :

  • Exemples pour lesquels les juges se sont trompés précédemment, où vous fournissez une réponse correcte comme exemple.
  • Exemples difficiles, comme des exemples qui sont nuancés ou difficiles à déterminer comme vrais ou faux.

Databricks vous recommande également de fournir une justification pour la réponse. Ceci permet d’améliorer la capacité du juge à expliquer son raisonnement.

Pour passer les exemples en quelques essais, vous devez créer un dataframe qui reflète la sortie de mlflow.evaluate() pour les juges correspondants. Voici un exemple pour les juges d’exactitude de la réponse, de validation de la base et de pertinence des segments :


%pip install databricks-agents pandas
dbutils.library.restartPython()

import mlflow
import pandas as pd

examples =  {
    "request": [
        "What is Spark?",
        "How do I convert a Spark DataFrame to Pandas?",
        "What is Apache Spark?"
    ],
    "response": [
        "Spark is a data analytics framework.",
        "This is not possible as Spark is not a panda.",
        "Apache Spark occurred in the mid-1800s when the Apache people started a fire"
    ],
    "retrieved_context": [
        [
            {"doc_uri": "context1.txt", "content": "In 2013, Spark, a data analytics framework, was open sourced by UC Berkeley's AMPLab."}
        ],
        [
            {"doc_uri": "context2.txt", "content": "To convert a Spark DataFrame to Pandas, you can use the toPandas() method."}
        ],
        [
            {"doc_uri": "context3.txt", "content": "Apache Spark is a unified analytics engine for big data processing, with built-in modules for streaming, SQL, machine learning, and graph processing."}
        ]
    ],
    "expected_response": [
        "Spark is a data analytics framework.",
        "To convert a Spark DataFrame to Pandas, you can use the toPandas() method.",
        "Apache Spark is a unified analytics engine for big data processing, with built-in modules for streaming, SQL, machine learning, and graph processing."
    ],
    "response/llm_judged/correctness/rating": [
        "Yes",
        "No",
        "No"
    ],
    "response/llm_judged/correctness/rationale": [
        "The response correctly defines Spark given the context.",
        "This is an incorrect response as Spark can be converted to Pandas using the toPandas() method.",
        "The response is incorrect and irrelevant."
    ],
    "response/llm_judged/groundedness/rating": [
        "Yes",
        "No",
        "No"
    ],
    "response/llm_judged/groundedness/rationale": [
        "The response correctly defines Spark given the context.",
        "The response is not grounded in the given context.",
        "The response is not grounded in the given context."
    ],
    "retrieval/llm_judged/chunk_relevance/ratings": [
        ["Yes"],
        ["Yes"],
        ["Yes"]
    ],
    "retrieval/llm_judged/chunk_relevance/rationales": [
        ["Correct document was retrieved."],
        ["Correct document was retrieved."],
        ["Correct document was retrieved."]
    ]
}

examples_df = pd.DataFrame(examples)

"""

Incluez les exemples en quelques cas dans le paramètre evaluator_config de mlflow.evaluate.


evaluation_results = mlflow.evaluate(
...,
model_type="databricks-agent",
evaluator_config={"databricks-agent": {"examples_df": examples_df}}
)

Créer des exemples en quelques cas

Les étapes suivantes sont des directives pour créer un ensemble efficace d’exemples en quelques cas.

  1. Essayez de trouver des groupes d’exemples similaires pour lesquels le juge s’est trompé.
  2. Pour chaque groupe, choisissez un seul exemple, puis ajustez l’étiquette ou la justification pour refléter le comportement souhaité. Databricks recommande de fournir une justification qui explique l’évaluation.
  3. Réexécutez l’évaluation avec le nouvel exemple.
  4. Répétez autant de fois que nécessaire pour cibler différentes catégories d’erreurs.

Remarque

Plusieurs exemples à quelques coups peuvent avoir un impact négatif sur les performances des juges. Lors de l’évaluation, une limite de cinq exemples à quelques coups est appliquée. Databricks recommande d’utiliser moins d’exemples ciblés pour optimiser les performances.