Freigeben über


Auswertungssätze

Wichtig

Dieses Feature befindet sich in der Public Preview.

Um die Qualität einer agentischen Anwendung 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. In diesem Artikel werden die verschiedenen Optionen für Ihren Evaluierungssatz und einige bewährte Methoden zum Erstellen eines Evaluierungssatzes behandelt.

Databricks empfiehlt, einen beschrifteten Evaluierungssatz zu erstellen, der aus repräsentativen Fragen und bodenwahren Antworten besteht. Wenn Ihre Anwendung einen Abrufschritt enthält, können Sie optional die unterstützenden Dokumente bereitstellen, auf denen die Antwort basieren soll. Während ein beschriftetes Evaluierungsset empfohlen wird, funktioniert die Agent-Auswertung gleichermaßen gut mit synthetischen 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: Er 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.

Beispielauswertungssätze

Dieser Abschnitt enthält einfache Beispiele für Auswertungssä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 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_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.",
        "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_response expected_retrieved_context

level_4_data  = [
    {
        "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_response": "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 Auswertungssatzes

  • 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.