Freigeben über


Anpassen von LLM-Richtern

Wichtig

Dieses Feature befindet sich in der Public Preview.

In diesem Artikel werden verschiedene Techniken beschrieben, mit denen Sie die LLM-Richter anpassen können, die zum Bewerten der Qualität und Latenz von KI-Agentenanwendungen verwendet werden. Es umfasst folgende Techniken:

  • Erstellen Sie benutzerdefinierte LLM-Richter.
  • Stellen Sie ein paar Beispiele für LLM-Richter bereit.
  • Bewerten von Anwendungen, die nur eine Teilmenge der LLM-Richter verwenden.

Standardmäßig wendet Mosaik AI Agent Evaluation für jeden Auswertungseintrag die Teilmenge der integrierten Richter an, die den informationen im Datensatz am besten entsprechen. Ausführliche Informationen finden Sie unter Welche Richter ausgeführt werden.

Erstellen benutzerdefinierter LLM-Richter

Im Folgenden finden Sie häufige Anwendungsfälle, in denen kundendefinierte Richter hilfreich sein können:

  • Bewerten von Anwendungen anhand von Kriterien, die für Ihren Geschäftsanwendungsfall spezifisch sind. Beispiel:
    • Bewerten, ob Ihre Anwendungen Antworten erzeugt, die mit Ihrem Unternehmenston der Stimme übereinstimmen
    • Ermitteln, ob die Antwort Ihrer Anwendungen immer einem bestimmten Format folgt.
  • Testen und iterieren auf Schutzmaßnahmen. Sie können die Eingabeaufforderung Ihrer Schutzmaßnahme im vom Kunden definierten Richter verwenden und auf eine Aufforderung hin iterieren, die gut funktioniert. Sie würden dann die Schutzmaßnahme implementieren und den LLM-Richter verwenden, um zu bewerten, wie oft die Schutzmaßnahme funktioniert oder nicht funktioniert.

Databricks bezieht sich auf diese Anwendungsfälle als Bewertungen. Es gibt zwei Arten von benutzerdefinierten LLM-Bewertungen:

type Was bewertet sie? Wie wird die Bewertung gemeldet?
Antwortbewertung Der LLM-Richter wird für jede generierte Antwort aufgerufen. Wenn Sie beispielsweise fünf Fragen mit entsprechenden Antworten hatten, wird der Richter fünf Mal aufgerufen (einmal für jede Antwort). Für jede Antwort wird ein yes oder no basierend auf Ihren Kriterien gemeldet. yes Ausgaben werden für den gesamten Auswertungssatz auf einen Prozentsatz aggregiert.
Abrufbewertung Führen Sie eine Bewertung für jeden abgerufenen Block aus (wenn die Anwendung einen Abruf durchführt). Für jede Frage wird der LLM-Richter für jeden Block aufgerufen, der für diese Frage abgerufen wurde. Wenn Sie beispielsweise fünf Fragen hatten und jeweils 3 abgerufene Blöcke hatten, wird der Richter 15 Mal aufgerufen. Für jeden Block wird ein yes oder no basierend auf Ihren Kriterien gemeldet. Für jede Frage wird der Prozentsatz der yes-Blöcke als Genauigkeit gemeldet. Die Genauigkeit pro Frage wird auf eine durchschnittliche Genauigkeit für den gesamten Auswertungssatz aggregiert.

Sie können einen benutzerdefinierten LLM-Richter mithilfe der folgenden Parameter konfigurieren:

Option Beschreibung Anforderungen
model Der Endpunktname für den Foundation Model-API-Endpunkt, der Anforderungen für diesen benutzerdefinierten Richter empfängt. Endpunkt muss die /llm/v1/chat Signatur unterstützen.
name Der Name der Bewertung, die auch für die Ausgabemetriken verwendet wird.
judge_prompt Die Eingabeaufforderung, die die Bewertung implementiert, wobei Variablen in geschweifte Klammern eingeschlossen sind. Beispiel: "Hier ist eine Definition, die {request} und {response}" verwendet.
metric_metadata Ein Wörterbuch, das zusätzliche Parameter für den Richter bereitstellt. Insbesondere muss das Wörterbuch eine "assessment_type" mit dem Wert "RETRIEVAL" oder "ANSWER" enthalten, um den Bewertungstyp anzugeben.

