Condividi tramite


Set di valutazione

Importante

Questa funzionalità è disponibile in anteprima pubblica.

Per misurare la qualità di un'applicazione agente , è necessario essere in grado di definire un set rappresentativo di richieste insieme a criteri che caratterizzano risposte di alta qualità. Tu lo fai fornendo un set di valutazione. Questo articolo illustra le varie opzioni per il set di valutazione e alcune procedure consigliate per la creazione di un set di valutazione.

Databricks consiglia di creare un set di valutazione con etichetta umana, costituito da domande rappresentative e risposte alla verità. Se l'applicazione include un passaggio di recupero, è possibile specificare facoltativamente i documenti di supporto su cui si prevede che la risposta sia basata. Per iniziare a creare un set di valutazione, Databricks fornisce un SDK per generare domande sintetiche di alta qualità e risposte verificate che possono essere usate direttamente nella valutazione dell'Agent o inviate a esperti in materia per la revisione. Fare riferimento a Sintetizzare i set di valutazione.

Un set di valutazione valido presenta le caratteristiche seguenti:

  • Rappresentativo: deve riflettere in modo accurato l'intervallo di richieste che l'applicazione incontrerà nell'ambiente di produzione.
  • Difficile: deve includere casi difficili e diversi per testare in modo efficace l'intera gamma di funzionalità dell'applicazione.
  • Aggiornamento continuo: deve essere aggiornato regolarmente per riflettere il modo in cui viene usata l'applicazione e i modelli mutevoli del traffico di produzione.

Per lo schema richiesto di un set di valutazione, vedere lo schema di input dell'agente per la valutazione .

Set di valutazioni di esempio

Questa sezione include semplici esempi di set di valutazione.

Set di valutazione di esempio con soltanto request

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

Esempio di set di valutazione con request e 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.",
    }
]

Set di valutazione di esempio con request, expected_responsee 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.",
    }
]

Set di valutazione di esempio con soltanto request e 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.",
    }
]

Set di valutazione di esempio con i tag request e response formattati in modo arbitrario

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",
            ]
        }
    }
]

Set di valutazione di esempio con request, responsee 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"],
        }
    }
]

Set di valutazione di esempio con request, response, guidelinese 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"],
        }
    }
]

Set di valutazione di esempio con request, responsee 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",
            },
        ],
    }
]

Set di valutazione di esempio con request, response, retrieved_contexte 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",
            },
        ],
    }
]

Set di valutazione di esempio con request, response, retrieved_context, expected_factse 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",
            },
        ],
    }
]

Procedure consigliate per lo sviluppo di un set di valutazione

  • Si considerino ogni esempio, o gruppo di campioni, nel set di valutazione come test unitario. Ovvero, ogni esempio deve corrispondere a uno scenario specifico con un risultato previsto esplicito. Si consideri, ad esempio, di testare contesti più lunghi, ragionamenti multi hop e capacità di dedurre risposte da prove indirette.
  • Valutare la possibilità di testare scenari antagonisti da utenti malintenzionati.
  • Non esistono linee guida specifiche sul numero di domande da includere in un set di valutazione, ma segnali chiari provenienti da dati di alta qualità offrono in genere prestazioni migliori rispetto ai segnali rumorosi provenienti da dati deboli.
  • Prendere in considerazione l'inclusione di esempi molto impegnativi, anche per gli esseri umani da rispondere.
  • Indipendentemente dal fatto che tu stia creando un'applicazione per utilizzo generico o destinata a un dominio specifico, la tua app probabilmente incontrerà un'ampia gamma di domande. Il set di valutazione dovrebbe rifletterlo. Ad esempio, se si sta creando un'applicazione per specificare domande sulle risorse umane, è comunque consigliabile provare a testare altri domini (ad esempio le operazioni), per assicurarsi che l'applicazione non allucini o fornisca risposte dannose.
  • Le etichette generate dall'uomo di alta qualità e coerenti sono il modo migliore per garantire che i valori di verità oggettiva forniti all'applicazione riflettano accuratamente il comportamento previsto. Alcuni passaggi per garantire etichette umane di alta qualità sono le seguenti:
    • Aggregare risposte (etichette) da più etichettatori umani per la stessa domanda.
    • Assicurarsi che le istruzioni di etichettatura siano chiare e che gli etichettatori umani siano coerenti.
    • Assicurarsi che le condizioni per il processo di etichettatura umana siano identiche al formato delle richieste inviate all'applicazione RAG.
  • Gli etichettatori umani sono per natura rumorosi e incoerenti, ad esempio a causa di diverse interpretazioni della domanda. Si tratta di una parte importante del processo. L'uso dell'etichettatura umana può rivelare interpretazioni di domande che non sono state considerate e che potrebbero fornire informazioni dettagliate sul comportamento osservato nell'applicazione.