Monitorar aplicativos GenAI em produção

Importante

Esse recurso está em Beta. Os administradores do workspace podem controlar o acesso a esse recurso na página Visualizações . Consulte Gerenciar prévias do Azure Databricks.

O monitoramento de produção permite executar automaticamente pontuadores do MLflow 3 em rastreamentos de suas aplicações de GenAI para avaliar a qualidade de forma contínua. Agende pontuadores para um experimento do MLflow, e o serviço de monitoramento avalia uma amostra configurável dos rastreamentos de entrada. Os resultados são anexados como feedback a cada rastreamento avaliado.

O monitoramento de produção inclui o seguinte:

  • Avaliação de qualidade automatizada usando pontuadores internos ou personalizados, incluindo juízes de vários turnos para avaliar conversas inteiras.
  • Taxas de amostragem configuráveis para que você possa controlar a compensação entre a cobertura e o custo computacional.
  • Use os mesmos pontuadores em desenvolvimento e produção para garantir uma avaliação consistente.
  • Avaliação contínua de qualidade com monitoramento rodando em segundo plano.

Observação

O monitoramento de produção do MLflow 3 é compatível com rastreamentos registrados no MLflow 2.

Pré-requisitos

Antes de configurar o monitoramento de produção, verifique se você tem:

  • Experimento do MLflow: um experimento do MLflow em que os rastreamentos estão sendo registrados. Se nenhum experimento for especificado, o experimento ativo será usado.
  • Aplicativo de produção instrumentado: Seu aplicativo GenAI deve registrar traços usando o MLflow Tracking. Consulte o guia rastreamento de produção.
  • Marcadores definidos: marcadores testados compatíveis com o formato de rastreamento do seu aplicativo. Se você usou seu aplicativo de produção como o predict_fn no mlflow.genai.evaluate() durante o desenvolvimento, provavelmente seus pontuadores já são compatíveis.
  • Política de orçamento sem servidor: se o workspace não permitir a política de orçamento sem servidor padrão, defina uma política para o experimento do MLflow antes de registrar os pontuadores. Consulte Configurar uma política de orçamento sem servidor para um experimento do MLflow.
  • ID do sql warehouse (para rastreamentos do Catálogo do Unity): se os rastreamentos forem armazenados no Catálogo do Unity, você deverá configurar uma ID do SQL Warehouse para que o monitoramento funcione. Consulte Habilitar o monitoramento de produção.

Introdução

Para configurar o monitoramento de produção, registre um pontuador no seu experimento do MLflow e inicie-o com uma configuração de amostragem. Esse padrão de duas etapas (.register() em seguida .start()) aplica-se a todos os tipos de marcador.

Observação

A qualquer momento, no máximo 20 pontuadores podem ser associados a um experimento de monitoramento contínuo de qualidade.

Para obter mais informações sobre pontuadores, consulte o seguinte:

As seções a seguir descrevem como usar os diferentes tipos de juízes e como combiná-los. Expanda uma seção para saber mais.

Criar e agendar juízes LLM usando a interface do usuário

Criar e agendar juízes LLM usando a interface do usuário

Você pode usar a interface de usuário de experimentos do MLflow para criar e testar pontuadores baseados em juízes LLM.

Para criar um novo julgador LLM:

  1. Navegue até a guia Avaliadores na interface do usuário do experimento do MLflow.

    Aba de pontuadores do experimento do MLflow.

  2. Clique em Novo juiz LLM.

    Crie um formulário de juiz LLM.

  3. Especifique o que o avaliador avaliará selecionando Rastreamentos ou Sessões.

  4. Insira um nome para o juiz.

  5. Clique na seta, conforme mostrado para exibir a seção Critérios de avaliação .

    Critérios de avaliação.

  6. No menu suspenso, selecione o tipo de juiz. Alguns tipos de juiz permitem que você insira instruções personalizadas, incluindo variáveis.

  7. Clique na seta, conforme mostrado para exibir a seção Avaliação automática .

    Configurações de avaliação automática.

  8. Defina a alternância Executar em todos os rastreamentos futuros conforme desejado.

  9. (Opcional) Em Configurações Avançadas, ajuste a taxa de amostragem e a cadeia de filtro para controlar os rastreamentos que serão avaliados.

  10. (Opcional) Para testar o novo juiz em um conjunto de rastreamentos existentes:

    1. Clique em Selecionar rastreamentos no painel esquerdo. Um pop-up aparece.
    2. Selecione os rastreamentos a serem executados e clique em Selecionar (n).
    3. Clique em Executar juiz. Os rastreamentos são avaliados e os resultados são exibidos.
    4. Revise os resultados. Use os botões Avançar e Anterior para percorrer os resultados de cada rastreamento selecionado.
    5. Se necessário, edite o juiz e itera até que você esteja feliz com o desempenho do juiz.
  11. Para criar o juiz, clique em Criar juiz.

