Aller au contenu principal

Juges IA intégrés (MLflow 2)

important

Databricks recommande d’utiliser MLflow 3 pour l’évaluation et le monitoring des applications GenAI. Cette page décrit MLflow 2 Agent Evaluation.

Cet article présente les détails de chacun des juges IA intégrés à l'Agent Evaluation, y compris les entrées requises et les métriques de sortie.

Voir aussi :

Aperçu des juges IA

remarque

Tous les juges ne nécessitent pas d'étiquettes de vérité terrain. Les juges qui n’exigent pas d’étiquettes sont utiles lorsque vous n’avez qu’un ensemble de demandes pour évaluer votre agent.

Nom du juge

Aspect de qualité que le juge évalue

Entrées requises

Nécessite la vérité de terrain

global_guideline_adherence

La réponse générée adhère-t-elle aux directives mondiales ?

request, response, global_guidelines (du evaluator_config)

Non, mais cela nécessite. global_guidelines

guideline_adherence

La réponse générée adhère-t-elle aux directives fournies par question ?

request, response ou guidelines_context, guidelines

Oui

correctness

La réponse générée est-elle précise (par rapport à la vérité terrain) ?

request, response, expected_facts[] ou expected_response

Oui

relevance_to_query

La réponse est-elle pertinente par rapport à la demande de l'utilisateur ?

request, response

Non

context_sufficiency

Le récupérateur a-t-il trouvé des documents avec des informations suffisantes pour produire la réponse attendue ?

request, retrieved_context, expected_response

Oui

safety

Y a-t-il un contenu dangereux ou toxique dans la réponse ?

request, response

Non

chunk_relevance

L'extracteur a-t-il trouvé des segments utiles (pertinents) pour répondre à la demande de l'utilisateur ?

Remarque : Ce juge est appliqué séparément à chaque segment récupéré, produisant un score et une justification pour chaque segment. Ces scores sont agrégés en un score de chunk_relevance/precision pour chaque ligne qui représente le % de segments pertinents.

request, retrieved_context

Non

groundedness

La réponse générée est-elle basée sur le contexte récupéré (sans hallucination) ?

request, response, trace[retrieved_context]

Non

document_recall

Combien de documents pertinents connus le récupérateur a-t-il trouvés ?

retrieved_context, expected_retrieved_context[].doc_uri

Oui

Nom du juge

Aspect de qualité que le juge évalue

Entrées requises

Nécessite la vérité de terrain

global_guideline_adherence

La réponse générée adhère-t-elle aux directives mondiales ?

request, response, global_guidelines (du evaluator_config)

Non, mais cela nécessite. global_guidelines

guideline_adherence

La réponse générée adhère-t-elle aux directives fournies par question ?

request, response ou guidelines_context, guidelines

Oui

correctness

La réponse générée est-elle précise (par rapport à la vérité terrain) ?

request, response, expected_facts[] ou expected_response

Oui

relevance_to_query

La réponse est-elle pertinente par rapport à la demande de l'utilisateur ?

request, response

Non

context_sufficiency

Le récupérateur a-t-il trouvé des documents avec des informations suffisantes pour produire la réponse attendue ?

request, retrieved_context, expected_response

Oui

safety

Y a-t-il un contenu dangereux ou toxique dans la réponse ?

request, response

Non

chunk_relevance

L'extracteur a-t-il trouvé des segments utiles (pertinents) pour répondre à la demande de l'utilisateur ?

Remarque : Ce juge est appliqué séparément à chaque segment récupéré, produisant un score et une justification pour chaque segment. Ces scores sont agrégés en un score de chunk_relevance/precision pour chaque ligne qui représente le % de segments pertinents.

request, retrieved_context

Non

groundedness

La réponse générée est-elle basée sur le contexte récupéré (sans hallucination) ?

request, response, trace[retrieved_context]

Non

document_recall

Combien de documents pertinents connus le récupérateur a-t-il trouvés ?

retrieved_context, expected_retrieved_context[].doc_uri

Oui

remarque

Pour les conversations à plusieurs tours, les juges IA n’évaluent que la dernière entrée de la conversation.

Sorties du juge IA

Chaque juge utilisé dans l'évaluation affiche les colonnes suivantes :

Champ de données

Type

Description

response/llm_judged/{judge_name}/rating

string

yes si le juge réussit, no si le juge échoue.

response/llm_judged/{judge_name}/rationale

string

Raisonnement écrit du LLM pour yes ou no.

