Freigeben über


Evaluationssätze (MLflow 2)

Von Bedeutung

Auf dieser Seite wird die Verwendung der Agentauswertungsversion 0.22 mit MLflow 2 beschrieben. Databricks empfiehlt die Verwendung von MLflow 3, die in die Agent-Auswertung >1.0integriert ist. In MLflow 3 sind Die Agentauswertungs-APIs jetzt Teil des mlflow Pakets.

Informationen zu diesem Thema finden Sie unter Building MLflow Evaluation Datasets.

Um die Qualität eines KI-Agents zu messen, müssen Sie in der Lage sein, einen repräsentativen Satz von Anforderungen zusammen mit Kriterien zu definieren, die hochwertige Antworten kennzeichnen. Dazu stellen Sie einen Auswertungssatz bereit. Dieser Artikel behandelt die verschiedenen Optionen für Ihr Evaluationsset und einige bewährte Verfahren zur Erstellung eines Evaluationssets.

Databricks empfiehlt, einen Humanevaluationssatz zu erstellen, der aus repräsentativen Fragen und echten Antworten besteht. Wenn Ihre Anwendung einen Abrufschritt enthält, können Sie optional die unterstützenden Dokumente bereitstellen, auf denen Sie erwarten, dass die Antwort basiert. Um Ihnen den Einstieg in die Erstellung eines Evaluationsdatensatzes zu erleichtern, stellt Databricks ein SDK bereit, das qualitativ hochwertige synthetische Fragen und Antworten generiert, die direkt in der Agentenevaluation verwendet oder an Fachexperten zur Überprüfung gesendet werden können. Weitere Informationen finden Sie unter Synthetisieren von Auswertungssätzen.

Ein guter Auswertungssatz weist die folgenden Merkmale auf:

  • Repräsentativ: er sollte genau den Umfang der Anforderungen widerspiegeln, die die Anwendung in der Produktion findet.
  • Herausforderung: Es sollte schwierige und vielfältige Fälle umfassen, um die gesamte Palette der Anwendungsfunktionen effektiv zu testen.
  • Kontinuierlich aktualisiert: Er sollte regelmäßig aktualisiert werden, um die Verwendung der Anwendung und die sich ändernden Muster des Produktionsverkehrs widerzuspiegeln.

Informationen zum erforderlichen Schema eines Auswertungssatzes finden Sie unter Agent Evaluation Input Schema (MLflow 2).For the required schema of an evaluation set, see Agent Evaluation input schema (MLflow 2).

Beispielauswertungssätze

Dieser Abschnitt enthält einfache Beispiele für Evaluationssätze.

Beispielauswertungssatz mit nur request

eval_set = [
    {
        "request": "What is the difference between reduceByKey and groupByKey in Spark?",
    }
]

Beispielauswertungssatz mit request und expected_response

eval_set  = [
    {
        "request_id": "request-id",
        "request": "What is the difference between reduceByKey and groupByKey in Spark?",
        "expected_response": "There's no significant difference.",
    }
]

Beispielauswertungssatz mit request, expected_responseund expected_retrieved_content

eval_set  = [
    {
        "request_id": "request-id",
        "request": "What is the difference between reduceByKey and groupByKey in Spark?",
        "expected_retrieved_context": [
            {
                "doc_uri": "doc_uri_1",
            },
            {
                "doc_uri": "doc_uri_2",
            },
        ],
        "expected_response": "There's no significant difference.",
    }
]

Beispielauswertungssatz mit nur request und response

eval_set = [
    {
        "request": "What is the difference between reduceByKey and groupByKey in Spark?",
        "response": "reduceByKey aggregates data before shuffling, whereas groupByKey shuffles all data, making reduceByKey more efficient.",
    }
]

Beispielauswertungssatz mit einem willkürlich formatierten request und response

eval_set = [
    {
        "request": {"query": "Difference between", "item_a": "reduceByKey", "item_b": "groupByKey"},
        "response": {
            "differences": [
                "reduceByKey aggregates data before shuffling",
                "groupByKey shuffles all data",
                "reduceByKey is more efficient",
            ]
        }
    }
]

Beispielauswertungssatz mit request, responseund guidelines

eval_set = [
    {
        "request": "What is the difference between reduceByKey and groupByKey in Spark?",
        "response": "reduceByKey aggregates data before shuffling, whereas groupByKey shuffles all data, making reduceByKey more efficient.",
        # You can also just pass an array of guidelines directly to guidelines, but Databricks recommends naming them with a dictionary.
        "guidelines": {
            "english": ["The response must be in English"],
            "clarity": ["The response must be clear, coherent, and concise"],
        }
    }
]

Beispielauswertungssatz mit request, response, und guidelinesexpected_facts

eval_set = [
    {
        "request": "What is the difference between reduceByKey and groupByKey in Spark?",
        "response": "reduceByKey aggregates data before shuffling, whereas groupByKey shuffles all data, making reduceByKey more efficient.",
        "expected_facts": [
            "There's no significant difference.",
        ],
        # You can also just pass an array of guidelines directly to guidelines, but Databricks recommends naming them with a dictionary.
        "guidelines": {
            "english": ["The response must be in English"],
            "clarity": ["The response must be clear, coherent, and concise"],
        }
    }
]

Beispielauswertungssatz mit request, responseund retrieved_context