Não é possível criar um juiz de código personalizado usando a interface. Para ver o código do modelo que você pode copiar para o bloco de anotações e editar conforme necessário, faça o seguinte:

  1. Clique na seta suspensa ao lado do botão Novo juiz LLM e selecione Juiz de código personalizado.

    Menu suspenso do juiz LLM.

  2. Um pop-up é exibido com instruções e código de exemplo mostrando como definir e executar o avaliador de código personalizado.

Usar juízes LLM integrados

Usar juízes LLM integrados

O MLflow fornece vários juízes LLM integrados prontos para uso.

from mlflow.genai.scorers import Safety, ScorerSamplingConfig

# Register the scorer with a name and start monitoring
safety_judge = Safety().register(name="my_safety_judge")  # name must be unique to experiment
safety_judge = safety_judge.start(sampling_config=ScorerSamplingConfig(sample_rate=0.7))

Por padrão, cada juiz usa uma LLM hospedada pelo Databricks projetada para executar avaliações de qualidade do GenAI. Você pode alterar o modelo de juiz para usar um ponto de extremidade do serviço de modelo do Databricks usando o argumento model na definição do pontuador. O modelo deve ser especificado no formato databricks:/<databricks-serving-endpoint-name>.

safety_judge = Safety(model="databricks:/databricks-gpt-oss-20b").register(name="my_custom_safety_judge")
Diretrizes para o Uso de Juízes LLMs

Diretrizes para o Uso de Juízes LLMs

As Diretrizes dos Juízes LLM avaliam as entradas e saídas usando critérios de linguagem natural de aprovação/falha.

from mlflow.genai.scorers import Guidelines

# Create and register the guidelines scorer
english_judge = Guidelines(
  name="english",
  guidelines=["The response must be in English"]
).register(name="is_english")  # name must be unique to experiment

# Start monitoring with the specified sample rate
english_judge = english_judge.start(sampling_config=ScorerSamplingConfig(sample_rate=0.7))

Assim como os juízes integrados, você pode alterar o modelo de juiz para usar, em vez disso, um ponto de extremidade do serviço de modelo do Databricks.

english_judge = Guidelines(
  name="english",
  guidelines=["The response must be in English"],
  model="databricks:/databricks-gpt-oss-20b",
).register(name="custom_is_english")
Usar juízes LLM com prompts personalizados

Usar juízes LLM com prompts personalizados

Para obter mais flexibilidade do que os juízes de diretrizes, use Juízes LLM com prompts personalizados que permitem avaliação de qualidade de vários níveis com categorias de escolha personalizáveis.

from typing import Literal
from mlflow.genai import make_judge
from mlflow.genai.scorers import ScorerSamplingConfig

# Create a custom judge using make_judge
formality_judge = make_judge(
    name="formality",
    instructions="""You will look at the response and determine the formality of the response.

Request: {{ inputs }}
Response: {{ outputs }}

Evaluate whether the response is formal, somewhat formal, or not formal.
A response is somewhat formal if it mentions friendship, etc.""",
    feedback_value_type=Literal["formal", "semi_formal", "not_formal"],
    model="databricks:/databricks-gpt-oss-20b",  # optional
)

# Register the custom judge and start monitoring
registered_judge = formality_judge.register(name="my_formality_judge")  # name must be unique to experiment
registered_judge = registered_judge.start(sampling_config=ScorerSamplingConfig(sample_rate=0.1))
Usar funções de avaliação personalizadas

Usar funções de pontuador personalizado

Para obter flexibilidade máxima, defina e use uma função de pontuador personalizado.

Importante: Requisitos de avaliador personalizado para monitoramento de produção

  • Apenas @scorer pontuadores baseados em decorador são suportados. Subclasses baseadas na classe Scorer não podem ser registradas para monitoramento de produção. Se você precisar de um pontuador baseado em classe, refatore-o para usar o decorador @scorer.
  • Os pontuadores devem ser definidos e registrados a partir de um notebook do Databricks. O serviço de monitoramento serializa o código da função de avaliação para execução remota e essa serialização requer o ambiente do notebook. Os avaliadores definidos em arquivos Python autônomos ou em IDEs locais não podem ser serializados para monitoramento de produção.
  • Os marcadores devem ser independentes. Como as funções de pontuação são serializadas como código para execução remota, todas as importações devem ser feitas inline dentro do corpo da função. A função não pode referenciar variáveis, objetos ou módulos definidos fora dela.

