Migrar para o MLflow 3 a partir da Avaliação do agente
A avaliação de agentes agora está integrada ao MLflow 3 no Databricks. Os métodos do SDK de avaliação de agentes agora são expostos por meio do SDK mlflow[databricks]>=3.1
, no namespace mlflow.genai
. O MLflow 3 apresenta:
- Interface de usuário atualizada que reflete todas as funcionalidades do SDK
- Novo SDK
mlflow.genai
com APIs simplificado para executar avaliação, rótulo humano e gerenciar conjunto de dados de avaliação - Rastreamento aprimorado com um backend de ingestão de rastreamento em escala de produção que oferece observabilidade em tempo real
- Coleta simplificada de feedback humano
- Melhoria do site LLM juízes como avaliadores integrados
Este guia ajuda o senhor a migrar da Avaliação do agente (MLflow 2.x com databricks-agents<1.0
) para o MLflow 3. Esse guia detalhado também está disponível em um formato de referência rápida.
MLflow 3 com Agent Evaluation só funciona em gerenciar MLflow, não em código aberto MLflow. Veja a página gerenciar vs. código aberto MLflow para entender mais detalhadamente as diferenças entre gerenciar e código aberto MLflow.
Lista de verificação de migração
Para começar, use esta lista de verificação. Cada item tem links para detalhes nas seções abaixo.
API de avaliação
-
Atualize as importações de
databricks.agents
paramlflow.genai.*
-
Substitua
mlflow.evaluate()
pormlflow.genai.evaluate()
- Atualizar nomes de parâmetros (
model
→predict_fn
,extra_metrics
→scorers
) - Atualizar nomes de campos de dados (
request
→inputs
,response
→outputs
,expected*
→expectations
) - Substitua
evaluator_config
pela configuração em nível de pontuação - Atualize o acesso ao resultado para usar
mlflow.search_traces()
- Atualizar nomes de parâmetros (
Juízes do LLM
- Substitua as chamadas diretas dos juízes por pontuadores predefinidos sempre que possível
- Atualize o marcador
judges.guideline_adherence()
parajudges.meets_guidelines()
ouGuidelines()
- Atualizar os nomes dos parâmetros da função Judge para corresponder à nova API
- Considere usar
ExpectationGuidelines()
para diretrizes baseadas em fatos concretos
Feedback humano
- Atualizar o rótulo Session & Revisar importações de aplicativos para
mlflow.genai.labeling
- Atualizar as importações do esquema de rótulos para
mlflow.genai.label_schemas
- Atualizar a lógica para sincronizar o feedback com o conjunto de dados
Armadilhas comuns a serem evitadas
- Lembre-se de atualizar os nomes dos campos de dados em seus DataFrames
- Lembre-se de que
model_type="databricks-agent"
não é mais necessário - Garanta que pontuadores personalizados retornem valores válidos (" yes "/" no " para aprovação/reprovação)
- Use
search_traces()
em vez de acessar as tabelas de resultados diretamente - Atualize todas as referências de namespace codificadas em seu código
- Lembre-se de especificar explicitamente todos os avaliadores - MLflow 3 não executa automaticamente os juízes
- Converta
global_guidelines
da configuração em marcadoresGuidelines()
explícitos
Avaliação da migração da API
Importar atualizações
A lista abaixo resume as importações a serem atualizadas, com detalhes e exemplos em cada subseção abaixo.
# 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, ExpectationGuidelines,
RelevanceToQuery, Safety, RetrievalGroundedness,
RetrievalRelevance, RetrievalSufficiency
)
De mlflow.evaluate()
a mlflow.genai.evaluate()
A API de avaliação principal foi transferida para um namespace GenAI dedicado com nomes de parâmetros mais limpos.
MLflow 2.x | MLflow 3.x | Notas |
---|---|---|
|
| Novo namespace |
|
| Nome mais descritivo |
| Não é necessário | Detectado automaticamente |
|
| Terminologia mais clara |
| Não é necessário | Parte dos marcadores |
Campo do MLflow 2.x | Campo do MLflow 3.x | Descrição |
---|---|---|
|
| Entrada do agente |
|
| Saída do agente |
|
| Verdade fundamental |
| Acessado por meio de rastreamentos | Contexto a partir do rastreamento |
| Parte da configuração do marcador | Transferido para o nível de marcador |
Exemplo: Avaliação básica
MLflow 2.x:
import mlflow
import pandas as pd
eval_data = [
{
"request": "What is MLflow?",
"response": "MLflow is an open-source platform for managing ML lifecycle.",
"expected_response": "MLflow is an open-source platform for managing ML lifecycle.",
},
{
"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 an open-source platform for managing ML lifecycle."
},
"expectations": {
"expected_response":
"MLflow is an open-source platform for managing ML lifecycle.",
},
},
{
"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,
)
Acessando os resultados da avaliação
No MLflow 3, os resultados da avaliação são armazenados como traços com avaliações. Use mlflow.search_traces()
para acessar resultados detalhados:
# 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}")
Avaliação de um LoggedModel do MLflow
Em MLflow 2.x, o senhor poderia passar um modelo de registro MLflow (como um modelo PyFunc ou um registro da Estrutura de Agente) diretamente para mlflow.evaluate()
. No MLflow 3.x, o senhor precisa envolver o modelo em uma função de previsão para lidar com o mapeamento de parâmetros.
Esse wrapper é necessário porque o mlflow.genai.evaluate()
espera uma função de previsão que aceite a chave no inputs
dict do seu dataset como argumentos de palavra-chave, enquanto a maioria dos modelos registrados aceita um único parâmetro de entrada (por exemplo, model_inputs
para modelos PyFunc ou interfaces semelhantes para modelos LangChain ).
A função de previsão serve como uma camada de tradução entre os parâmetros nomeados da estrutura de avaliação e o formato de entrada esperado do modelo.
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()]
)
Migração de métricas personalizadas para marcadores
As funções de avaliação personalizadas (@metric
) agora usam o decorador @scorer
com uma assinatura simplificada.
MLflow 2.x | MLflow 3.x | Notas |
---|---|---|
|
| Novo nome |
|
| Simplificado |
Vários parâmetros esperados_* | Parâmetro | Consolidado |
| Parte do ditado | Simplificado |
|
| Nomenclatura consistente |
|
| Nomenclatura consistente |
Exemplo: marcador de aprovação/reprovação
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 an open-source platform for managing ML lifecycle.",
"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]
)
Exemplo: pontuador numérico com avaliação
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}"
)
Migração de juízes do LLM
principais diferenças no comportamento dos juízes
MLflow 2.x | MLflow 3.x |
---|---|
Executar automaticamente todos os juízes aplicáveis com base nos dados | Deve especificar explicitamente quais marcadores usar |
Use | Passe os marcadores desejados no parâmetro |
| Use o marcador |
Juízes selecionados com base nos campos de dados disponíveis | O senhor controla exatamente a execução dos marcadores |
Seleção automática de juízes do MLflow 2.x:
- Sem verdade fundamental: execução
chunk_relevance
,groundedness
,relevance_to_query
,safety
,guideline_adherence
- Com a verdade fundamental: também execução
context_sufficiency
,correctness
Seleção explícita do avaliador do MLflow 3.x:
- O senhor deve listar explicitamente os marcadores que deseja executar
- Mais controle, mas exige ser explícito sobre as necessidades de avaliação
Caminhos de migração
Caso de uso | MLflow 2.x | MLflow 3.x Recomendado |
---|---|---|
Verificação básica de exatidão |
|
|
Avaliação de segurança |
|
|
Diretrizes globais |
|
|
Diretrizes por eval-set-row |
|
|
Verifique se há suporte factual |
|
|
Verifique a relevância do contexto |
|
|
Verifique a relevância dos trechos de contexto |
|
|
Verifique a integridade do contexto |
|
|
Lógica personalizada complexa | O juiz liga diretamente | Marcadores predefinidos ou |
O MLflow 3 oferece duas maneiras de usar os juízes do LLM:
- Pontuadores predefinidos - Pontuadores prontos para usar que agrupam os juízes com análise automática de traços
- Chamadas diretas de juízes - Ligue para os juízes diretamente nos marcadores personalizados para obter mais controle
Controle de quais juízes executam
Exemplo: Especificando juízes para execução
MLflow 2.x (limitando os juízes do default ):
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 (seleção explícita do avaliador):
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()
]
)
Exemplo abrangente de migração
Este exemplo mostra a migração de uma avaliação que usa vários juízes com configuração personalizada:
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
]
)
Migração para juízes marcadores predefinidos
O MLflow 3 oferece avaliadores predefinidos que envolvem os juízes do LLM, facilitando seu uso com o site mlflow.genai.evaluate()
.
Exemplo: Juiz de exatidão
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 (Opção 1: usar o avaliador predefinido):
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 (Opção 2: avaliador personalizado com juiz):
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]
)
Exemplo: juiz de segurança
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()]
)
Exemplo: juiz de relevância
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()]
)
Exemplo: Juiz de fundamento
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()]
)
Adesão às diretrizes de migração para meets_guidelines
O juiz do guideline_adherence
foi renomeado para meets_guidelines
com uma API mais limpa.
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 (Opção 1: usar o avaliador de diretrizes predefinido):
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 (Opção 2: avaliador personalizado com 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
}
)
Exemplo: Diretrizes de expectativa de migração
Para diretrizes contidas em um conjunto de avaliação, use ExpectationGuidelines
:
MLflow 2.x:
from databricks.agents.evals import judges, metric
# Define `guidelines` as a key in your evaluation set
@metric
def check_completeness(request, response, expected_facts):
"""Check if response includes all expected facts."""
facts_text = '\n'.join(expected_facts)
return judges.guideline_adherence(
request=request,
guidelines=[f"Response must include all of these facts: {facts_text}"],
guidelines_context={"response": response}
)
MLflow 3.x:
from mlflow.genai.scorers import ExpectationGuidelines
# Define `guidelines` as a key `expectations` in your evaluation set
# Use predefined scorer
results = mlflow.genai.evaluate(
data=eval_data, # eval_data must include expectations.expected_facts
predict_fn=my_agent,
scorers=[
ExpectationGuidelines()
]
)
Replicação do comportamento do juiz automático do MLflow 2.x
Para replicar o comportamento do MLflow 2.x de executar todos os juízes aplicáveis, inclua explicitamente todos os avaliadores:
MLflow 2.x (automático):
# 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 (explícito):
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(),
]
)
Uso direto do juiz
Você ainda pode ligar diretamente para os juízes para fazer o teste:
from mlflow.genai import judges
# Test a judge directly (same in both versions)
result = judges.correctness(
request="What is MLflow?",
response="MLflow is an open-source platform for ML lifecycle.",
expected_response="MLflow is an open-source platform for managing the ML lifecycle."
)
print(f"Judge result: {result.value}")
print(f"Rationale: {result.rationale}")
Migração de feedback humano
rótulo sessions and schemas
A funcionalidade do Review App mudou de databricks.agents
para mlflow.genai.labeling
.
Mudanças no namespace:
MLflow 2.x | MLflow 3.x |
---|---|
|
|
|
|
|
|
|
|
Exemplo: Criando uma sessão de rótulo
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}")
Sincronização do feedback com o conjunto de dados
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 an open-source platform for managing ML lifecycle.",
"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
)
Recurso adicional
- MLflow 3 Guia de avaliação do GenAI
- Documentação de pontuadores personalizados
- Feedback humano com o rótulo Sessions
- Pontuadores de juízes predefinidos
- MLflow Tracing guia
Para obter suporte adicional durante a migração, consulte a documentação do MLflow ou entre em contato com a equipe de suporte da Databricks.