Freigeben über


Überwachung der Produktionsqualität (laufende Scorer automatisch)

Von Bedeutung

Dieses Feature befindet sich in der Betaversion.

Mit MLflow können Sie automatisch Bewertungen an einer Stichprobe Ihrer Produktionsdatensätze vornehmen, um die Qualität kontinuierlich zu überwachen.

Hauptvorteile:

  • Automatisierte Qualitätsbewertung ohne manuelles Eingreifen
  • Flexibles Sampling zum Ausgleich der Abdeckung mit Rechenkosten
  • Konsistente Auswertung unter Verwendung derselben Bewerter aus der Entwicklung
  • Kontinuierliche Überwachung mit regelmäßiger Hintergrundausführung

Voraussetzungen

  1. Installieren von MLflow und erforderlichen Paketen

    pip install --upgrade "mlflow[databricks]>=3.1.0" openai
    
  2. Erstellen Sie ein MLflow-Experiment, indem Sie die Schnellstartanleitung zum Einrichten Ihrer Umgebung ausführen.

  3. Instrumentieren Sie Ihre Produktionsanwendung mit der MLflow-Nachverfolgung

  4. Zugriff auf ein Unity-Katalogschema mit CREATE TABLE Berechtigungen, um die Überwachungsergebnisse zu speichern.

Schritt 1: Testen von Scorern auf Ihre Produktionsablaufverfolgungen

Zunächst testen wir, ob die Scorer, die Sie in der Produktionsumgebung verwenden werden, Ihre Traces auswerten können.

Tipp

Wenn Sie Ihre Produktions-App als predict_fn in mlflow.genai.evaluate() während der Entwicklung verwendet haben, sind Ihre Scorer wahrscheinlich bereits kompatibel.

Warnung

MLflow unterstützt derzeit nur die Verwendung vordefinierter Scorer für die Produktionsüberwachung. Wenden Sie sich an Ihren Databricks-Kontoverantwortlichen, wenn Sie benutzerdefinierte codebasierte oder LLM-basierte Scorer im Produktionsbetrieb ausführen müssen.

  1. Verwenden Sie mlflow.genai.evaluate(), um die Scorer anhand einer Stichprobe Ihrer Ablaufverfolgungen zu testen.

    import mlflow
    
    from mlflow.genai.scorers import (
        Guidelines,
        RelevanceToQuery,
        RetrievalGroundedness,
        RetrievalRelevance,
        Safety,
    )
    
    # Get a sample of up to 10 traces from your experiment
    traces = mlflow.search_traces(max_results=10)
    
    # Run evaluation to test the scorers
    mlflow.genai.evaluate(
        data=traces,
        scorers=[
            RelevanceToQuery(),
            RetrievalGroundedness(),
            RetrievalRelevance(),
            Safety(),
            Guidelines(
                name="mlflow_only",
                # Guidelines can refer to the request and response.
                guidelines="If the request is unrelated to MLflow, the response must refuse to answer.",
            ),
            # You can have any number of guidelines.
            Guidelines(
                name="customer_service_tone",
                guidelines="""The response must maintain our brand voice which is:
        - Professional yet warm and conversational (avoid corporate jargon)
        - Empathetic, acknowledging emotional context before jumping to solutions
        - Proactive in offering help without being pushy
    
        Specifically:
        - If the customer expresses frustration, anger, or disappointment, the first sentence must acknowledge their emotion
        - The response must use "I" statements to take ownership (e.g., "I understand" not "We understand")
        - The response must avoid phrases that minimize concerns like "simply", "just", or "obviously"
        - The response must end with a specific next step or open-ended offer to help, not generic closings""",
            ),
        ],
    )
    
  2. Verwenden Sie die MLflow-Ablaufverfolgungs-UI, um zu überprüfen, welche Scorer ausgeführt wurden.

    In diesem Fall stellen wir fest, dass die RetrievalGroundedness() und RetrievalRelevance() Scorer in der MLflow-Benutzeroberfläche nicht angezeigt wurden, obwohl wir sie ausgeführt hatten. Dies deutet darauf hin, dass diese Scorer nicht mit unseren Spuren funktionieren, daher sollten wir sie im nächsten Schritt nicht einschalten.