:::

Ao definir avaliadores personalizados, não use anotações de tipo que precisam ser importadas na assinatura da função. Se o corpo da função de pontuação usar pacotes que precisam ser importados, importe esses pacotes inline dentro da função para garantir a serialização correta.

Alguns pacotes estão disponíveis por padrão sem a necessidade de uma importação embutida. Isso inclui databricks-agents, mlflow-skinny, openai e todos os pacotes incluídos no Ambiente versão 2.

from mlflow.genai.scorers import scorer, ScorerSamplingConfig


# Custom metric: Check if response mentions Databricks
@scorer
def mentions_databricks(outputs):
    """Check if the response mentions Databricks"""
    return "databricks" in str(outputs.get("response", "")).lower()

# Register and start monitoring
databricks_scorer = mentions_databricks.register(name="databricks_mentions")
databricks_scorer = databricks_scorer.start(sampling_config=ScorerSamplingConfig(sample_rate=0.5))

Para obter mais exemplos de pontuador personalizados, consulte marcadores baseados em código.

Usar juízes de vários turnos

Usar juízes de vários turnos

O monitoramento de produção oferece suporte a juízes de vários turnos que avaliam conversas inteiras em vez de rastreamentos individuais. Esses juízes avaliam padrões de qualidade em várias interações, como frustração do usuário e integridade da conversa. Juízes de multi-turno são registrados e iniciados da mesma forma que juízes de turno único.

O trabalho de monitoramento agrupa automaticamente rastreamentos em conversas com base na marcação mlflow.trace.session. Os juízes de vários turnos são executados após uma conversa ser considerada concluída. Por padrão, uma conversa é considerada concluída quando nenhum novo rastreamento com esse identificador de sessão é recebido durante 5 minutos. Para configurar esse buffer, defina a variável de MLFLOW_ONLINE_SCORING_DEFAULT_SESSION_COMPLETION_BUFFER_SECONDS ambiente no trabalho de monitoramento.

Para obter a lista completa de juízes de vários turnos disponíveis, consulte os juízes de vários turnos. Para obter detalhes sobre a avaliação da conversa, consulte Avaliar conversas.

Observação

Para usar juízes de vários turnos, seu agente deve definir IDs de sessão nos rastreamentos. Consulte Acompanhar usuários e sessões para obter detalhes.

from mlflow.genai.scorers import (
    ConversationCompleteness,
    UserFrustration,
    ScorerSamplingConfig,
)

# Register and start multi-turn judges just like single-turn judges
completeness_scorer = ConversationCompleteness().register(name="conversation_completeness")
completeness_scorer = completeness_scorer.start(
    sampling_config=ScorerSamplingConfig(sample_rate=1.0),
)

frustration_scorer = UserFrustration().register(name="user_frustration")
frustration_scorer = frustration_scorer.start(
    sampling_config=ScorerSamplingConfig(sample_rate=1.0),
)
Combinar juízes

Combinar juízes

Você pode combinar juízes de turno único e juízes de várias voltas no mesmo experimento. Registre e inicie cada pontuador individualmente.

from mlflow.genai.scorers import Safety, Guidelines, UserFrustration, ScorerSamplingConfig

# Single-turn judges
safety_judge = Safety().register(name="safety")
safety_judge = safety_judge.start(sampling_config=ScorerSamplingConfig(sample_rate=1.0))

english_judge = Guidelines(
    name="english",
    guidelines=["The response must be in English"]
).register(name="is_english")
english_judge = english_judge.start(sampling_config=ScorerSamplingConfig(sample_rate=0.5))

# Multi-turn judge
frustration_judge = UserFrustration().register(name="frustration")
frustration_judge = frustration_judge.start(sampling_config=ScorerSamplingConfig(sample_rate=0.3))

Exibir os resultados

Após o agendamento de pontuadores, permita de 15 a 20 minutos para o processamento inicial. Em seguida:

  1. Navegue até o experimento do MLflow.
  2. Abra a aba Rastreamentos para ver as avaliações anexadas aos rastreamentos.
  3. Use os painéis de monitoramento para acompanhar tendências de qualidade.

