Compartilhar via


Conjuntos de avaliação (MLflow 2)

Importante

O Databricks recomenda o uso do MLflow 3 para avaliar e monitorar aplicativos GenAI. Esta página descreve a Avaliação do Agente do MLflow 2.

Para medir a qualidade de um agente de IA, você precisa ser capaz de definir um conjunto representativo de solicitações, juntamente com critérios que caracterizam respostas de alta qualidade. Para fazer isso, você deve fornecer um conjunto de avaliação. Este artigo aborda as várias opções para o seu conjunto de avaliação e algumas boas práticas para criar um conjunto de avaliação.

O Databricks recomenda a criação de um conjunto de avaliação rotulado por humanos, que consiste em perguntas representativas e respostas de uma verdade fundamental. Se o seu aplicativo incluir uma etapa de recuperação, você também poderá, opcionalmente, fornecer os documentos de apoio nos quais você espera que a resposta se baseie. Para ajudá-lo a começar a criar um conjunto de avaliação, o Databricks fornece um SDK para gerar perguntas sintéticas de alta qualidade e respostas de verdade básica que podem ser usadas diretamente na Avaliação do Agente ou enviadas a especialistas do assunto para revisão. Confira Sintetizar conjuntos de avaliação.

Um bom conjunto de avaliação tem as seguintes características:

  • Representativo: deve refletir com precisão o intervalo de solicitações que o aplicativo encontrará na produção.
  • Desafiador: deve incluir casos difíceis e diversos para testar efetivamente toda a gama de recursos do aplicativo.
  • Atualizado continuamente: deve ser atualizado regularmente para refletir como o aplicativo é usado e os padrões do tráfego de produção em constante mudança.

Para o esquema necessário de um conjunto de avaliação, consulte o esquema de entrada de Avaliação do Agente (MLflow 2).

Amostras de conjuntos de avaliação

Esta seção inclui exemplos simples de conjuntos de avaliação.

Amostras de conjuntos de avaliação com somente request

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

Conjunto de avaliação de exemplo com 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.",
    }
]

Amostras de conjuntos de avaliação com request, expected_response e 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.",
    }
]

Amostras de conjuntos de avaliação com somente 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.",
    }
]

Amostras de conjuntos de avaliação com request e response formatados arbitrariamente

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

Amostras de conjuntos de avaliação com request, response e 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"],
        }
    }
]

Amostras de conjuntos de avaliação com request, response, guidelines e 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"],
        }
    }
]

Amostras de conjuntos de avaliação com request, response e 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",
            },
        ],
    }
]

Conjunto de avaliação de exemplo com request, response, retrieved_context e 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",
            },
        ],
    }
]

Conjunto de avaliação de exemplo com request, response, retrieved_context, expected_facts e 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",
            },
        ],
    }
]

Práticas recomendadas para desenvolver um conjunto de avaliação

  • Considere cada amostra ou grupo de amostras no conjunto de avaliação como um teste unitário. Ou seja, cada exemplo deve corresponder a um cenário específico com um resultado esperado explícito. Por exemplo, considere testar contextos mais longos, raciocínio de vários saltos e capacidade de inferir respostas de evidências indiretas.
  • Considere testar cenários de adversários de usuários mal-intencionados.
  • Não há nenhuma diretriz específica sobre o número de perguntas a serem incluídas em um conjunto de avaliação, mas sinais claros de dados de alta qualidade normalmente têm um desempenho melhor do que sinais barulhentos de dados fracos.
  • Considere incluir exemplos que são muito desafiadores, mesmo para os humanos responderem.
  • Se você estiver criando um aplicativo de uso geral ou direcionando um domínio específico, seu aplicativo provavelmente encontrará uma ampla variedade de perguntas. O conjunto de avaliação deve refletir isso. Por exemplo, se você estiver criando um aplicativo para lidar com perguntas específicas de RH, mesmo assim deverá pensar em testar outros domínios (por exemplo, operações), para se certificar de que o aplicativo não tenha alucinações nem forneça respostas prejudiciais.
  • Rótulos consistentes de alta qualidade gerados por humanos são a melhor maneira de garantir que os valores de verdade fundamental fornecidos por você ao aplicativo reflitam com precisão o comportamento desejado. Algumas das etapas usadas para garantir rótulos humanos de alta qualidade são as seguintes:
    • Agregar respostas (rótulos) de vários rotuladores humanos para a mesma pergunta.
    • Verificar se as instruções de rotulagem são claras e se os rotuladores humanos são consistentes.
    • Verificar se as condições para o processo de rotulagem humana são idênticas ao formato das solicitações enviadas ao aplicativo RAG.
  • Os rotuladores humanos são barulhentos e inconsistentes por natureza, devido, por exemplo, às diferentes interpretações de uma questão. Essa é uma parte importante do processo. O uso da rotulagem humana pode revelar interpretações de perguntas que você não considerou e que podem fornecer insights sobre o comportamento que você observa em seu aplicativo.