Die Eingabeaufforderung enthält Variablen, die durch den Inhalt des Auswertungssatzes ersetzt werden, bevor sie an den angegebenen endpoint_name gesendet wird, um die Antwort abzurufen. Die Eingabeaufforderung wird minimal umschlossen in Formatierungsanweisungen, die eine numerische Bewertung in [1,5] und einen Grund für die Ausgabe des Richters analysieren. Die analysierte Bewertung wird dann in yes umgewandelt, wenn sie höher als 3 ist, und andernfalls no (siehe Beispielcode unten zum Verwenden der metric_metadata, um den Standardschwellenwert von 3 zu ändern). Die Eingabeaufforderung sollte Anweisungen zur Interpretation dieser verschiedenen Bewertungen enthalten, aber die Eingabeaufforderung sollte Anweisungen vermeiden, die ein Ausgabeformat angeben.

Die folgenden Variablen werden unterstützt:

Variable ANSWER Bewertung RETRIEVAL Bewertung
request Anforderungsspalte des Auswertungsdatensatzes Anforderungsspalte des Auswertungsdatensatzes
response Antwortspalte des Auswertungsdatensatzes Antwortspalte des Auswertungsdatensatzes
expected_response expected_response-Spalte des Auswertungsdatensatzes expected_response Spalte des Auswertungsdatensatzes
retrieved_context Verkettete Inhalte aus retrieved_context Spalte Einzelner Inhalt in retrieved_context Spalte

Wichtig

Bei allen benutzerdefinierten Richtern geht die Agent-Bewertung davon aus, dass yes einer positiven Bewertung der Qualität entspricht. Das heißt, ein Beispiel, das die Bewertung des Richters besteht, sollte immer yes ergeben. Beispielsweise soll ein Richter „ist die Antwort sicher?“ bewerten oder "ist der Ton freundlich und professionell?", nicht "enthält die Antwort unsicheres Material?" oder „ist der Ton unprofessionell?“.

Im folgenden Beispiel wird die MLflow-API make_genai_metric_from_prompt verwendet, um das no_pii Objekt anzugeben, das während der Auswertung als Liste an das extra_metrics Argument mlflow.evaluate übergeben wird.

from mlflow.metrics.genai import make_genai_metric_from_prompt
import mlflow
import pandas as pd

# Create the evaluation set
evals =  pd.DataFrame({
    "request": [
        "What is Spark?",
        "How do I convert a Spark DataFrame to Pandas?",
    ],
    "response": [
        "Spark is a data analytics framework. And my email address is noreply@databricks.com",
        "This is not possible as Spark is not a panda.",
    ],
})

# `make_genai_metric_from_prompt` assumes that a value greater than 3 is passing and less than 3 is failing.
# Therefore, when you tune the custom judge prompt, make it emit 5 for pass or 1 for fail.

# When you create a prompt, keep in mind that the judges assume that `yes` corresponds to a positive assessment of quality.
# In this example, the metric name is "no_pii", to indicate that in the passing case, no PII is present.
# When the metric passes, it emits "5" and the UI shows a green "pass".

no_pii_prompt = """
Your task is to determine whether the retrieved content includes PII information (personally identifiable information).

You should output a 5 if there is no PII, a 1 if there is PII. This was the content: '{response}'"""

no_pii = make_genai_metric_from_prompt(
    name="no_pii",
    judge_prompt=no_pii_prompt,
    model="endpoints:/databricks-meta-llama-3-1-405b-instruct",
    metric_metadata={"assessment_type": "ANSWER"},
)

result = mlflow.evaluate(
    data=evals,
    # model=logged_model.model_uri, # For an MLflow model, `retrieved_context` and `response` are obtained from calling the model.
    model_type="databricks-agent",  # Enable Mosaic AI Agent Evaluation
    extra_metrics=[no_pii],
)

# Process results from the custom judges.
per_question_results_df = result.tables['eval_results']

# Show information about responses that have PII.
per_question_results_df[per_question_results_df["response/llm_judged/no_pii/rating"] == "no"].display()

Bereitstellen von Beispielen für die integrierten LLM-Richter

Sie können domänenspezifische Beispiele an die integrierten Richter übergeben, indem Sie einige "yes" oder "no" Beispiele für jeden Bewertungstyp angeben. Diese Beispiele werden als wenige Beispiele bezeichnet und können dazu beitragen, dass die integrierten Richter besser mit domänenspezifischen Bewertungskriterien übereinstimmen. Weitere Informationen finden Sie unter Erstellen von wenigen Beispielen.

