Observabilidade da produção com rastreamento
MLflow Tracing fornece observabilidade abrangente para aplicativos GenAI de produção implantados fora do site Databricks, capturando detalhes de execução e enviando-os para o site Databricks workspace , onde o usuário pode view na interface do usuário MLflow.
Como funciona o rastreamento da produção:
- Seu aplicativo gera rastreamentos - Cada chamada de API cria dados de rastreamento
- Os rastros vão para o servidor de acompanhamento Databricks MLflow - Usando suas credenciais workspace
- view in MLflow UI - Analise os traços em seu Databricks workspace
Esta página aborda o rastreamento de aplicativos implantados fora do site Databricks. Se o seu aplicativo estiver implantado usando Databricks servindo modelo, consulte Rastreamento com Databricks servindo modelo.
Pré-requisitos
O rastreamento de produção requer o MLflow 3. O MLflow 2.x não é compatível com o rastreamento de produção.
Instale o pacote necessário. A tabela a seguir descreve suas opções:
tópico |
|
|
---|---|---|
Caso de uso recomendado | Implantações de produção | Desenvolvimento e experimentação |
Benefícios | Dependências mínimas para implantações rápidas e enxutas desempenho otimizado para rastreamento de grandes volumes Focado no rastreamento do lado do cliente para monitoramento da produção | Conjunto completo de recursos de experimentação MLflow (UI, LLM-as-a-judge, ferramentas de desenvolvimento e muito mais) Inclui todas as ferramentas e utilidades de desenvolvimento |
## Install mlflow-tracing for production deployment tracing
%pip install --upgrade mlflow-tracing
## Install mlflow for experimentation and development
%pip install --upgrade "mlflow[databricks]>=3.1"
Configuração básica de rastreamento
Configure a implementação do aplicativo para se conectar ao Databricks workspace para que o Databricks possa coletar traces.
Configure as seguintes variáveis de ambiente:
# Required: Set the Databricks workspace host and authentication token
export DATABRICKS_HOST="https://your-workspace.cloud.databricks.com"
export DATABRICKS_TOKEN="your-databricks-token"
# Required: Set MLflow Tracking URI to "databricks" to log to Databricks
export MLFLOW_TRACKING_URI=databricks
# Required: Configure the experiment name for organizing traces (must be a workspace path)
export MLFLOW_EXPERIMENT_NAME="/Shared/production-genai-app"
Exemplos de implantação
Depois que as variáveis de ambiente forem definidas, passe-as para o seu aplicativo. Clique na guia para ver como passar os detalhes da conexão para diferentes estruturas.
- Docker
- Kubernetes
Para implementações em Docker, passe a variável de ambiente pela configuração do contêiner:
# Dockerfile
FROM python:3.9-slim
# Install dependencies
COPY requirements.txt .
RUN pip install -r requirements.txt
# Copy application code
COPY . /app
WORKDIR /app
# Set default environment variables (can be overridden at runtime)
ENV DATABRICKS_HOST=""
ENV DATABRICKS_TOKEN=""
ENV MLFLOW_TRACKING_URI=databricks
ENV MLFLOW_EXPERIMENT_NAME="/Shared/production-genai-app"
CMD ["python", "app.py"]
executar o contêiner com variável de ambiente:
docker run -d \
-e DATABRICKS_HOST="https://your-workspace.cloud.databricks.com" \
-e DATABRICKS_TOKEN="your-databricks-token" \
-e MLFLOW_TRACKING_URI=databricks \
-e MLFLOW_EXPERIMENT_NAME="/Shared/production-genai-app" \
-e APP_VERSION="1.0.0" \
your-app:latest
Para implantações do Kubernetes, passe a variável de ambiente usando ConfigMaps e Secrets:
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: databricks-config
data:
DATABRICKS_HOST: 'https://your-workspace.cloud.databricks.com'
MLFLOW_TRACKING_URI: databricks
MLFLOW_EXPERIMENT_NAME: '/Shared/production-genai-app'
---
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: databricks-secrets
type: Opaque
stringData:
DATABRICKS_TOKEN: 'your-databricks-token'
---
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: genai-app
spec:
template:
spec:
containers:
- name: app
image: your-app:latest
envFrom:
- configMapRef:
name: databricks-config
- secretRef:
name: databricks-secrets
env:
- name: APP_VERSION
value: '1.0.0'
Verificar a coleta de traços
Depois de implantar o aplicativo, verifique se os rastros foram coletados corretamente:
import mlflow
from mlflow.client import MlflowClient
import os
# Ensure MLflow is configured for Databricks
mlflow.set_tracking_uri("databricks")
# Check connection to MLflow server
client = MlflowClient()
try:
# List recent experiments to verify connectivity
experiments = client.search_experiments()
print(f"Connected to MLflow. Found {len(experiments)} experiments.")
# Check if traces are being logged
traces = mlflow.search_traces(
experiment_names=[os.getenv("MLFLOW_EXPERIMENT_NAME", "/Shared/production-genai-app")],
max_results=5
)
print(f"Found {len(traces)} recent traces.")
except Exception as e:
print(f"Error connecting to MLflow: {e}")
print(f"Check your authentication and connectivity")
Adicionar contexto aos traços
Após os trabalhos básicos de rastreamento, adicione contexto para uma melhor depuração e percepção. MLflow tem as seguintes tags e atributos padronizados para capturar informações contextuais importantes:
- Solicitação de acompanhamento - Vincule os rastros a chamadas específicas do site API para depuração de ponta a ponta
- Sessões do usuário - Interações relacionadas ao grupo para entender as jornadas do usuário
- Dados do ambiente - Acompanhe qual implantação, versão ou região gerou cada rastreamento
- Feedback do usuário - Colete classificações de qualidade e vincule-as a interações específicas
Rastreie a solicitação, a sessão e o contexto do usuário
Os aplicativos de produção precisam rastrear várias partes do contexto simultaneamente: IDs de solicitação do cliente para depuração, IDs de sessão para conversas com vários turnos, IDs de usuário para personalização e análise e metadados de ambiente para percepções operacionais. Aqui está um exemplo abrangente que mostra como rastrear tudo isso em um aplicativo FastAPI:
import mlflow
import os
from fastapi import FastAPI, Request, HTTPException
from pydantic import BaseModel
# Initialize FastAPI app
app = FastAPI()
class ChatRequest(BaseModel):
message: str
@mlflow.trace # Ensure @mlflow.trace is the outermost decorator
@app.post("/chat") # FastAPI decorator should be inner
def handle_chat(request: Request, chat_request: ChatRequest):
# Retrieve all context from request headers
client_request_id = request.headers.get("X-Request-ID")
session_id = request.headers.get("X-Session-ID")
user_id = request.headers.get("X-User-ID")
# Update the current trace with all context and environment metadata
# The @mlflow.trace decorator ensures an active trace is available
mlflow.update_current_trace(
client_request_id=client_request_id,
tags={
# Session context - groups traces from multi-turn conversations
"mlflow.trace.session": session_id,
# User context - associates traces with specific users
"mlflow.trace.user": user_id,
# Environment metadata - tracks deployment context
"environment": "production",
"app_version": os.getenv("APP_VERSION", "1.0.0"),
"deployment_id": os.getenv("DEPLOYMENT_ID", "unknown"),
"region": os.getenv("REGION", "us-east-1")
}
)
# --- Your application logic for processing the chat message ---
# For example, calling a language model with context
# response_text = my_llm_call(
# message=chat_request.message,
# session_id=session_id,
# user_id=user_id
# )
response_text = f"Processed message: '{chat_request.message}'"
# --- End of application logic ---
# Return response
return {
"response": response_text
}
# To run this example (requires uvicorn and fastapi):
# uvicorn your_file_name:app --reload
#
# Example curl request with all context headers:
# curl -X POST "http://127.0.0.1:8000/chat" \
# -H "Content-Type: application/json" \
# -H "X-Request-ID: req-abc-123-xyz-789" \
# -H "X-Session-ID: session-def-456-uvw-012" \
# -H "X-User-ID: user-jane-doe-12345" \
# -d '{"message": "What is my account balance?"}'
Essa abordagem combinada oferece vários benefícios:
- ID da solicitação do cliente : Permite a depuração de ponta a ponta, correlacionando traços com solicitações específicas de clientes em todo o sistema
- ID da sessão (tag:
mlflow.trace.session
): grupos rastreiam conversas em vários turnos, permitindo que você analise todo o fluxo conversacional - ID do usuário (tag:
mlflow.trace.user
): Associa traços a usuários específicos para personalização, análise de coorte e depuração específica do usuário - Metadados do ambiente : Rastreia o contexto da implantação (ambiente, versão, região) para percepções operacionais e depuração em diferentes implantações
Para obter mais informações sobre como adicionar contexto aos traces, consulte a documentação sobre acompanhamento de usuários & sessions e acompanhamento de ambientes & context.
Colete feedback do usuário
Capturar o feedback do usuário sobre interações específicas é essencial para entender a qualidade e melhorar seu aplicativo GenAI. Com base no acompanhamento da ID da solicitação do cliente mostrado na seção anterior, este exemplo demonstra como usar essa ID para vincular o feedback a traços específicos.
Aqui está um exemplo de implementação da coleta de feedback no FastAPI:
import mlflow
from mlflow.client import MlflowClient
from fastapi import FastAPI, Query, Request
from pydantic import BaseModel
from typing import Optional
from mlflow.entities import AssessmentSource
# Initialize FastAPI app
app = FastAPI()
class FeedbackRequest(BaseModel):
is_correct: bool # True for correct, False for incorrect
comment: Optional[str] = None
@app.post("/chat_feedback")
def handle_chat_feedback(
request: Request,
client_request_id: str = Query(..., description="The client request ID from the original chat request"),
feedback: FeedbackRequest = ...
):
"""
Collect user feedback for a specific chat interaction identified by client_request_id.
"""
# Search for the trace with the matching client_request_id
client = MlflowClient()
# Get the experiment by name (using Databricks workspace path)
experiment = client.get_experiment_by_name("/Shared/production-app")
traces = client.search_traces(
experiment_ids=[experiment.experiment_id],
filter_string=f"attributes.client_request_id = '{client_request_id}'",
max_results=1
)
if not traces:
return {
"status": "error",
"message": f"Unable to find data for client request ID: {client_request_id}"
}, 500
# Log feedback using MLflow's log_feedback API
mlflow.log_feedback(
trace_id=traces[0].info.trace_id,
name="response_is_correct",
value=feedback.is_correct,
source=AssessmentSource(
source_type="HUMAN",
source_id=request.headers.get("X-User-ID")
),
rationale=feedback.comment
)
return {
"status": "success",
"message": "Feedback recorded successfully",
"trace_id": traces[0].info.trace_id,
"client_request_id": client_request_id,
"feedback_by": request.headers.get("X-User-ID")
}
# Example usage:
# After a chat interaction returns a response, the client can submit feedback:
#
# curl -X POST "http://127.0.0.1:8000/chat_feedback?client_request_id=req-abc-123-xyz-789" \
# -H "Content-Type: application/json" \
# -H "X-User-ID: user-jane-doe-12345" \
# -d '{
# "is_correct": true,
# "comment": "The response was accurate and helpful"
# }'
Essa abordagem de coleta de feedback permite que você:
- Vincule o feedback a interações específicas : use o ID de solicitação do cliente para encontrar o rastreamento exato e anexar feedback
- Armazenar feedback estruturado : A API
log_feedback
cria objetos de avaliação adequados que são visíveis na interface do usuário do MLflow - Analise os padrões de qualidade : consulte os rastreamentos com o feedback associado para identificar quais tipos de interações recebem avaliações positivas ou negativas
Posteriormente, o senhor pode consultar os traços com feedback usando a interface do usuário do MLflow ou de forma programática para analisar padrões e melhorar seu aplicativo.
Rastreamentos de consulta com contexto
Use as informações contextuais para analisar o comportamento da produção:
import mlflow
from mlflow.client import MlflowClient
import pandas as pd
client = MlflowClient()
experiment = client.get_experiment_by_name("/Shared/production-app")
# Query traces by user
user_traces = client.search_traces(
experiment_ids=[experiment.experiment_id],
filter_string="tags.`mlflow.trace.user` = 'user-jane-doe-12345'",
max_results=100
)
# Query traces by session
session_traces = client.search_traces(
experiment_ids=[experiment.experiment_id],
filter_string="tags.`mlflow.trace.session` = 'session-123'",
max_results=100
)
Próximas etapas
Continue sua jornada com estas ações recomendadas e o tutorial.
- Executar scorers na produção - Configurar a avaliação de qualidade automatizada para o tráfego de produção
Guia de referência
Explore a documentação detalhada dos conceitos e recursos mencionados neste guia.
- Conceitos de monitoramento da produção - Entenda como o MLflow permite o monitoramento contínuo da qualidade
- Modelo de dados de rastreamento - Saiba mais sobre traços, extensões e atributos
- Avaliações de registro - Entenda como o feedback é armazenado e usado