eval_set = [
    {
        "request_id": "request-id", # optional, but useful for tracking
        "request": "What is the difference between reduceByKey and groupByKey in Spark?",
        "response": "reduceByKey aggregates data before shuffling, whereas groupByKey shuffles all data, making reduceByKey more efficient.",
        "retrieved_context": [
            {
                # In `retrieved_context`, `content` is optional, but delivers additional functionality if provided (the Databricks Context Relevance LLM judge runs to check the relevance of the provided content to the request).
                "content": "reduceByKey reduces the amount of data shuffled by merging values before shuffling.",
                "doc_uri": "doc_uri_2_1",
            },
            {
                "content": "groupByKey may lead to inefficient data shuffling due to sending all values across the network.",
                "doc_uri": "doc_uri_6_extra",
            },
        ],
    }
]

Beispielauswertungssatz mit request, response, und retrieved_context expected_facts

eval_set  = [
    {
        "request_id": "request-id",
        "request": "What is the difference between reduceByKey and groupByKey in Spark?",
        "expected_facts": [
            "There's no significant difference.",
        ],
        "response": "reduceByKey aggregates data before shuffling, whereas groupByKey shuffles all data, making reduceByKey more efficient.",
        "retrieved_context": [
            {
                # In `retrieved_context`, `content` is optional, but delivers additional functionality if provided (the Databricks Context Relevance LLM judge runs to check the relevance of the provided content to the request).
                "content": "reduceByKey reduces the amount of data shuffled by merging values before shuffling.",
                "doc_uri": "doc_uri_2_1",
            },
            {
                "content": "groupByKey may lead to inefficient data shuffling due to sending all values across the network.",
                "doc_uri": "doc_uri_6_extra",
            },
        ],
    }
]

Beispielauswertungssatz mit request, response, retrieved_context, und expected_facts expected_retrieved_context

eval_set  = [
    {
        "request_id": "request-id",
        "request": "What is the difference between reduceByKey and groupByKey in Spark?",
        "expected_retrieved_context": [
            {
                "doc_uri": "doc_uri_2_1",
            },
            {
                "doc_uri": "doc_uri_2_2",
            },
        ],
        "expected_facts": [
            "There's no significant difference.",
        ],
        "response": "reduceByKey aggregates data before shuffling, whereas groupByKey shuffles all data, making reduceByKey more efficient.",
        "retrieved_context": [
            {
                # In `retrieved_context`, `content` is optional, but delivers additional functionality if provided (the Databricks Context Relevance LLM judge runs to check the relevance of the provided content to the request).
                "content": "reduceByKey reduces the amount of data shuffled by merging values before shuffling.",
                "doc_uri": "doc_uri_2_1",
            },
            {
                "content": "groupByKey may lead to inefficient data shuffling due to sending all values across the network.",
                "doc_uri": "doc_uri_6_extra",
            },
        ],
    }
]

Bewährte Methoden für die Entwicklung eines Evaluierungssatzes

  • Betrachten Sie jede Stichprobe oder eine Gruppe von Stichproben im Auswertungssatz als Komponententest. Das heißt, jedes Beispiel sollte einem bestimmten Szenario mit einem explizit erwarteten Ergebnis entsprechen. Erwägen Sie z. B. das Testen längerer Kontexte, Multi-Hop-Begründungen und die Möglichkeit, Antworten von indirekten Nachweisen abzuleiten.
  • Erwägen Sie das Testen von Adversarialszenarien von böswilligen Benutzern.
  • Es gibt keine spezifische Richtlinie für die Anzahl der Fragen, die in einen Auswertungssatz aufgenommen werden sollen, aber klare Signale aus qualitativ hochwertigen Daten führen in der Regel besser aus als laute Signale aus schwachen Daten.
  • Erwägen Sie die Einbeziehung von Beispielen, die auch für Menschen sehr schwierig zu beantworten sind.
  • Ganz gleich, ob Sie eine allgemeine Anwendung erstellen oder auf eine bestimmte Domäne abzielen, ihre App wird wahrscheinlich eine Vielzahl von Fragen haben. Der Auswertungssatz sollte dies widerspiegeln. Wenn Sie beispielsweise eine Anwendung zum Feld bestimmter HR-Fragen erstellen, sollten Sie dennoch andere Domänen (z. B. Vorgänge) testen, um sicherzustellen, dass die Anwendung keine Halluzinationen hervorruft oder schädliche Antworten liefert.
  • Qualitativ hochwertige, konsistente, vom Menschen generierte Bezeichnungen sind die beste Möglichkeit, um sicherzustellen, dass die Grundwahrheitswerte, die Sie der Anwendung bereitstellen, das gewünschte Verhalten genau widerspiegeln. Es folgen einige Schritte, um qualitativ hochwertige Humanbezeichnungen zu gewährleisten:
    • Aggregierte Antworten (Bezeichnungen) von mehreren menschlichen Bezeichnungen für dieselbe Frage.
    • Stellen Sie sicher, dass die Bezeichnungsanweisungen klar sind und dass die Bezeichnungselemente konsistent sind.
    • Stellen Sie sicher, dass die Bedingungen für den Prozess der Kennzeichnung mit dem Format der Anforderungen identisch sind, die an die RAG-Anwendung übermittelt werden.
  • Menschliche Bezeichnungen sind von Natur aus laut und inkonsistent, z. B. aufgrund unterschiedlicher Interpretationen der Frage. Dies ist ein wichtiger Bestandteil des Prozesses. Die Verwendung von menschlichen Bezeichnungen kann Interpretationen von Fragen offenlegen, die Sie nicht berücksichtigt haben, und dies kann Einblicke in das Verhalten geben, das Sie in Ihrer Anwendung beobachten.