response/llm_judged/{judge_name}/error_message

string

S'il y a eu une erreur lors du calcul de cette évaluation, les détails de l'erreur se trouvent ici. S'il n'y a pas d'erreur, c'est NULL.

Champ de données

Type

Description

response/llm_judged/{judge_name}/rating

string

yes si le juge réussit, no si le juge échoue.

response/llm_judged/{judge_name}/rationale

string

Raisonnement écrit du LLM pour yes ou no.

response/llm_judged/{judge_name}/error_message

string

S'il y a eu une erreur lors du calcul de cette évaluation, les détails de l'erreur se trouvent ici. S'il n'y a pas d'erreur, c'est NULL.

Chaque juge produira également une métrique agrégée pour l'ensemble de l'exécution :

Nom de la métrique

Type

Description

response/llm_judged/{judge_name}/rating/average

float, [0, 1]

Pourcentage de toutes les évaluations qui ont été jugées yes.

Nom de la métrique

Type

Description

response/llm_judged/{judge_name}/rating/average

float, [0, 1]

Pourcentage de toutes les évaluations qui ont été jugées yes.

Conformité aux directives

Définition : la réponse est-elle conforme aux directives fournies ?

Requiert une vérité terrain : Non lors de l'utilisation de global_guidelines. Oui lors de l'utilisation de guidelines par ligne.

La conformité aux directives évalue si la réponse de l'agent suit des contraintes ou des instructions spécifiques fournies dans les directives.

Les directives peuvent être définies de l'une des manières suivantes :

  • Par ligne : la réponse d'une demande spécifique doit être conforme aux directives définies sur cette ligne d'évaluation.
  • globalement : toutes les réponses à toute requête doivent adhérer aux directives mondiales.

Entrées requises

L'ensemble d'évaluation d'entrée doit contenir les colonnes suivantes :

  • request
  • response si vous n'avez pas spécifié le model paramètre à mlflow.evaluate().
  • par ligne guidelines ou global_guidelines défini dans la configuration.
  • [Juges invocables uniquement] guidelines_context pour fournir un contexte arbitraire au juge.
    • Cette fonctionnalité nécessite databricks-agents>=0.20.0.

Exemples

Utiliser la conformité aux directives par ligne d'un ensemble d'évaluation :

Python
import mlflow

eval_set = [{
"request": "What is the capital of France?",
"response": "The capital of France is Paris.",
# You can also just pass an array of guidelines directly to guidelines, but Databricks recommends naming them with a dictionary.
"guidelines": {
"english": ["The response must be in English"],
"clarity": ["The response must be clear, coherent, and concise"],
}
}]

mlflow.evaluate(
data=eval_set,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {
"metrics": ["guideline_adherence"]
}
}
)

Utilisez l'adhérence aux directives globales d'un ensemble d'évaluation :

Python
import mlflow

eval_set = [{
"request": "What is the capital of France?",
"response": "The capital of France is Paris.",
}]

mlflow.evaluate(
data=eval_set,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {
"metrics": ["guideline_adherence"],
"global_guidelines": ["The response must be in English", "The response must be concise"]
}
}
)

Utilisez l'adhérence aux directives avec le SDK de juge invocable:

Python
from databricks.agents.evals import judges

assessment = judges.guideline_adherence(
request="What is the capital of France?",
response="The capital of France is Paris.",
# You can also just pass an array of guidelines directly to guidelines, but Databricks recommends naming them with a dictionary.
guidelines={
"english": ["The response must be in English"],
"clarity": ["The response must be clear, coherent, and concise"],
"grounded": ["The response must be grounded in the tool call result"],
},
# `guidelines_context` requires `databricks-agents>=0.20.0`
guidelines_context={
"tool_call_result": "{'country': 'France', 'capital': 'Paris'}",
},
)
print(assessment)

Que faire lorsque la réponse ne respecte pas les directives ?

Lorsque la réponse viole les directives :

  • Identifiez la directive qui a été violée et analysez pourquoi l'agent n'a pas réussi à s'y conformer.
  • Ajustez l'invite pour souligner l'adhésion à des directives spécifiques ou réentraînez le modèle avec des exemples supplémentaires qui correspondent au comportement souhaité.
  • Pour les directives globales, assurez-vous qu’elles sont correctement spécifiées dans la configuration de l’évaluateur.

Exactitude

Définition : L’agent a-t-il répondu par une réponse factuellement exacte ?

**Nécessite la vérité terrain** : Oui, expected_facts[] expected_responseou.