Schritt 2: Aktivieren der Überwachung

Jetzt aktivieren wir den Überwachungsdienst. Nach der Aktivierung synchronisiert der Überwachungsdienst eine Kopie Ihrer ausgewerteten Traces aus Ihrem MLflow Experiment mit einer Delta Table im von Ihnen angegebenen Unity-Katalog-Schema.

Von Bedeutung

Nach der Festlegung kann das Unity-Katalogschema nicht mehr geändert werden.

Verwenden der Benutzeroberfläche

Folgen Sie der nachstehenden Aufzeichnung, um die Benutzeroberfläche zu verwenden, um die Scorer zu aktivieren, die in Schritt 1 erfolgreich ausgeführt wurden. Wenn Sie eine Samplingrate auswählen, werden die Scorer nur auf diesen Prozentsatz der Ablaufverfolgungen ausgeführt (z. B. bewirkt die Eingabe von 1.0 eine Ausführung der Scorer auf 100% Ihrer Ablaufverfolgungen, und .2 wird auf 20%Ihrer Ablaufverfolgungen ausgeführt, usw.).

Wenn Sie die Samplingrate pro Scorer festlegen möchten, müssen Sie das SDK verwenden.

Spur

Verwenden des SDK

Verwenden Sie den folgenden Codeausschnitt, um die Scorer zu aktivieren, die in Schritt 1 erfolgreich ausgeführt wurden. Wenn Sie eine Samplingrate auswählen, werden die Scorer nur auf diesen Prozentsatz der Ablaufverfolgungen ausgeführt (z. B. bewirkt die Eingabe von 1.0 eine Ausführung der Scorer auf 100% Ihrer Ablaufverfolgungen, und .2 wird auf 20%Ihrer Ablaufverfolgungen ausgeführt, usw.). Optional können Sie die Samplingrate pro Scorer konfigurieren.

# These packages are automatically installed with mlflow[databricks]
from databricks.agents.monitoring import create_external_monitor, AssessmentsSuiteConfig, BuiltinJudge, GuidelinesJudge

external_monitor = create_external_monitor(
    # Change to a Unity Catalog schema where you have CREATE TABLE permissions.
    catalog_name="workspace",
    schema_name="default",
    assessments_config=AssessmentsSuiteConfig(
        sample=1.0,  # sampling rate
        assessments=[
            # Predefined scorers "safety", "groundedness", "relevance_to_query", "chunk_relevance"
            BuiltinJudge(name="safety"),  # or {'name': 'safety'}
            BuiltinJudge(
                name="groundedness", sample_rate=0.4
            ),  # or {'name': 'groundedness', 'sample_rate': 0.4}
            BuiltinJudge(
                name="relevance_to_query"
            ),  # or {'name': 'relevance_to_query'}
            BuiltinJudge(name="chunk_relevance"),  # or {'name': 'chunk_relevance'}
            # Guidelines can refer to the request and response.
            GuidelinesJudge(
                guidelines={
                    # You can have any number of guidelines, each defined as a key-value pair.
                    "mlflow_only": [
                        "If the request is unrelated to MLflow, the response must refuse to answer."
                    ],  # Must be an array of strings
                    "customer_service_tone": [
                        """The response must maintain our brand voice which is:
    - Professional yet warm and conversational (avoid corporate jargon)
    - Empathetic, acknowledging emotional context before jumping to solutions
    - Proactive in offering help without being pushy

    Specifically:
    - If the customer expresses frustration, anger, or disappointment, the first sentence must acknowledge their emotion
    - The response must use "I" statements to take ownership (e.g., "I understand" not "We understand")
    - The response must avoid phrases that minimize concerns like "simply", "just", or "obviously"
    - The response must end with a specific next step or open-ended offer to help, not generic closings"""
                    ],
                }
            ),
        ],
    ),
)

print(external_monitor)

Schritt 3. Aktualisieren des Monitors

Um die Scorerkonfiguration zu ändern, verwenden Sie update_external_monitor(). Die Konfiguration ist zustandslos – d. h., sie wird vollständig vom Update überschrieben. Um eine vorhandene Konfiguration zum Ändern abzurufen, verwenden Sie get_external_monitor().

