Conjuntos de avaliação
Prévia
Este recurso está em Prévia pública.
Para medir a qualidade de um aplicativo de agente, você precisa ser capaz de definir um conjunto representativo de solicitações junto 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.
Databricks recomenda a criação de um conjunto de avaliação de rótulo humano, que consiste em perguntas representativas e respostas de verdade. Se a sua solicitação incluir um passo de recuperação, o senhor pode, opcionalmente, fornecer os documentos de apoio nos quais espera que a resposta se baseie. Embora seja recomendado um conjunto de avaliação com rótulo humano, o Agent Evaluation funciona igualmente bem com conjuntos de avaliação gerados sinteticamente.
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.
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 necessário de um conjunto de avaliação, consulte Esquema de entrada de avaliação do agente.
Conjuntos de avaliações de amostras
Esta seção inclui exemplos simples de conjuntos de avaliação.
Exemplo de avaliação definido somente com request
eval_set = [
{
"request": "What is the difference between reduceByKey and groupByKey in Spark?",
}
]
Exemplo de avaliação definido 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 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 comrequest
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.",
}
]
Exemplo 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",
},
],
}
]
Exemplo de avaliação definido 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 amostras 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 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.
Os rótulos gerados por humanos, consistentes e de alta qualidade, são a melhor maneira de garantir que os valores da verdade básica que o senhor fornece ao aplicativo reflitam com precisão o comportamento desejado. Alguns dos passos para garantir um rótulo humano 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.
Assegurar que as condições para o processo de título humano sejam idênticas ao formato das solicitações enviadas para o aplicativo 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.