L'exactitude compare la réponse réelle de l'agent à une étiquette de vérité terrain et constitue un bon moyen de détecter les erreurs factuelles.

Entrées requises

L'ensemble d'évaluation d'entrée doit contenir les colonnes suivantes :

important

Databricks recommande d'utiliser expected_facts[] au lieu de expected_response. expected_facts[] représentent l'ensemble minimal de faits requis dans une réponse correcte et sont plus faciles à organiser pour les experts en la matière.

Si vous devez utiliser expected_response, il doit inclure uniquement l'ensemble minimal de faits requis pour qu'une réponse soit correcte. Si vous copiez une réponse d'une autre source, modifiez la réponse pour supprimer tout texte qui n'est pas requis pour qu'une réponse soit considérée comme correcte.

N'inclure que les informations requises et omettre les informations qui ne sont pas strictement nécessaires dans la réponse permet à l'Agent Evaluation de fournir un signal plus robuste sur la qualité de la sortie.

Exemples

Utilisez la justesse d’un ensemble d’évaluation :

Python
import mlflow

eval_set = [{
"request": "What is the difference between reduceByKey and groupByKey in Spark?",
"response": "reduceByKey aggregates data before shuffling, whereas groupByKey shuffles all data, making reduceByKey more efficient.",
"expected_facts": [
"reduceByKey aggregates data before shuffling",
"groupByKey shuffles all data",
]
}]

mlflow.evaluate(
data=eval_set,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {
"metrics": ["correctness"]
}
}
)

Utilisez l'exactitude avec le SDK de juge invocable:

Python
from databricks.agents.evals import judges

assessment = judges.correctness(
request="What is the difference between reduceByKey and groupByKey in Spark?",
response="reduceByKey aggregates data before shuffling, whereas groupByKey shuffles all data, making reduceByKey more efficient.",
expected_facts=[
"reduceByKey aggregates data before shuffling",
"groupByKey shuffles all data",
]
)
print(assessment)

Que faire lorsqu'une réponse est incorrecte ?

Lorsqu'un agent répond par une réponse factuellement inexacte, vous devez :

  • Comprenez si le contexte récupéré par l'agent est non pertinent ou inexact. Pour les applications RAG, vous pouvez utiliser le juge Suffisance du contexte pour déterminer si le contexte est suffisant pour générer le expected_facts ou le expected_response.
  • S'il y a suffisamment de contexte, ajustez l'invite pour inclure les informations pertinentes.

Pertinence par rapport à la query

Définition : la réponse est-elle pertinente par rapport à la demande d'entrée ?

Requiert une vérité terrain : Non.

La pertinence garantit que la réponse de l'agent aborde directement la saisie de l'utilisateur sans dévier vers des sujets non pertinents.

Entrées requises

L'ensemble d'évaluation d'entrée doit contenir les colonnes suivantes :

  • request
  • response si vous n'avez pas spécifié le model paramètre à mlflow.evaluate().

Exemples

Utiliser la pertinence d'un ensemble d'évaluation :

Python
import mlflow

eval_set = [{
"request": "What is the capital of France?",
"response": "The capital of France is Paris."
}]

mlflow.evaluate(
data=eval_set,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {
"metrics": ["relevance_to_query"]
}
}
)

Utiliser la pertinence avec le SDK de jugement appelable:

Python
from databricks.agents.evals import judges

assessment = judges.relevance_to_query(
request="What is the capital of France?",
response="The capital of France is Paris."
)
print(assessment)

Que faire lorsqu'une réponse n'est pas pertinente ?

Lorsque l'agent fournit une réponse non pertinente, suivez les étapes suivantes :

  • Évaluez la compréhension du modèle de la requête et ajustez son récupérateur, ses données d'entraînement ou ses instructions d'invite en conséquence.

Suffisance du contexte

Définition : Les documents récupérés sont-ils suffisants pour produire la réponse attendue ?

**Nécessite la vérité terrain** : Oui, expected_facts expected_responseou.

La suffisance du contexte évalue si les documents récupérés fournissent toutes les informations nécessaires pour générer la réponse attendue.

Entrées requises

L'ensemble d'évaluation d'entrée doit contenir les colonnes suivantes :

  • request
  • response si vous n'avez pas spécifié le model paramètre à mlflow.evaluate().
  • expected_facts ou expected_response. Consultez les directivesexpected_facts et les directivesexpected_response.
  • retrieved_context[].content si vous n'avez pas spécifié le model paramètre à mlflow.evaluate().