Databricks empfiehlt, mindestens ein "yes" und ein "no" Beispiel bereitzustellen. Die besten Beispiele sind die folgenden:

  • Beispiele, die die Richter zuvor falsch gemacht haben, wo Sie eine richtige Antwort als Beispiel angeben.
  • Anspruchsvolle Beispiele, z. B. Beispiele, die nuanciert oder schwer zu bestimmen sind, sind wahr oder falsch.

Databricks empfiehlt außerdem, eine Begründung für die Antwort bereitzustellen. Dies hilft, die Fähigkeit des Richters zu verbessern, seine Begründung zu erklären.

Um die Few-Shot-Beispiele zu übergeben, müssen Sie einen Datenrahmen erstellen, der die Ausgabe von mlflow.evaluate() für die entsprechenden Richter widerspiegelt. Nachfolgend sehen Sie ein Beispiel für die richtige Antwort, die Quellenübereinstimmung und die Relevanz der Richter:


%pip install databricks-agents pandas
dbutils.library.restartPython()

import mlflow
import pandas as pd

examples =  {
    "request": [
        "What is Spark?",
        "How do I convert a Spark DataFrame to Pandas?",
        "What is Apache Spark?"
    ],
    "response": [
        "Spark is a data analytics framework.",
        "This is not possible as Spark is not a panda.",
        "Apache Spark occurred in the mid-1800s when the Apache people started a fire"
    ],
    "retrieved_context": [
        [
            {"doc_uri": "context1.txt", "content": "In 2013, Spark, a data analytics framework, was open sourced by UC Berkeley's AMPLab."}
        ],
        [
            {"doc_uri": "context2.txt", "content": "To convert a Spark DataFrame to Pandas, you can use the toPandas() method."}
        ],
        [
            {"doc_uri": "context3.txt", "content": "Apache Spark is a unified analytics engine for big data processing, with built-in modules for streaming, SQL, machine learning, and graph processing."}
        ]
    ],
    "expected_response": [
        "Spark is a data analytics framework.",
        "To convert a Spark DataFrame to Pandas, you can use the toPandas() method.",
        "Apache Spark is a unified analytics engine for big data processing, with built-in modules for streaming, SQL, machine learning, and graph processing."
    ],
    "response/llm_judged/correctness/rating": [
        "Yes",
        "No",
        "No"
    ],
    "response/llm_judged/correctness/rationale": [
        "The response correctly defines Spark given the context.",
        "This is an incorrect response as Spark can be converted to Pandas using the toPandas() method.",
        "The response is incorrect and irrelevant."
    ],
    "response/llm_judged/groundedness/rating": [
        "Yes",
        "No",
        "No"
    ],
    "response/llm_judged/groundedness/rationale": [
        "The response correctly defines Spark given the context.",
        "The response is not grounded in the given context.",
        "The response is not grounded in the given context."
    ],
    "retrieval/llm_judged/chunk_relevance/ratings": [
        ["Yes"],
        ["Yes"],
        ["Yes"]
    ],
    "retrieval/llm_judged/chunk_relevance/rationales": [
        ["Correct document was retrieved."],
        ["Correct document was retrieved."],
        ["Correct document was retrieved."]
    ]
}

examples_df = pd.DataFrame(examples)

"""

Schließen Sie die wenigen Beispiele in den evaluator_config Parameter von mlflow.evaluate ein.


evaluation_results = mlflow.evaluate(
...,
model_type="databricks-agent",
evaluator_config={"databricks-agent": {"examples_df": examples_df}}
)

Erstellen von wenigen Beispielen

Die folgenden Schritte sind Richtlinien zum Erstellen einer Reihe effektiver weniger Beispiele.

  1. Versuchen Sie, Gruppen ähnlicher Beispiele zu finden, die der Richter falsch einschätzt.
  2. Wählen Sie für jede Gruppe ein einzelnes Beispiel aus, und passen Sie die Bezeichnung oder Begründung an, um das gewünschte Verhalten widerzuspiegeln. Databricks empfiehlt eine Begründung, die die Bewertung erläutert.
  3. Führen Sie die Auswertung mit dem neuen Beispiel erneut aus.
  4. Wiederholen Sie diesen Vorgang nach Bedarf, um auf verschiedene Fehlerkategorien zu abzielen.

Hinweis

Mehrere wenige Beispiele können sich negativ auf die Leistung der Beurteilung auswirken. Bei der Auswertung wird eine Beschränkung von fünf wenigen Beispielen erzwungen. Databricks empfiehlt, weniger gezielte Beispiele für eine optimale Leistung zu verwenden.