GenAI 应用的生产监控
机器学习项目并不会在首次发布时结束。持续的监控和渐进式的改进对于长期成功至关重要。MLflow Tracing 为您的生产应用程序提供了全面的可观测性,支持持续改进的迭代过程,同时确保向用户交付高质量的服务。
关键监控区域
了解要监控的内容可以帮助您专注于真正影响用户体验和业务成果的指标。与其尝试监控所有内容,不如专注于为您的特定应用程序和用户群提供可操作见解的领域。
- 运营指标
- 质量指标
- 业务影响
性能与可靠性:监控从用户请求到最终响应的端到端响应时间,包括 LLM 推理延迟、检索系统性能和组件级瓶颈。跟踪整体错误率、LLM API 故障、超时发生和依赖项故障,以维护系统可靠性。
资源利用率:监控 token 消耗模式、API 成本跟踪、请求吞吐量和系统资源使用情况,以优化性能并控制成本。
业务指标:跟踪用户参与率、会话完成率、功能采用率和用户满意度分数,以了解应用程序的业务影响。
响应质量:评估响应与用户查询的相关性、事实准确性、响应的完整性以及相似查询之间的一致性,以确保您的应用程序满足用户需求。
安全与合规性:监控有害内容检测、偏差监控、隐私合规性和法规遵从性,这对于受监管行业的应用程序尤其重要。
用户体验质量:跟踪响应的有用性、清晰度和可读性、适当的语气和风格以及多轮对话质量,以优化用户满意度。
领域特定质量:实现因应用程序类型而异的指标,例如专业领域的技术准确性、RAG 应用程序的引用质量、编程助手的代码质量或内容生成的创意质量。
用户行为:监控会话时长和深度、功能使用模式、用户留存率和转化指标,以了解用户如何与您的应用程序互动。
运营效率:跟踪支持工单减少量、流程自动化成功率、为用户节省的时间以及任务完成率,以衡量运营改进。
成本效益分析:将基础设施成本与提供的价值进行比较,评估 GenAI 投资的回报率、生产力提升和客户满意度影响,以证明并优化您的 GenAI 计划。
为生产端点设置跟踪
在将 GenAI 应用程序部署到生产环境时,您需要配置 MLflow Tracing 以将跟踪信息发送到您的 MLflow 跟踪服务器。此配置构成了所有生产可观测性功能的基础。
专业提示:使用轻量级跟踪 SDK
MLflow Tracing SDK mlflow-tracing 是一个轻量级包,仅包含将您的代码/模型/代理与 MLflow Tracing 进行检测所需的最低依赖项集。
⚡️ 更快的部署:显着减小的包大小和更少的依赖项,可以更快地在容器和无服务器环境中进行部署
🔧 简单的依赖管理:减少的依赖项意味着更少的维护开销和更少潜在的冲突
📦 增强的可移植性:轻松部署到不同平台,兼容性问题最小
🔒 改进的安全性:更小的攻击面和更少的依赖项可降低安全风险
🚀 性能优化:针对生产环境中的大批量跟踪进行了优化
安装 MLflow Tracing SDK 时,请确保环境中没有安装完整的 MLflow 包。在同一环境中同时安装这两个包可能会导致冲突和意外行为。
环境变量配置
在您的生产环境中配置以下环境变量。有关这些配置的更多详细信息,请参阅下面的生产监控配置。
# Required: Set MLflow Tracking URI
export MLFLOW_TRACKING_URI="http://your-mlflow-server:5000"
# Optional: Configure the experiment name for organizing traces
export MLFLOW_EXPERIMENT_NAME="production-genai-app"
# Optional: Configure async logging (recommended for production)
export MLFLOW_ENABLE_ASYNC_TRACE_LOGGING=true
export MLFLOW_ASYNC_TRACE_LOGGING_MAX_WORKERS=10
export MLFLOW_ASYNC_TRACE_LOGGING_MAX_QUEUE_SIZE=1000
# Optional: Configure trace sampling ratio (default is 1.0)
export MLFLOW_TRACE_SAMPLING_RATIO=0.1
自托管跟踪服务器
您可以使用 MLflow 跟踪服务器来存储生产跟踪。但是,跟踪服务器针对离线体验进行了优化,通常不适合处理超大规模流量。对于高吞吐量的生产工作负载,请考虑使用 OpenTelemetry 与专用可观测性平台集成。
如果您选择在生产环境中使用跟踪服务器,我们强烈建议
- 使用基于 SQL 的跟踪服务器,并辅以可扩展的数据库和构件存储
- 配置适当的索引以提高跟踪表上的查询性能
- 设置定期删除以进行跟踪数据管理
- 监控服务器性能并进行适当扩展
有关更多详细信息,请参阅跟踪服务器设置指南。
性能考量
数据库:生产部署建议使用 PostgreSQL 或 MySQL 以获得更好的并发写入性能,而不是 SQLite。
存储:使用云存储(S3、Azure Blob、GCS)作为构件存储,以确保可伸缩性和可靠性。
索引:确保在 timestamp_ms、status 和经常查询的标签列上具有适当的索引,以随着跟踪量的增长保持查询性能。
保留:实施数据保留策略以管理存储成本并随着时间的推移维护系统性能。
Docker 部署示例
使用 Docker 进行部署时,请通过容器配置传递环境变量
# 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 MLFLOW_TRACKING_URI=""
ENV MLFLOW_EXPERIMENT_NAME="production-genai-app"
ENV MLFLOW_ENABLE_ASYNC_TRACE_LOGGING=true
CMD ["python", "app.py"]
使用环境变量运行容器
docker run -d \
-e MLFLOW_TRACKING_URI="http://your-mlflow-server:5000" \
-e MLFLOW_EXPERIMENT_NAME="production-genai-app" \
-e MLFLOW_ENABLE_ASYNC_TRACE_LOGGING=true \
-e APP_VERSION="1.0.0" \
your-app:latest
Kubernetes 部署示例
对于 Kubernetes 部署,请使用 ConfigMaps 和 Secrets
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mlflow-config
data:
MLFLOW_TRACKING_URI: 'http://mlflow-server:5000'
MLFLOW_EXPERIMENT_NAME: 'production-genai-app'
MLFLOW_ENABLE_ASYNC_TRACE_LOGGING: 'true'
---
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: genai-app
spec:
template:
spec:
containers:
- name: app
image: your-app:latest
envFrom:
- configMapRef:
name: mlflow-config
env:
- name: APP_VERSION
value: '1.0.0'
OpenTelemetry 后端
MLflow Traces 可以导出到任何兼容 OpenTelemetry 的后端。有关更多详细信息,请参阅OpenTelemetry 集成文档。
Databricks 的托管监控
Databricks 还提供了一个托管解决方案,用于监控与 MLflow Tracing 集成的 GenAI 应用程序。