Exemples

Utiliser la pertinence du contexte d'un ensemble d'évaluation :

Python
import mlflow

eval_set = [{
"request": "What is the capital of France?",
"response": "The capital of France is Paris.",
"retrieved_context": [
{"content": "Paris is the capital city of France."}
],
"expected_facts": [
"Paris"
]
}]

mlflow.evaluate(
data=eval_set,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {
"metrics": ["context_sufficiency"]
}
}
)

Utilisez la suffisance du contexte avec le SDK de juge invocable:

Python
from databricks.agents.evals import judges

assessment = judges.context_sufficiency(
request="What is the capital of France?",
retrieved_context=[
{"content": "Paris is the capital city of France."}
]
)
print(assessment)

Que faire lorsque le contexte est insuffisant ?

Lorsque le contexte est insuffisant :

  • Améliorez le mécanisme de récupération pour vous assurer que tous les documents nécessaires sont inclus.
  • Modifiez l'invite du modèle pour faire explicitement référence aux informations manquantes ou pour prioriser le contexte pertinent.

Sécurité

Définition : la réponse évite-t-elle les contenus nocifs ou toxiques ?

Requiert une vérité terrain : Non.

La sécurité garantit que les réponses de l'agent ne contiennent pas de contenu nuisible, offensant ou toxique.

Entrées requises

L'ensemble d'évaluation d'entrée doit contenir les colonnes suivantes :

  • request
  • response si vous n'avez pas spécifié le model paramètre à mlflow.evaluate().

Exemples

Utilisez la sécurité d'un ensemble d'évaluation :

Python
import mlflow

eval_set = [{
"request": "What is the capital of France?",
"response": "The capital of France is Paris."
}]

mlflow.evaluate(
data=eval_set,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {
"metrics": ["safety"]
}
}
)

Utilisez la sécurité avec le SDK de juge invocable:

Python
from databricks.agents.evals import judges

assessment = judges.safety(
request="What is the capital of France?",
response="The capital of France is Paris."
)
print(assessment)

Que faire lorsque la réponse est dangereuse ?

Lorsque la réponse contient un contenu nocif :

  • Analysez la requête pour identifier si elle pourrait par inadvertance mener à des réponses dangereuses. Modifiez l'entrée si nécessaire.
  • Affinez le modèle ou le prompt pour éviter explicitement de générer du contenu nuisible ou toxique.
  • Utilisez des mécanismes de sécurité supplémentaires, tels que des filtres de contenu, pour intercepter les réponses dangereuses avant qu'elles ne parviennent à l'utilisateur.

Ancrage

Définition : La réponse est-elle factuellement cohérente avec le contexte récupéré ?

Requiert une vérité terrain : Non.

L'ancrage évalue si la réponse de l'agent est alignée avec les informations fournies dans le contexte récupéré.

Entrées requises

L'ensemble d'évaluation d'entrée doit contenir les colonnes suivantes :

  • request
  • response si vous n'avez pas spécifié le model paramètre à mlflow.evaluate().
  • retrieved_context[].content si vous n'utilisez pas l'argument model dans l'appel à mlflow.evaluate().

Exemples

Utilisez l'ancrage à partir d'un ensemble d'évaluation :

Python
import mlflow

eval_set = [{
"request": "What is the capital of France?",
"response": "The capital of France is Paris.",
"retrieved_context": [
{"content": "Paris is the capital city of France."}
]
}]

mlflow.evaluate(
data=eval_set,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {
"metrics": ["groundedness"]
}
}
)

Utilisez l'ancrage avec le SDK de juge invocable:

Python
from databricks.agents.evals import judges

assessment = judges.groundedness(
request="What is the capital of France?",
response="The capital of France is Paris.",
retrieved_context=[
{"content": "Paris is the capital city of France."}
]
)
print(assessment)

Que faire lorsque la réponse manque d'ancrage ?

Lorsque la réponse n'est pas fondée :

  • Examinez le contexte récupéré pour vous assurer qu'il contient les informations nécessaires pour générer la réponse attendue.
  • Si le contexte est insuffisant, améliorez le mécanisme de récupération ou le dataset pour inclure les documents pertinents.
  • Modifiez l'invite pour demander au modèle de prioriser l'utilisation du contexte récupéré lors de la génération des réponses.

Pertinence des segments

Définition : les segments récupérés sont-ils pertinents pour la demande d’entrée ?

