Conjuntos de avaliação (MLflow 2)
A Databricks recomenda o uso do MLflow 3 para avaliação e monitoramento de aplicativos GenAI. Esta página descreve o MLflow 2 Agent Evaluation.
- Para uma introdução à avaliação e monitoramento no MLflow 3, consulte Avalie e monitore agentes de AI.
- Para obter informações sobre como migrar para o MLflow 3, consulte Migrar para o MLflow 3 a partir da Agent Evaluation.
- Para informações sobre o MLflow 3 neste tópico, consulte Criando conjuntos de dados de avaliação do MLflow.
Para medir a qualidade de um agente de AI, é preciso ser capaz de definir um conjunto representativo de solicitações, juntamente com critérios que caracterizem 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 com rótulo humano, que consiste em perguntas representativas e respostas verdadeiras. Se seu aplicativo incluir o passo de recuperação, você pode, opcionalmente, fornecer os documentos de apoio nos quais espera que a resposta se baseie. Para ajudar você a começar a criar um conjunto de avaliação, a Databricks fornece um SDK para gerar perguntas sintéticas de alta qualidade e respostas verdadeiras que podem ser usadas diretamente no Agent Evaluation ou enviadas a especialistas no assunto para revisão. Consulte 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 capacidades do aplicativo.
- Atualizada continuamente: deve ser atualizado regularmente para refletir como o aplicativo é usado e as mudanças nos padrões de tráfego de produção.
Para o esquema obrigatório de um conjunto de avaliação, consulte esquema de entrada do Agent Evaluation (MLflow 2).
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 amostra 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.",
}
]
Exemplo de conjunto de avaliação definido 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.",
}
]
Exemplo de avaliação definido somente com 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 amostra com um request formatado arbitrariamente e 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",
]
}
}
]
Exemplo de conjunto de avaliação definido 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"],
}
}
]
Conjunto de avaliação de amostras 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"],
}
}
]
Exemplo de conjunto de avaliação definido 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 amostra 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 amostras 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 de unidade. Ou seja, cada amostra deve corresponder a um cenário específico com um resultado esperado explícito. Por exemplo, pense na possibilidade de testar contextos mais longos, raciocínio multihop e capacidade de inferir respostas a partir de evidências indiretas.
-
Você pode testar cenários adversos de usuários mal-intencionados.
-
Não há uma 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 geralmente têm melhor desempenho do que sinais ruidosos de dados fracos.
-
Você pode incluir exemplos muito difíceis, até mesmo para os humanos responderem.
-
Quer você esteja criando um aplicativo de uso geral ou voltado para um domínio específico, seu aplicativo provavelmente encontrará uma grande variedade de perguntas. O conjunto de avaliação deve refletir isso. Por exemplo, se você for criar um aplicativo para responder a perguntas específicas de RH, ainda assim deve pensar em 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 de alta qualidade e consistentes gerados por humanos são a melhor maneira de garantir que os valores de verdade fundamental que são fornecidos ao aplicativo reflitam com precisão o comportamento desejado. Os passos para garantir rótulos humanos de alta qualidade são os seguintes:
- Respostas agregadas (rótulos) de vários rotuladores humanos para a mesma pergunta.
- Certifique-se de que as instruções de rotulagem sejam claras e que os rotuladores humanos sejam consistentes.
- Certifique-se de que as condições para o processo de rótulo humano sejam idênticas ao formato das solicitações enviadas à aplicação RAG.
-
Os rotuladores humanos são, por natureza, ruidosos e inconsistentes, por exemplo, devido a interpretações diferentes da pergunta. Isso é uma parte importante do processo. O uso da rotulagem humana pode revelar interpretações de questões que você não considerou e isso pode fornecer entendimento sobre o comportamento que você observa em sua aplicação.