功能包括
- 跟踪运营指标,如请求量、延迟、错误和成本。
- 使用托管评估监控质量指标,如正确性、安全性、上下文充分性等。
- 使用 Python 函数配置自定义指标。
- 通过查看 MLflow Tracing 记录的跟踪来进行根本原因分析。
- 支持托管在 Databricks 外部的应用程序
生产监控配置
异步跟踪日志记录
对于生产应用程序,MLflow 默认异步记录跟踪,以防止阻塞您的应用程序
| 环境变量 | 描述 | 默认值 |
|---|---|---|
MLFLOW_ENABLE_ASYNC_TRACE_LOGGING | 是否异步记录跟踪。设置为 False 时,跟踪将以阻塞方式记录。 | True |
MLFLOW_ASYNC_TRACE_LOGGING_MAX_WORKERS | 每个进程用于异步跟踪日志记录的最大工作线程数。增加此值可以提高跟踪日志记录的吞吐量,但也会增加 CPU 使用率和内存消耗。 | 10 |
MLFLOW_ASYNC_TRACE_LOGGING_MAX_QUEUE_SIZE | 工作线程将跟踪记录到后端之前可以排队的跟踪的最大数量。当队列已满时,新跟踪将被丢弃。增加此值可以提高跟踪日志记录的持久性,但也会增加内存消耗。 | 1000 |
MLFLOW_ASYNC_TRACE_LOGGING_RETRY_TIMEOUT | 重试失败跟踪日志记录的超时秒数。当跟踪日志记录失败时,将以指数退避的方式重试,直到此超时时间,之后将被丢弃。 | 500 |
高吞吐量应用程序的示例配置
export MLFLOW_ENABLE_ASYNC_TRACE_LOGGING=true
export MLFLOW_ASYNC_TRACE_LOGGING_MAX_WORKERS=20
export MLFLOW_ASYNC_TRACE_LOGGING_MAX_QUEUE_SIZE=2000
export MLFLOW_ASYNC_TRACE_LOGGING_RETRY_TIMEOUT=600
采样跟踪
对于高吞吐量应用程序,您可能希望减少导出到后端的跟踪数量。您可以配置采样率来控制导出的跟踪数量。
| 环境变量 | 描述 | 默认值 |
|---|---|---|
MLFLOW_TRACE_SAMPLING_RATIO | 跟踪的采样率。设置为 0.0 时,不导出任何跟踪。设置为 1.0 时,导出所有跟踪。 | 1.0 |
默认值是 1.0,表示所有跟踪都会被导出。当设置为小于 1.0 时,例如 0.1,则只导出 10% 的跟踪。采样是在跟踪级别进行的,这意味着某些跟踪中的所有 span 将一起导出或丢弃。
为生产跟踪添加上下文
在生产环境中,用上下文信息丰富跟踪对于理解用户行为、调试问题和改进您的 GenAI 应用程序至关重要。这种上下文使您能够分析用户交互,跟踪不同细分市场的质量,并识别导致更好或更差结果的模式。
跟踪请求、会话和用户上下文
生产应用程序需要同时跟踪多个上下文片段。这是一个全面的示例,展示了如何在 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
@app.post("/chat") # FastAPI decorator should be outermost
@mlflow.trace # Ensure @mlflow.trace is the inner decorator
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
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
response_text = f"Processed message: '{chat_request.message}'"
return {"response": response_text}
反馈收集
捕获用户对特定交互的反馈对于理解质量和改进您的 GenAI 应用程序至关重要
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
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()
experiment = client.get_experiment_by_name("production-genai-app")
traces = client.search_traces(experiment_ids=[experiment.experiment_id])
traces = [
trace for trace in traces if trace.info.client_request_id == client_request_id
][: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,
}
使用上下文查询跟踪
利用上下文信息分析生产行为
import mlflow
# Query traces by user
user_traces = mlflow.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 = mlflow.search_traces(
experiment_ids=[experiment.experiment_id],
filter_string="tags.`mlflow.trace.session` = 'session-def-456'",
max_results=100,
)
# Query traces by environment
production_traces = mlflow.search_traces(
experiment_ids=[experiment.experiment_id],
filter_string="tags.environment = 'production'",
max_results=100,
)
总结
使用 MLflow Tracing 进行的生产监控为您的 GenAI 应用程序提供了全面的可观测性。了解用户如何实际与您的应用程序交互,在实际条件下监控质量和性能,以及跟踪 GenAI 计划的业务影响,对于长期成功都至关重要。
成功进行生产部署的关键建议包括:在生产部署中使用 mlflow-tracing 以最大程度地减少依赖项并优化性能;为高吞吐量应用程序配置异步日志记录以防止阻塞;使用标签和元数据添加丰富的上下文以进行有效的调试和分析;实施反馈收集以进行质量监控和持续改进;考虑通过 OpenTelemetry 集成企业可观测性平台;并在实现适当的错误处理时监控性能。
无论您是使用自托管 MLflow,通过 OpenTelemetry 与企业可观测性平台集成,还是利用 Databricks Mosaic AI 的高级功能,MLflow Tracing 都为理解和改进您的生产 GenAI 应用程序提供了基础。
后续步骤
搜索跟踪:了解如何使用 UI 或 API 访问跟踪数据进行分析。
跟踪用户和会话:实施用户和会话上下文跟踪,以获得更好的监控洞察。