Vyhodnocovací sady (MLflow 2)

Important

Databricks doporučuje používat MLflow 3 k vyhodnocení a monitorování aplikací GenAI. Tato stránka popisuje vyhodnocení agenta MLflow 2.

Abyste mohli měřit kvalitu agenta AI, musíte být schopni definovat reprezentativní sadu požadavků spolu s kritérii, která charakterizují vysoce kvalitní odpovědi. To uděláte tak, že poskytnete sadu pro hodnocení. Tento článek popisuje různé možnosti sady vyhodnocení a některé osvědčené postupy pro vytvoření sady hodnocení.

Databricks doporučuje vytvořit sadu hodnocení označenou člověkem, která se skládá z reprezentativních otázek a odpovědí na základní pravdu. Pokud vaše aplikace obsahuje krok načítání, můžete volitelně poskytnout podpůrné dokumenty, na kterých očekáváte, že bude odpověď založena. Aby vám pomohl začít s vytvářením sady hodnocení, poskytuje Databricks sadu SDK pro generování vysoce kvalitních syntetických otázek a ověřených odpovědí, které lze přímo využít při hodnocení agentů nebo je poslat odborníkům na dané téma k posouzení. Viz Syntetizujte vyhodnocovací sady.

Dobrá sada hodnocení má následující charakteristiky:

  • Zástupce: Měl by přesně odrážet rozsah požadavků, se kterými se aplikace setká v produkčním prostředí.
  • Náročné: Mělo by zahrnovat obtížné a různorodé případy, které efektivně testuje celou řadu funkcí aplikace.
  • Průběžně se aktualizuje: Pravidelně by se měla aktualizovat tak, aby odrážela způsob použití aplikace a měnící se vzory produkčního provozu.

Požadované schéma sady vyhodnocení najdete v tématu Vstupní schéma vyhodnocení agenta (MLflow 2).

Sady ukázkových hodnocení

Tato část obsahuje jednoduché příklady zkušebních sad.

Ukázková sada vyhodnocení s pouhým request

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

Ukázková sada pro vyhodnocení s request a 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.",
    }
]

Ukázková sada vyhodnocení s request, expected_response a 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.",
    }
]

Ukázková sada vyhodnocení pouze s request a 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.",
    }
]

Ukázková evaluační sada s libovolně formátovaným request a 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",
            ]
        }
    }
]

Ukázková sada vyhodnocení s request, response a 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"],
        }
    }
]

vzorek hodnotící sady s request, response, guidelinesa expected_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"],
        }
    }
]

Ukázková sada vyhodnocení s request, response a 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",
            },
        ],
    }
]

Ukázková sada pro vyhodnocení s request, response, retrieved_contexta 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",
            },
        ],
    }
]

Ukázková hodnotící sada s request, response, retrieved_context, expected_factsa 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",
            },
        ],
    }
]

osvědčené postupy pro vývoj sady hodnocení

  • Uvažujte každý vzorek nebo skupinu vzorků ve vyhodnocovací sadě jako jednotkový test. To znamená, že každý vzorek by měl odpovídat konkrétnímu scénáři s explicitním očekávaným výsledkem. Zvažte například testování delších kontextů, vícekrokové uvažování a schopnost odvodit odpovědi z nepřímých důkazů.
  • Zvažte testování nežádoucích scénářů od škodlivých uživatelů.
  • Neexistuje žádné konkrétní vodítko týkající se počtu otázek, které by se mohly zahrnout do sady hodnocení, ale jasné signály z vysoce kvalitních dat obvykle fungují lépe než hlučné signály ze slabých dat.
  • Zvažte zahrnutí příkladů, na které je velmi obtížné odpovědět, dokonce i pro lidi.
  • Ať už vytváříte aplikaci pro obecné účely nebo cílíte na konkrétní doménu, vaše aplikace se pravděpodobně setká s širokou škálou otázek. Sada hodnocení by to měla odrážet. Pokud například vytváříte aplikaci pro konkrétní otázky lidských zdrojů, měli byste zvážit testování jiných domén (například operací), aby se zajistilo, že aplikace nebude halucinovat nebo poskytovat škodlivé odpovědi.
  • Vysoce kvalitní, konzistentní popisky generované člověkem jsou nejlepším způsobem, jak zajistit, aby základní hodnoty pravdivých informací, které poskytnete aplikaci, přesně odrážely požadované chování. Některé kroky k zajištění vysoké kvality lidských štítků jsou následující:
    • Agregujte odpovědi (štítky) od více lidských hodnotitelů ke stejné otázce.
    • Ujistěte se, že jsou pokyny k označování jasné a že lidé pracující na označování postupují konzistentně.
    • Ujistěte se, že podmínky procesu označování člověkem jsou stejné jako formát požadavků odeslaných do aplikace RAG.
  • Lidští označovatelé jsou ze své podstaty nepřesní a nekonzistentní, například kvůli různým interpretacím otázky. To je důležitá část procesu. Používání lidského označování může odhalit interpretace otázek, na které jste nepomysleli, a které by mohly poskytnout porozumění chování, které sledujete ve své aplikaci.