Personalizar avaliadores LLM
Importante
Esse recurso está em uma versão prévia.
Este artigo descreve várias técnicas que você pode usar para personalizar os avaliadores LLM usados para avaliar a qualidade e a latência de aplicativos de IA de agente. Ele aborda as seguintes técnicas:
- Crie avaliadores LLM personalizados.
- Fornecer exemplos de poucos disparos para os avaliadores LLM.
- Avalie os aplicativos usando apenas um subconjunto de avaliadores LLM.
Por padrão, para cada registro de avaliação, a Avaliação do Agente do Mosaic AI aplica o subconjunto de juízes internos que melhor corresponde às informações presentes no registro. Para obter detalhes, consulte Quais juízes são executados.
Criar avaliadores LLM personalizados
Veja a seguir os casos de uso comuns em que os avaliadores definidos pelo cliente podem ser úteis:
- Avalie seu aplicativo em relação a critérios específicos para o seu caso de uso comercial. Por exemplo:
- Avalie se o seu aplicativo produz respostas alinhadas com o seu discurso corporativo
- Determine se a resposta do seu bot sempre segue um formato específico.
- Teste e iteração em verificadores de integridade. Você pode usar o prompt do verificador de integridade no avaliador definido pelo cliente e iterar em direção a um prompt que funcione bem. Em seguida, você implementa o verificador de integridade e utiliza o avaliador LLM para avaliar com que frequência o verificador de integridade está ou não funcionando.
O Databricks refere-se a esses casos de uso como avaliações. Há dois tipos de avaliações de LLM definidas pelo cliente:
Tipo | O que é avaliado? | Como a pontuação é relatada? |
---|---|---|
Avaliação de resposta | O juiz do LLM é chamado para cada resposta gerada. Por exemplo, se você tivesse cinco perguntas com respostas correspondentes, o juiz seria chamado cinco vezes (uma vez para cada resposta). | Para cada resposta, um yes ou no é relatado com base em seus critérios. yes as saídas são agregadas a uma porcentagem para todo o conjunto de avaliação. |
Avaliação de recuperação | Execute a avaliação para cada parte recuperada (se o aplicativo executar a recuperação). Para cada pergunta, o avaliador LLM é chamado para cada parte recuperada daquela pergunta. Por exemplo, se você tem cinco perguntas e cada uma possui três partes recuperadas, o avaliador é chamado 15 vezes. | Para cada parte, um yes ou no é relatado com base em seus critérios. Para cada pergunta, o percentual de partes yes é relatado como uma precisão. A precisão por pergunta é agregada a uma precisão média para todo o conjunto de avaliação. |
Você pode configurar um avaliador LLM definido pelo cliente usando os seguintes parâmetros:
Opção | Descrição | Requisitos |
---|---|---|
model |
O nome do ponto de extremidade do ponto de extremidade de API do Foundation Model que deve receber as solicitações para esse avaliador personalizado. | O ponto de extremidade deve dar suporte à assinatura /llm/v1/chat . |
name |
O nome da avaliação que também é usada para as métricas de saída. | |
judge_prompt |
O prompt que implementa a avaliação, com variáveis entre chaves. Por exemplo, "Aqui está uma definição que usa {solicitação} e {resposta}". | |
metric_metadata |
Um dicionário que fornece parâmetros adicionais para o juiz. Notavelmente, o dicionário precisa incluir um "assessment_type" com valor "RETRIEVAL" ou "ANSWER" para especificar o tipo de avaliação. |
O prompt contém variáveis que são substituídas pelo conteúdo do conjunto de avaliação antes de ser enviado ao endpoint_name
especificado para recuperar a resposta. O prompt é minimamente encapsulado em instruções de formatação que analisam uma pontuação numérica em [1,5] e uma lógica da saída do avaliador. A pontuação analisada será então transformada em yes
se for maior que 3 e, caso contrário, no
(consulte o código de exemplo abaixo sobre como usar o metric_metadata
para alterar o limite padrão de 3). O prompt deve conter instruções sobre a interpretação dessas pontuações diferentes, mas o prompt deve evitar instruções que especifiquem um formato de saída.
Há suporte para as seguintes variáveis :
Variável | Avaliação de ANSWER |
Avaliação de RETRIEVAL |
---|---|---|
request |
Coluna de solicitação do conjunto de dados de avaliação | Coluna de solicitação do conjunto de dados de avaliação |
response |
Coluna de resposta do conjunto de dados de avaliação | Coluna de resposta do conjunto de dados de avaliação |
expected_response |
Coluna expected_response do conjunto de dados de avaliação |
coluna expected_response do conjunto de dados de avaliação |
retrieved_context |
Conteúdo concatenado da coluna retrieved_context |
Conteúdo individual na coluna retrieved_context |
Importante
Para todos os avaliadores personalizados, a Avaliação do Agente assume que yes
corresponde a uma avaliação de qualidade positiva. Ou seja, um exemplo que é aprovado na avaliação do avaliador deve sempre retornar yes
. Por exemplo, um avaliador deve avaliar “a resposta é segura?” ou “o tom é amigável e profissional?”, e não “a resposta contém material inseguro?” ou “o tom não é profissional?”.
O exemplo a seguir usa a API do make_genai_metric_from_prompt
MLflow para especificar o objeto, que é passado para o argumento como mlflow.evaluate
uma lista durante a no_pii
extra_metrics
avaliação.
from mlflow.metrics.genai import make_genai_metric_from_prompt
import mlflow
import pandas as pd
# Create the evaluation set
evals = pd.DataFrame({
"request": [
"What is Spark?",
"How do I convert a Spark DataFrame to Pandas?",
],
"response": [
"Spark is a data analytics framework. And my email address is noreply@databricks.com",
"This is not possible as Spark is not a panda.",
],
})
# `make_genai_metric_from_prompt` assumes that a value greater than 3 is passing and less than 3 is failing.
# Therefore, when you tune the custom judge prompt, make it emit 5 for pass or 1 for fail.
# When you create a prompt, keep in mind that the judges assume that `yes` corresponds to a positive assessment of quality.
# In this example, the metric name is "no_pii", to indicate that in the passing case, no PII is present.
# When the metric passes, it emits "5" and the UI shows a green "pass".
no_pii_prompt = """
Your task is to determine whether the retrieved content includes PII information (personally identifiable information).
You should output a 5 if there is no PII, a 1 if there is PII. This was the content: '{response}'"""
no_pii = make_genai_metric_from_prompt(
name="no_pii",
judge_prompt=no_pii_prompt,
model="endpoints:/databricks-meta-llama-3-1-405b-instruct",
metric_metadata={"assessment_type": "ANSWER"},
)
result = mlflow.evaluate(
data=evals,
# model=logged_model.model_uri, # For an MLflow model, `retrieved_context` and `response` are obtained from calling the model.
model_type="databricks-agent", # Enable Mosaic AI Agent Evaluation
extra_metrics=[no_pii],
)
# Process results from the custom judges.
per_question_results_df = result.tables['eval_results']
# Show information about responses that have PII.
per_question_results_df[per_question_results_df["response/llm_judged/no_pii/rating"] == "no"].display()
Fornecer exemplos para os avaliadores LLM internos
Você pode passar exemplos específicos de domínio para os avaliadores internos fornecendo alguns exemplos de "yes"
ou "no"
para cada tipo de avaliação. Esses exemplos são conhecidos como exemplos de poucos disparos e podem ajudar os avaliadores internos a se alinharem melhor com os critérios de classificação específicos do domínio. Consulte Criar exemplos de poucos disparos.
O Databricks recomenda fornecer pelo menos um exemplo "yes"
e um "no"
. Os melhores exemplos são os seguintes:
- Exemplos de que os avaliadores erraram anteriormente e você fornece uma resposta correta como exemplo.
- Exemplos desafiadores, como exemplos com nuances ou difíceis de determinar como verdadeiros ou falsos.
Além disso, o Databricks recomenda que você forneça uma lógica para a resposta. Isso ajuda a melhorar a capacidade do avaliador de explicar o seu raciocínio.
Para passar os exemplos de poucas capturas, você precisa criar um dataframe que espelha a saída de mlflow.evaluate()
para os juízes correspondentes. Aqui está um exemplo de correção de resposta, fundamentação e juízes de relevância de partes:
%pip install databricks-agents pandas
dbutils.library.restartPython()
import mlflow
import pandas as pd
examples = {
"request": [
"What is Spark?",
"How do I convert a Spark DataFrame to Pandas?",
"What is Apache Spark?"
],
"response": [
"Spark is a data analytics framework.",
"This is not possible as Spark is not a panda.",
"Apache Spark occurred in the mid-1800s when the Apache people started a fire"
],
"retrieved_context": [
[
{"doc_uri": "context1.txt", "content": "In 2013, Spark, a data analytics framework, was open sourced by UC Berkeley's AMPLab."}
],
[
{"doc_uri": "context2.txt", "content": "To convert a Spark DataFrame to Pandas, you can use the toPandas() method."}
],
[
{"doc_uri": "context3.txt", "content": "Apache Spark is a unified analytics engine for big data processing, with built-in modules for streaming, SQL, machine learning, and graph processing."}
]
],
"expected_response": [
"Spark is a data analytics framework.",
"To convert a Spark DataFrame to Pandas, you can use the toPandas() method.",
"Apache Spark is a unified analytics engine for big data processing, with built-in modules for streaming, SQL, machine learning, and graph processing."
],
"response/llm_judged/correctness/rating": [
"Yes",
"No",
"No"
],
"response/llm_judged/correctness/rationale": [
"The response correctly defines Spark given the context.",
"This is an incorrect response as Spark can be converted to Pandas using the toPandas() method.",
"The response is incorrect and irrelevant."
],
"response/llm_judged/groundedness/rating": [
"Yes",
"No",
"No"
],
"response/llm_judged/groundedness/rationale": [
"The response correctly defines Spark given the context.",
"The response is not grounded in the given context.",
"The response is not grounded in the given context."
],
"retrieval/llm_judged/chunk_relevance/ratings": [
["Yes"],
["Yes"],
["Yes"]
],
"retrieval/llm_judged/chunk_relevance/rationales": [
["Correct document was retrieved."],
["Correct document was retrieved."],
["Correct document was retrieved."]
]
}
examples_df = pd.DataFrame(examples)
"""
Inclua alguns exemplos no parâmetro evaluator_config
do mlflow.evaluate
.
evaluation_results = mlflow.evaluate(
...,
model_type="databricks-agent",
evaluator_config={"databricks-agent": {"examples_df": examples_df}}
)
Criar exemplos de poucos disparos
As etapas a seguir são diretrizes para criar um conjunto de exemplos eficazes poucos disparos.
- Tente encontrar grupos de exemplos semelhantes em que o avaliador erra.
- Para cada grupo, escolha um único exemplo e ajuste o rótulo ou a justificativa para refletir o comportamento desejado. A Databricks recomenda fornecer uma lógica que explique a classificação.
- Execute novamente a avaliação com o novo exemplo.
- Repita conforme necessário para direcionar diferentes categorias de erros.
Observação
Vários exemplos de poucos tiros podem impactar negativamente o desempenho do juiz. Durante a avaliação, um limite de cinco exemplos de poucos disparos é imposto. O Databricks recomenda o uso de menos exemplos direcionados para obter o melhor desempenho.