Para juízes de vários turnos, as avaliações são vinculadas ao primeiro rastreamento de cada sessão. Veja como as avaliações são armazenadas para obter detalhes.

Práticas recomendadas

Estratégia de amostragem

  • Para pontuadores críticos, como verificações de segurança, use sample_rate=1.0.

  • Para pontuadores caros, como juízes LLM complexos, use taxas de amostragem mais baixas. (0.05-0.2).

  • Para melhoria iterativa durante o desenvolvimento, use taxas moderadas (0,3-0,5).

  • Balancee a cobertura com o custo, conforme mostrado nos seguintes exemplos:

    # High-priority scorers: higher sampling
    safety_judge = Safety().register(name="safety")
    safety_judge = safety_judge.start(sampling_config=ScorerSamplingConfig(sample_rate=1.0))  # 100% coverage for critical safety
    
    # Expensive scorers: lower sampling
    complex_scorer = ComplexCustomScorer().register(name="complex_analysis")
    complex_scorer = complex_scorer.start(sampling_config=ScorerSamplingConfig(sample_rate=0.05))  # 5% for expensive operations
    

Filtrar rastreamentos

Use o parâmetro filter_string em ScorerSamplingConfig para controlar quais rastreamentos o pontuador avalia. Isso usa a mesma sintaxe de filtro que mlflow.search_traces().

from mlflow.genai.scorers import Safety, ScorerSamplingConfig

# Only evaluate traces that completed successfully
safety_judge = Safety().register(name="safety")
safety_judge = safety_judge.start(
    sampling_config=ScorerSamplingConfig(
        sample_rate=1.0,
        filter_string="attributes.status = 'OK'"
    ),
)

Você pode combinar várias condições:

import time

# Evaluate successful traces from the last 24 hours
one_day_ago = int((time.time() - 86400) * 1000)
safety_judge = safety_judge.start(
    sampling_config=ScorerSamplingConfig(
        sample_rate=0.5,
        filter_string=f"attributes.status = 'OK' AND attributes.timestamp_ms > {one_day_ago}"
    ),
)

Design do classificador personalizado

Mantenha os marcadores personalizados independentes, conforme mostrado no exemplo a seguir:

@scorer
def well_designed_scorer(inputs, outputs):
    # All imports inside the function
    import re
    import json

    # Handle missing data gracefully
    response = outputs.get("response", "")
    if not response:
        return 0.0

    # Return consistent types
    return float(len(response) > 100)

Resolução de problemas

Os pontuadores não estão em execução

Se os pontuadores não estiverem funcionando, verifique os seguintes itens:

  1. Verificar o experimento: certifique-se de que os rastreamentos sejam registrados no experimento, e não em execuções individuais.
  2. Taxa de amostragem: Com baixas taxas de amostragem, pode levar tempo para ver os resultados.
  3. Verificar cadeia de caracteres de filtro: certifique-se de que os filter_string correspondam aos rastreamentos reais.

Problemas de serialização

Os marcadores personalizados para monitoramento de produção são serializados para que possam ser executados remotamente pelo serviço de monitoramento. Isso impõe várias restrições:

  • Requisito do notebook: as funções personalizadas @scorer devem ser definidas e registradas em um bloco de anotações do Databricks. O mecanismo de serialização depende do ambiente do notebook.
  • Funções autocontidas: todas as importações devem estar integradas ao corpo da função. As referências a variáveis externas, módulos ou objetos definidos fora da função não são capturadas durante a serialização.
  • Nenhum pontuador baseado em classe: apenas @scorer pontuadores baseados em decorador podem ser registrados. Subclasses baseadas em Scorer classe não podem ser serializadas para execução remota.
  • Nenhuma dica de tipo que exija importações: dicas de tipo na assinatura da função que exigem instruções de importação (por exemplo, List de typing) causam falhas de serialização.

Ao criar um avaliador personalizado, inclua importações na definição de função.

# Avoid external dependencies
import external_library  # Outside function

@scorer
def bad_scorer(outputs):
    return external_library.process(outputs)

# Include imports in the function definition
@scorer
def good_scorer(outputs):
    import json  # Inside function
    return len(json.dumps(outputs))

# Avoid using type hints in scorer function signature that requires imports
from typing import List

@scorer
def scorer_with_bad_types(outputs: List[str]):
    return False

# Class-based scorers are not supported for production monitoring
class MyScorer(Scorer):
    name: str = "my_scorer"
    def __call__(self, outputs):
        return len(outputs) > 10

Recursos adicionais

Guias de referência