Verwenden der Benutzeroberfläche

Folgen Sie der nachstehenden Aufzeichnung, um die Benutzeroberfläche zum Aktualisieren der Scorer zu verwenden.

Spur

Verwenden des SDK

# These packages are automatically installed with mlflow[databricks]
from databricks.agents.monitoring import update_external_monitor, get_external_monitor
import os

config = get_external_monitor(experiment_id=os.environ["MLFLOW_EXPERIMENT_ID"])
print(config)


external_monitor = update_external_monitor(
    # You must pass the experiment_id of the experiment you want to update.
    experiment_id=os.environ["MLFLOW_EXPERIMENT_ID"],
    # Change to a Unity Catalog schema where you have CREATE TABLE permissions.
    assessments_config=AssessmentsSuiteConfig(
        sample=1.0,  # sampling rate
        assessments=[
            # Predefined scorers "safety", "groundedness", "relevance_to_query", "chunk_relevance"
            BuiltinJudge(name="safety"),  # or {'name': 'safety'}
            BuiltinJudge(
                name="groundedness", sample_rate=0.4
            ),  # or {'name': 'groundedness', 'sample_rate': 0.4}
            BuiltinJudge(
                name="relevance_to_query"
            ),  # or {'name': 'relevance_to_query'}
            BuiltinJudge(name="chunk_relevance"),  # or {'name': 'chunk_relevance'}
            # Guidelines can refer to the request and response.
            GuidelinesJudge(
                guidelines={
                    # You can have any number of guidelines, each defined as a key-value pair.
                    "mlflow_only": [
                        "If the request is unrelated to MLflow, the response must refuse to answer."
                    ],  # Must be an array of strings
                    "customer_service_tone": [
                        """The response must maintain our brand voice which is:
    - Professional yet warm and conversational (avoid corporate jargon)
    - Empathetic, acknowledging emotional context before jumping to solutions
    - Proactive in offering help without being pushy

    Specifically:
    - If the customer expresses frustration, anger, or disappointment, the first sentence must acknowledge their emotion
    - The response must use "I" statements to take ownership (e.g., "I understand" not "We understand")
    - The response must avoid phrases that minimize concerns like "simply", "just", or "obviously"
    - The response must end with a specific next step or open-ended offer to help, not generic closings"""
                    ],
                }
            ),
        ],
    ),
)

print(external_monitor)

Schritt 4. Verwenden von Überwachungsergebnissen

Der Überwachungsauftrag dauert ca. 15 - 30 Minuten, bis er zum ersten Mal ausgeführt wird. Nach der ersten Ausführung wird sie alle 15 Minuten ausgeführt. Beachten Sie, dass die Aufgabe zusätzliche Zeit in Anspruch nehmen kann, wenn Sie über ein großes Volumen an Produktionstraffic verfügen.

Jedes Mal, wenn der Auftrag ausgeführt wird, passiert Folgendes:

  1. Führt jeden Scorer für das Beispiel von Ablaufverfolgungen aus.
    • Wenn Sie unterschiedliche Samplingraten pro Scorer haben, versucht der Überwachungsauftrag, so viele der gleichen Ablaufverfolgungen wie möglich zu erfassen. Wenn beispielsweise Scorer A eine Samplingrate von 20% hat und Scorer B eine Samplingrate von 40% hat, werden die gleichen 20% Spuren für A und B verwendet.
  2. Fügt das Feedback des Scorers zu jedem Protokoll im MLflow-Versuch hinzu.
  3. In die in Schritt 1 konfigurierte Delta-Tabelle wird eine Kopie aller Ablaufverfolgungen (nicht nur der stichprobenartigen) geschrieben.

Sie können die Überwachungsergebnisse mithilfe der Registerkarte "Überwachung" im MLflow-Experiment anzeigen. Alternativ können Sie die Traces in der generierten Delta-Tabelle mit SQL oder Spark abfragen.

Nächste Schritte

Fahren Sie mit diesen empfohlenen Aktionen und Lernprogrammen fort.

Referenzhandbücher

In dieser Anleitung finden Sie ausführliche Dokumentation zu Konzepten und Features.