Migrer vers MLflow 3 depuis Agent Evaluation
Agent Evaluation est maintenant intégré à MLflow 3 sur Databricks. Les méthodes du SDK Agent Evaluation sont désormais exposées via le SDK mlflow[databricks]>=3.1, sous l'espace de noms mlflow.genai. MLflow 3 présente :
- Interface utilisateur actualisée qui reflète toutes les fonctionnalités du SDK
- Nouveau SDK
mlflow.genaiavec des APIs simplifiées pour l'évaluation, l'annotation humaine et la gestion des datasets d'évaluation - **Traçage amélioré** avec un backend d’ingestion de traces à l’échelle de la production qui offre une observabilité en temps réel
- **Collecte optimisée des feedbacks humains**
- Juges LLM améliorés en tant qu'évaluateurs intégrés
Ce guide vous aide à migrer d'Agent Evaluation (MLflow 2.x avec databricks-agents<1.0) vers MLflow 3. Ce guide détaillé est également disponible au format référence rapide.
MLflow 3 avec Agent Evaluation fonctionne uniquement sur Managed MLflow, et non sur MLflow open source. Consultez la page MLflow géré vs open source pour mieux comprendre les différences entre MLflow géré et open source.
Liste de contrôle de la migration
start by using this checklist. Chaque élément contient des liens vers des détails dans les sections ci-dessous.
API d'évaluation
-
Mettre à jour les importations de
databricks.agentsversmlflow.genai.* -
Remplacer
mlflow.evaluate()parmlflow.genai.evaluate()- Mettre à jour les noms des paramètres (
model→predict_fn,extra_metrics→scorers) - Mettre à jour les noms des champs de données (
request→inputs,response→outputs,expected*→expectations) - Remplacez
evaluator_configpar une configuration au niveau du scorer - Mettre à jour l'accès aux résultats pour utiliser
mlflow.search_traces()
- Mettre à jour les noms des paramètres (
juges LLM
- Remplacer les appels de juge directs par des évaluateurs prédéfinis lorsque cela est possible
- Mettre à jour
judges.guideline_adherence()vers l'évaluateurjudges.meets_guidelines()ouGuidelines() - Mettre à jour les noms des paramètres de fonction de jugement pour qu'ils correspondent à la nouvelle API
- Envisagez d'utiliser
ExpectationsGuidelines()pour les directives basées sur la vérité terrain
Feedback humain
- Mettre à jour la session d'étiquetage et examiner les importations d'applications vers
mlflow.genai.labeling - Mettre à jour les importations de schéma d'étiquetage vers
mlflow.genai.label_schemas - Mettre à jour la logique de synchronisation des commentaires aux datasets
Pièges courants à éviter
- N'oubliez pas de mettre à jour les noms de champs de données dans vos DataFrames.
- N'oubliez pas que
model_type="databricks-agent"n'est plus nécessaire - Assurez-vous que les scoreurs personnalisés renvoient des valeurs valides (“yes”/“no” pour réussi/échec)
- Utilisez
search_traces()au lieu d'accéder directement aux tables de résultats - Mettez à jour toutes les références d'espace de noms codées en dur dans votre code
- N'oubliez pas de spécifier explicitement tous les évaluateurs : MLflow 3 n'exécute pas automatiquement les juges
- Convertir
global_guidelinesde la configuration en évaluateursGuidelines()explicites
Migration de l'API d'évaluation
Mises à jour des importations
La liste ci-dessous récapitule les imports à mettre à jour, avec des détails et des exemples dans chaque sous-section ci-dessous.
# Old imports
from mlflow import evaluate
from databricks.agents.evals import metric
from databricks.agents.evals import judges
# New imports
from mlflow.genai import evaluate
from mlflow.genai.scorers import scorer
from mlflow.genai import judges
# For predefined scorers:
from mlflow.genai.scorers import (
Correctness, Guidelines, ExpectationsGuidelines,
RelevanceToQuery, Safety, RetrievalGroundedness,
RetrievalRelevance, RetrievalSufficiency
)
De mlflow.evaluate() à mlflow.genai.evaluate()
L'API d'évaluation principale a été déplacée vers un espace de noms GenAI dédié avec des noms de parameter plus clairs.
MLflow 2.x | MLflow 3.x | Notes |
|---|---|---|
|
| Nouvel espace de noms |
|
| Nom plus descriptif |
| Non nécessaire | Détecté automatiquement |
|
| Terminologie plus claire |
| Non nécessaire | Partie des évaluateurs |
Mappage de champs de données :
Champ MLflow 2.x | Champ MLflow 3.x | Description |
|---|---|---|
|
| Entrée de l'agent |
|
| Sortie de l'agent |
|
| Vérité terrain |
| Accessible via des traces | Contexte de la trace |
| Partie de la configuration de l'évaluateur | Déplacé au niveau de l'évaluateur |
Exemple : évaluation de base
MLflow 2.x :
import mlflow
import pandas as pd
eval_data = [
{
"request": "What is MLflow?",
"response": "MLflow is the largest open source AI engineering platform for agents, LLMs, and ML models.",
"expected_response": "MLflow is the largest open source AI engineering platform for agents, LLMs, and ML models.",
},
{
"request": "What is Databricks?",
"response": "Databricks is a unified analytics platform.",
"expected_response": "Databricks is a unified analytics platform for big data and AI.",
},
]
# Note: By default, MLflow 2.x runs all applicable judges automatically
results = mlflow.evaluate(
data=eval_data,
model=my_agent,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {
# Optional: limit to specific judges
# "metrics": ["correctness", "safety"],
# Optional: add global guidelines
"global_guidelines": {
"clarity": ["Response must be clear and concise"]
}
}
}
)
# Access results
eval_df = results.tables['eval_results']
MLflow 3.x :
import mlflow
import pandas as pd
from mlflow.genai.scorers import Guidelines
eval_data = [
{
"inputs": {"request": "What is MLflow?"},
"outputs": {
"response": "MLflow is the largest open source AI engineering platform for agents, LLMs, and ML models."
},
"expectations": {
"expected_response":
"MLflow is the largest open source AI engineering platform for agents, LLMs, and ML models.",
},
},
{
"inputs": {"request": "What is Databricks?"},
"outputs": {"response": "Databricks is a unified analytics platform."},
"expectations": {
"expected_response":
"Databricks is a unified analytics platform for big data and AI.",
},
},
]
# Define guidelines for scorer
guidelines = {
"clarity": ["Response must be clear and concise"],
# supports str or list[str]
"accuracy": "Response must be factually accurate",
}
print("Running evaluation with mlflow.genai.evaluate()...")
with mlflow.start_run(run_name="basic_evaluation_test") as run:
# Run evaluation with new API
# Note: Must explicitly specify which scorers to run (no automatic selection)
results = mlflow.genai.evaluate(
data=eval_data,
scorers=[
Correctness(), # Requires expectations.expected_response
RelevanceToQuery(), # No ground truth needed
Guidelines(name="clarity", guidelines=guidelines["clarity"]),
Guidelines(name="accuracy", guidelines=guidelines["accuracy"]),
# ExpectationsGuidelines(),
# Add more scorers as needed: Safety(), RetrievalGroundedness(), etc.
],
)
# Access results using search_traces
traces = mlflow.search_traces(
run_id=results.run_id,
)
Accéder aux résultats d'évaluation
Dans MLflow 3, les résultats d'évaluation sont stockés sous forme de traces avec des évaluations. Utilisez mlflow.search_traces() pour accéder aux résultats détaillés :
# Access results using search_traces
traces = mlflow.search_traces(
run_id=results.run_id,
)
# Access assessments for each trace
for trace in traces:
assessments = trace.info.assessments
for assessment in assessments:
print(f"Scorer: {assessment.name}")
print(f"Value: {assessment.value}")
print(f"Rationale: {assessment.rationale}")
Évaluation d'un MLflow LoggedModel
Dans MLflow 2.x, vous pouviez transmettre un modèle MLflow enregistré (tel qu'un modèle PyFunc ou un modèle enregistré par des agents personnalisés) directement à mlflow.evaluate(). Dans MLflow 3.x, vous devez encapsuler le modèle dans une fonction de prédiction pour gérer le mappage des paramètres.
Ce wrapper est nécessaire car mlflow.genai.evaluate() attend une fonction de prédiction qui accepte les clés du dictionnaire inputs de votre dataset comme arguments nommés, tandis que la plupart des modèles journalisés acceptent un seul parameter d'entrée (par exemple, model_inputs pour les modèles PyFunc ou des interfaces similaires pour les modèles LangChain).
La fonction de prédiction sert de couche de traduction entre les paramètres nommés du framework d'évaluation et le format d'entrée attendu du modèle.
import mlflow
from mlflow.genai.scorers import Safety
# Make sure to load your logged model outside of the predict_fn so MLflow only loads it once!
model = mlflow.pyfunc.load_model("models:/chatbot/staging")
def evaluate_model(question: str) -> dict:
return model.predict({"question": question})
results = mlflow.genai.evaluate(
data=[{"inputs": {"question": "Tell me about MLflow"}}],
predict_fn=evaluate_model,
scorers=[Safety()]
)
Migration des métriques personnalisées vers les scorers
Les fonctions d'évaluation personnalisées (@metric) utilisent maintenant le décorateur @scorer avec une signature simplifiée.
MLflow 2.x | MLflow 3.x | Notes |
|---|---|---|
|
| Nouveau nom |
|
| Plus simple |
Plusieurs paramètres attendus : * | Param | Consolidé |
| Fait partie de | Plus simple |
|
| Nomenclature cohérente |
|
| Nomenclature cohérente |
Exemple : Évaluateur de réussite/échec
MLflow 2.x :
from databricks.agents.evals import metric
@metric
def response_length_check(request, response, expected_response=None):
"""Check if response is within acceptable length."""
length = len(response)
return "yes" if 50 <= length <= 500 else "no"
# Use in evaluation
results = mlflow.evaluate(
data=eval_data,
model=my_agent,
model_type="databricks-agent",
extra_metrics=[response_length_check]
)
MLflow 3.x :
import mlflow
from mlflow.genai.scorers import scorer
# Sample agent function
@mlflow.trace
def my_agent(request: str):
"""Simple mock agent for testing - MLflow 3 expects dict input"""
responses = {
"What is MLflow?": "MLflow is the largest open source AI engineering platform for agents, LLMs, and ML models.",
"What is Databricks?": "Databricks is a unified analytics platform.",
}
return {"response": responses.get(request, "I don't have information about that.")}
@scorer
def response_length_check(inputs, outputs, expectations=None, traces=None):
"""Check if response is within acceptable length."""
length = len(outputs)
return "yes" if 50 <= length <= 500 else "no"
# Use in evaluation
results = mlflow.genai.evaluate(
data=eval_data,
predict_fn=my_agent,
scorers=[response_length_check]
)
Exemple : Évaluateur numérique avec évaluation
MLflow 2.x :
from databricks.agents.evals import metric, Assessment
def calculate_similarity(response, expected_response):
return 1
@metric
def semantic_similarity(response, expected_response):
"""Calculate semantic similarity score."""
# Your similarity logic here
score = calculate_similarity(response, expected_response)
return Assessment(
name="semantic_similarity",
value=score,
rationale=f"Similarity score based on embedding distance: {score:.2f}"
)
MLflow 3.x :
from mlflow.genai.scorers import scorer
from mlflow.entities import Feedback
@scorer
def semantic_similarity(outputs, expectations):
"""Calculate semantic similarity score."""
# Your similarity logic here
expected = expectations.get("expected_response", "")
score = calculate_similarity(outputs, expected)
return Feedback(
name="semantic_similarity",
value=score,
rationale=f"Similarity score based on embedding distance: {score:.2f}"
)
Migration des juges LLM
Différences clés dans le comportement du juge.
Sélection automatique du juge :
MLflow 2.x | MLflow 3.x |
|---|---|
Exécute automatiquement tous les juges applicables en fonction des données | Doit explicitement spécifier quels évaluateurs utiliser |
Utilisez | Passez les scorers souhaités dans le parameter |
| Utiliser l’évaluateur |
Juges sélectionnés en fonction des champs de données disponibles | Vous contrôlez exactement quels évaluateurs s'exécutent. |
MLflow 2.x : sélection automatique du juge :
- Sans vérité terrain : exécute
chunk_relevance,groundedness,relevance_to_query,safety,guideline_adherence - Avec vérité terrain : exécute également
context_sufficiency,correctness
MLflow 3.x : sélection explicite de l'évaluateur :
- Vous devez explicitement lister les évaluateurs que vous souhaitez exécuter.
- Plus de contrôle, mais nécessite d'être explicite quant aux besoins d'évaluation
Chemins de migration
Cas d'usage | MLflow 2.x | MLflow 3.x recommandé. |
|---|---|---|
Vérification de la correction de base |
|
|
Évaluation de la sécurité |
|
|
Directives globales |
|
|
Directives par ligne d'ensemble d'évaluation |
|
|
Vérifiez le soutien factuel. |
|
|
Vérifiez la pertinence du contexte |
|
|
Vérifier la pertinence des segments de contexte |
|
|
Vérifier que le contexte est complet |
|
|
Logique personnalisée complexe | Appels directs de juges dans | Évaluateurs prédéfinis ou |
MLflow 3 propose deux manières d'utiliser les juges LLM :
- **Évaluateurs prédéfinis** – Évaluateurs prêts à l'emploi qui encapsulent les juges avec une analyse automatique des traces
- **Appels directs du juge** – Appelez les juges directement au sein des évaluateurs personnalisés pour un contrôle accru
Contrôle des juges exécutés
Exemple : spécifier les juges à exécuter
MLflow 2.x (juges default limitants) :
import mlflow
# By default, runs all applicable judges
# Use evaluator_config to limit which judges run
results = mlflow.evaluate(
data=eval_data,
model=my_agent,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {
# Only run these specific judges
"metrics": ["groundedness", "relevance_to_query", "safety"]
}
}
)
MLflow 3.x (sélection explicite du scorer) :
from mlflow.genai.scorers import (
RetrievalGroundedness,
RelevanceToQuery,
Safety
)
# Must explicitly specify which scorers to run
results = mlflow.genai.evaluate(
data=eval_data,
predict_fn=my_agent,
scorers=[
RetrievalGroundedness(),
RelevanceToQuery(),
Safety()
]
)
Exemple de migration complet
Cet exemple montre la migration d'une évaluation qui utilise plusieurs juges avec une configuration personnalisée :
MLflow 2.x :
from databricks.agents.evals import judges, metric
import mlflow
# Custom metric using judge
@metric
def check_no_pii(request, response, retrieved_context):
"""Check if retrieved context contains PII."""
context_text = '\n'.join([c['content'] for c in retrieved_context])
return judges.guideline_adherence(
request=request,
guidelines=["The context must not contain personally identifiable information."],
guidelines_context={"retrieved_context": context_text}
)
# Define global guidelines
global_guidelines = {
"tone": ["Response must be professional and courteous"],
"format": ["Response must use bullet points for lists"]
}
# Run evaluation with multiple judges
results = mlflow.evaluate(
data=eval_data,
model=my_agent,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {
# Specify subset of built-in judges
"metrics": ["correctness", "groundedness", "safety"],
# Add global guidelines
"global_guidelines": global_guidelines
}
},
# Add custom judge
extra_metrics=[check_no_pii]
)
MLflow 3.x :
from mlflow.genai.scorers import (
Correctness,
RetrievalGroundedness,
Safety,
Guidelines,
scorer
)
from mlflow.genai import judges
import mlflow
# Custom scorer using judge
@scorer
def check_no_pii(inputs, outputs, traces):
"""Check if retrieved context contains PII."""
# Extract retrieved context from trace
retrieved_context = traces.data.spans[0].attributes.get("retrieved_context", [])
context_text = '\n'.join([c['content'] for c in retrieved_context])
return judges.meets_guidelines(
name="no_pii",
context={
"request": inputs,
"retrieved_context": context_text
},
guidelines=["The context must not contain personally identifiable information."]
)
# Run evaluation with explicit scorers
results = mlflow.genai.evaluate(
data=eval_data,
predict_fn=my_agent,
scorers=[
# Built-in scorers (explicitly specified)
Correctness(),
RetrievalGroundedness(),
Safety(),
# Global guidelines as scorers
Guidelines(name="tone", guidelines="Response must be professional and courteous"),
Guidelines(name="format", guidelines="Response must use bullet points for lists"),
# Custom scorer
check_no_pii
]
)
Migration vers des évaluateurs de juges prédéfinis
MLflow 3 fournit des évaluateurs prédéfinis qui englobent les juges LLM, ce qui les rend plus faciles à utiliser avec mlflow.genai.evaluate().
Exemple : juge d'exactitude
MLflow 2.x :
from databricks.agents.evals import judges, metric
@metric
def check_correctness(request, response, expected_response):
"""Check if response is correct."""
return judges.correctness(
request=request,
response=response,
expected_response=expected_response
)
# Use in evaluation
results = mlflow.evaluate(
data=eval_data,
model=my_agent,
model_type="databricks-agent",
extra_metrics=[check_correctness]
)
MLflow 3.x (Option 1 : Utilisation d'un évaluateur prédéfini) :
from mlflow.genai.scorers import Correctness
# Use predefined scorer directly
results = mlflow.genai.evaluate(
data=eval_data,
predict_fn=my_agent,
scorers=[Correctness()]
)
MLflow 3.x (Option 2 : évaluateur personnalisé avec juge) :
from mlflow.genai.scorers import scorer
from mlflow.genai import judges
@scorer
def check_correctness(inputs, outputs, expectations):
"""Check if response is correct."""
return judges.correctness(
request=inputs,
response=outputs,
expected_response=expectations.get("expected_response", "")
)
# Use in evaluation
results = mlflow.genai.evaluate(
data=eval_data,
predict_fn=my_agent,
scorers=[check_correctness]
)
Exemple : Juge de sécurité
MLflow 2.x :
from databricks.agents.evals import judges, metric
@metric
def check_safety(request, response):
"""Check if response is safe."""
return judges.safety(
request=request,
response=response
)
MLflow 3.x :
from mlflow.genai.scorers import Safety
# Use predefined scorer
results = mlflow.genai.evaluate(
data=eval_data,
predict_fn=my_agent,
scorers=[Safety()]
)
Exemple : Juge de pertinence
MLflow 2.x :
from databricks.agents.evals import judges, metric
@metric
def check_relevance(request, response):
"""Check if response is relevant to query."""
return judges.relevance_to_query(
request=request,
response=response
)
MLflow 3.x :
from mlflow.genai.scorers import RelevanceToQuery
# Use predefined scorer
results = mlflow.genai.evaluate(
data=eval_data,
predict_fn=my_agent,
scorers=[RelevanceToQuery()]
)
Exemple : Juge de l'ancrage
MLflow 2.x :
from databricks.agents.evals import judges, metric
@metric
def check_groundedness(response, retrieved_context):
"""Check if response is grounded in context."""
context_text = '\n'.join([c['content'] for c in retrieved_context])
return judges.groundedness(
response=response,
context=context_text
)
MLflow 3.x :
from mlflow.genai.scorers import RetrievalGroundedness
# Use predefined scorer (automatically extracts context from trace)
results = mlflow.genai.evaluate(
data=eval_data,
predict_fn=my_agent,
scorers=[RetrievalGroundedness()]
)
Migration de la conformité aux directives vers meets_guidelines
Le juge guideline_adherence a été renommé en meets_guidelines avec une API plus propre.
MLflow 2.x :
from databricks.agents.evals import judges, metric
@metric
def check_tone(request, response):
"""Check if response follows tone guidelines."""
return judges.guideline_adherence(
request=request,
response=response,
guidelines=["The response must be professional and courteous."]
)
@metric
def check_policies(request, response, retrieved_context):
"""Check if response follows company policies."""
context_text = '\n'.join([c['content'] for c in retrieved_context])
return judges.guideline_adherence(
request=request,
guidelines=["Response must comply with return policy in context."],
guidelines_context={
"response": response,
"retrieved_context": context_text
}
)
MLflow 3.x (Option 1 : Utilisation d'un évaluateur de lignes directrices prédéfini) :
from mlflow.genai.scorers import Guidelines
# For simple guidelines that only need request/response
results = mlflow.genai.evaluate(
data=eval_data,
predict_fn=my_agent,
scorers=[
Guidelines(
name="tone",
guidelines="The response must be professional and courteous."
)
]
)
MLflow 3.x (Option 2 : Scorer personnalisé avec meets_guidelines) :
from mlflow.genai.scorers import scorer
from mlflow.genai import judges
@scorer
def check_policies(inputs, outputs, traces):
"""Check if response follows company policies."""
# Extract retrieved context from trace
retrieved_context = traces.data.spans[0].attributes.get("retrieved_context", [])
context_text = '\n'.join([c['content'] for c in retrieved_context])
return judges.meets_guidelines(
name="policy_compliance",
guidelines="Response must comply with return policy in context.",
context={
"request": inputs,
"response": outputs,
"retrieved_context": context_text
}
)
Exemple : Migration des ExpectationsGuidelines
Lorsque vous souhaitez définir des directives pour chaque exemple de votre ensemble d'évaluation, comme exiger que certains sujets soient traités, ou que la réponse suive un style spécifique, utilisez le scoreur ExpectationsGuidelines dans MLflow 3.x.
MLflow 2.x :
Dans MLflow 2.x, vous implémenteriez des directives comme suit :
import pandas as pd
eval_data = {
"request": "What is MLflow?",
"response": "MLflow is the largest open source AI engineering platform for agents, LLMs, and ML models.",
"guidelines": [
["The response must mention these topics: platform, observability, testing"]
],
}
eval_df = pd.DataFrame(eval_data)
mlflow.evaluate(
data=eval_df,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {"metrics": ["guideline_adherence"]}
}
)
MLflow 3.x :
Dans MLflow 3.x, vous organisez les données d'évaluation différemment. Chaque entrée dans vos données d'évaluation doit avoir une clé expectations, et à l'intérieur, vous pouvez inclure des champs comme guidelines.
Voici à quoi pourraient ressembler vos données d'évaluation :
eval_data = [
{
"inputs": {"input": "What is MLflow?"},
"outputs": {"response": "MLflow is the largest open source AI engineering platform for agents, LLMs, and ML models."},
"expectations": {
"guidelines": [
"The response should mention the topics: platform, observability, and testing."
]
}
}
]
Ensuite, utilisez l'évaluateur ExpectationsGuidelines :
import mlflow
from mlflow.genai.scorers import ExpectationsGuidelines
expectations_guideline = ExpectationsGuidelines()
# Use predefined scorer
results = mlflow.genai.evaluate(
data=eval_data, # Make sure each row has expectations.guidelines
predict_fn=my_app,
scorers=[
expectations_guideline
]
)
Si vous devez vérifier un contenu factuel spécifique (par ex. : « MLflow est open source »), utilisez le correcteur d'exactitude avec un champ expected_facts au lieu des directives. Voir le correcteur.
Réplication du comportement automatique du juge MLflow 2.x
Pour reproduire le comportement de MLflow 2.x qui consiste à exécuter tous les juges applicables, incluez explicitement tous les scorers :
MLflow 2.x (automatique) :
# Automatically runs all applicable judges based on data
results = mlflow.evaluate(
data=eval_data, # Contains expected_response and retrieved_context
model=my_agent,
model_type="databricks-agent"
)
MLflow 3.x (explicite) :
from mlflow.genai.scorers import (
Correctness, RetrievalSufficiency, # Require ground truth
RelevanceToQuery, Safety, RetrievalGroundedness, RetrievalRelevance # No ground truth
)
# Manually specify all judges you want to run
results = mlflow.genai.evaluate(
data=eval_data,
predict_fn=my_agent,
scorers=[
# With ground truth judges
Correctness(),
RetrievalSufficiency(),
# Without ground truth judges
RelevanceToQuery(),
Safety(),
RetrievalGroundedness(),
RetrievalRelevance(),
]
)
Utilisation directe du juge
Vous pouvez toujours appeler les juges directement pour les tests :
from mlflow.genai import judges
# Test a judge directly (same in both versions)
result = judges.correctness(
request="What is MLflow?",
response="MLflow is the largest open source AI engineering platform for agents, LLMs, and ML models.",
expected_response="MLflow is the largest open source AI engineering platform for agents, LLMs, and ML models."
)
print(f"Judge result: {result.value}")
print(f"Rationale: {result.rationale}")
Migration du feedback humain
Sessions et schémas d'étiquetage
La fonctionnalité de l'application de révision a été déplacée de databricks.agents vers mlflow.genai.labeling.
Modifications de l'espace de noms :
MLflow 2.x | MLflow 3.x |
|---|---|
|
|
|
|
|
|
|
|
Exemple : Création d'une session d'étiquetage
MLflow 2.x :
from databricks.agents import review_app
import mlflow
# Get review app
my_app = review_app.get_review_app()
# Create custom label schema
quality_schema = my_app.create_label_schema(
name="response_quality",
type="feedback",
title="Rate the response quality",
input=review_app.label_schemas.InputCategorical(
options=["Poor", "Fair", "Good", "Excellent"]
)
)
# Create labeling session
session = my_app.create_labeling_session(
name="quality_review_jan_2024",
agent="my_agent",
assigned_users=["user1@company.com", "user2@company.com"],
label_schemas=[
review_app.label_schemas.EXPECTED_FACTS,
"response_quality"
]
)
# Add traces for labeling
traces = mlflow.search_traces(run_id=run_id)
session.add_traces(traces)
MLflow 3.x :
import mlflow
import mlflow.genai.labeling as labeling
import mlflow.genai.label_schemas as schemas
# Create custom label schema
quality_schema = schemas.create_label_schema(
name="response_quality",
type=schemas.LabelSchemaType.FEEDBACK,
title="Rate the response quality",
input=schemas.InputCategorical(
options=["Poor", "Fair", "Good", "Excellent"]
),
overwrite=True
)
# Previously built in schemas must be created before use
# However, constant for their names are provided to ensure your schemas work with built-in scorers
expected_facts_schema = schemas.create_label_schema(
name=schemas.EXPECTED_FACTS,
type=schemas.LabelSchemaType.EXPECTATION,
title="Expected facts",
input=schemas.InputTextList(max_length_each=1000),
instruction="Please provide a list of facts that you expect to see in a correct response.",
overwrite=True
)
# Create labeling session
session = labeling.create_labeling_session(
name="quality_review_jan_2024",
assigned_users=["user1@company.com", "user2@company.com"],
label_schemas=[
schemas.EXPECTED_FACTS,
"response_quality"
]
)
# Add traces for labeling
traces = mlflow.search_traces(
run_id=session.mlflow_run_id
)
session.add_traces(traces)
# Get review app URL
app = labeling.get_review_app()
print(f"Review app URL: {app.url}")
Synchronisation du feedback vers les datasets
MLflow 2.x :
# Sync expectations back to dataset
session.sync(to_dataset="catalog.schema.eval_dataset")
# Use dataset for evaluation
dataset = spark.read.table("catalog.schema.eval_dataset")
results = mlflow.evaluate(
data=dataset,
model=my_agent,
model_type="databricks-agent"
)
MLflow 3.x :
from mlflow.genai import datasets
import mlflow
# Sample agent function
@mlflow.trace
def my_agent(request: str):
"""Simple mock agent for testing - MLflow 3 expects dict input"""
responses = {
"What is MLflow?": "MLflow is the largest open source AI engineering platform for agents, LLMs, and ML models.",
"What is Databricks?": "Databricks is a unified analytics platform.",
}
return {"response": responses.get(request, "I don't have information about that.")}
# Sync expectations back to dataset
session.sync(to_dataset="catalog.schema.eval_dataset")
# Use dataset for evaluation
dataset = datasets.get_dataset("catalog.schema.eval_dataset")
results = mlflow.genai.evaluate(
data=dataset,
predict_fn=my_agent
)
Ressources supplémentaires
- Guide d'évaluation MLflow GenAI
- Documentation des évaluateurs personnalisés
- Retour d'expérience humain avec les sessions d'étiquetage
- Évaluateurs de juge prédéfinis
- MLflow Tracing Guide
Pour une assistance supplémentaire lors de la migration, consultez la documentation MLflow ou contactez votre équipe de support Databricks.