Requiert une vérité terrain : Non.

La pertinence des segments mesure si chaque segment est pertinent pour la demande d'entrée.

Entrées requises

L'ensemble d'évaluation d'entrée doit contenir les colonnes suivantes :

  • request
  • retrieved_context[].content si vous n'avez pas spécifié le model paramètre à mlflow.evaluate().

Si vous n'utilisez pas l'argument model dans l'appel à mlflow.evaluate(), vous devez également fournir retrieved_context[].content ou trace.

Exemples

Cet exemple utilise l'évaluateur de pertinence des segments avec une métrique de précision personnalisée pour calculer un score de précision au niveau des lignes. Pour plus de détails sur les métriques personnalisées, consultez Métriques personnalisées (MLflow 2)

Python
import mlflow
from mlflow.evaluation import Assessment

eval_set = [{
"request": "What is the capital of France?",
"response": "The capital of France is Paris.",
"retrieved_context": [
{"content": "Paris is the capital city of France."},
{"content": "The best baguettes are in Nice."},
{"content": "Mount Everest is the highest mountain in the world."},
],
}]

def judged_precision_at_k(request, retrieved_context, k):
judged_precisions = [judges.chunk_relevance(request, [doc]) for doc in retrieved_context[:k]]
precision_at_k = sum([1 if judgement[0].value =='yes' else 0 for judgement in judged_precisions]) / k

rationales = [
f"""## Chunk ID {i+1}: `{retrieved_context[i]['doc_uri']}`
- **{judged_precisions[i][0].value}**: `{judged_precisions[i][0].rationale}`"""
for i in range(0, k-1)]

return Assessment(name=f'judged_precision_at_{k}', value=precision_at_k, rationale='\n'.join(rationales))

@metric
def judged_precision_at_3(request, retrieved_context):
k = 3
return judged_precision_at_k(request=request, retrieved_context=retrieved_context, k=k)

mlflow.evaluate(
data=eval_set,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {
"metrics": ["chunk_relevance"]
}
},
extra_metrics=[judged_precision_at_3]
)

Utilisez chunk_relevance avec le SDK de juge invocable:

Python
from databricks.agents.evals import judges

# NOTE: This callable judge returns an assessment per item in the retrieved context.
assessments = judges.chunk_relevance(
request="What is the capital of France?",
retrieved_context=[
{"content": "Paris is the capital city of France."},
{"content": "The chicken crossed the road."},
]
)
print(assessments)

Que faire lorsque les fragments récupérés sont non pertinents ?

Lorsque des segments non pertinents sont récupérés :

  • Évaluez la configuration du récupérateur et ajustez les paramètres pour prioriser la pertinence.
  • Affinez les données d’entraînement du récupérateur afin d’inclure des exemples plus diversifiés ou plus précis.

Rappel de document

Définition : combien des documents pertinents connus le récupérateur a-t-il trouvés ?

Nécessite une vérité terrain : Oui, expected_retrieved_context[].doc_uri.

Le rappel de document mesure la proportion de documents pertinents pour la vérité terrain qui ont été récupérés par rapport au nombre total de documents pertinents dans la vérité terrain.

Entrées requises

L'ensemble d'évaluation d'entrée doit avoir la colonne suivante :

  • expected_retrieved_context[].doc_uri

De plus, si vous n'utilisez pas l'argument model dans l'appel à mlflow.evaluate(), vous devez également fournir soit retrieved_context[].doc_uri, soit trace.

Exemples

Utilisez le rappel de document à partir d'un ensemble d'évaluation :

Python
import mlflow

eval_set = [{
"request": "What is the capital of France?",
"expected_retrieved_context": [
{"doc_uri": "doc_123"},
{"doc_uri": "doc_456"}
],
"retrieved_context": [
{"doc_uri": "doc_123"}
]
}]

mlflow.evaluate(
data=eval_set,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {
"metrics": ["document_recall"]
}
}
)

Il n’existe pas de SDK de juge appelable pour cette métrique, car elle n’utilise pas de juge AI.

Que faire lorsque le rappel de document est faible ?

Lorsque le rappel est faible :

  • Vérifiez que les données de vérité terrain reflètent fidèlement les documents pertinents.
  • Améliorez le récupérateur ou ajustez les paramètres de recherche pour augmenter le rappel.

Juges AI personnalisés

Vous pouvez également créer un juge personnalisé pour effectuer des évaluations spécifiques à votre cas d’utilisation.

Pour plus de détails, consultez :