Compartilhar via


Conjuntos de avaliação

Importante

Esse recurso está em uma versão prévia.

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

A Databricks recomenda a criação de um conjunto de avaliação rotulado por humanos, que consiste em perguntas representativas e respostas verdadeiras. Se o seu pedido incluir uma etapa de recuperação, você poderá, opcionalmente, fornecer os documentos de suporte nos quais espera que a resposta se baseie. Embora um conjunto de avaliação rotulado por humanos seja recomendado, a Avaliação do Agente funciona igualmente bem com conjuntos de avaliação gerados sinteticamente.

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

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

Para obter o esquema necessário de um conjunto de avaliação, consulte Esquema de entrada de Avaliação do Agente.

Conjuntos de avaliações de amostra

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

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

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

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

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

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

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

  • Considere cada exemplo ou grupo de exemplos no conjunto de avaliação como um teste de unidade. 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 colocar em campo perguntas específicas de RH, ainda deverá considerar testar outros domínios (por exemplo, operações), para garantir que o aplicativo não tenha alucinações ou forneça respostas prejudiciais.
  • Rótulos gerados por humanos, de alta qualidade e consistentes gerados, são a melhor maneira de garantir que os valores de verdade básica que você fornece ao aplicativo reflitam com precisão o comportamento desejado. Algumas etapas 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.
    • Verifique se as instruções de rotulagem são claras e se os rotuladores humanos são consistentes.
    • Verifique se as condições para o processo de rotulagem humana são idênticas ao formato de solicitações enviadas ao aplicativo RAG.
  • Os rotuladores humanos são por natureza barulhentos e inconsistentes, por exemplo, devido a diferentes interpretações da 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.