Definir as métricas de avaliação

Depois de criar um conjunto de dados de avaliação, a próxima etapa é definir as métricas usadas para medir a performance do modelo. Os modelos de IA generativa podem criar aplicativos para uma ampla variedade de tarefas, e o serviço de avaliação de IA generativa usa uma estrutura orientada a testes que transforma a avaliação de classificações subjetivas em resultados objetivos e práticos.

Para mais informações sobre os tipos de métricas, consulte a seção Métricas de avaliação na página de visão geral do serviço de avaliação de IA generativa.

Métrica de qualidade geral

É possível acessar as rubricas adaptativas pelo SDK. Recomendamos começar com GENERAL_QUALITY como padrão.

O GENERAL_QUALITY gera um conjunto de rubricas que abrangem várias tarefas, como seguir instruções, formatação, tom, estilo, dependendo do comando de entrada. É possível combinar a geração de rubricas com a validação na seguinte linha de código:

from vertexai import types

eval_result = client.evals.evaluate(
    dataset=eval_dataset,
    metrics=[
        types.RubricMetric.GENERAL_QUALITY,
    ],
)

Você pode gerar rubricas separadamente (para revisar ou reutilizar em modelos e agentes) antes de usá-las para avaliar as respostas do modelo:

from vertexai import types

# Use GENERAL_QUALITY recipe to generate rubrics, and store them
# as a rubric group named "general_quality_rubrics".
data_with_rubrics = client.evals.generate_rubrics(
    src=eval_dataset_df,
    rubric_group_name="general_quality_rubrics",
    predefined_spec_name=types.RubricMetric.GENERAL_QUALITY,
)

# Specify the group of rubrics to use for the evaluation.
eval_result = client.evals.evaluate(
    dataset=data_with_rubrics,
    metrics=[types.RubricMetric.GENERAL_QUALITY(
      rubric_group_name="general_quality_rubrics",
    )],
)

Você também pode orientar o GENERAL_QUALITY com linguagem natural guidelines para focar a geração de rubricas nos critérios mais importantes para você. Em seguida, o serviço de avaliação de IA generativa gera rubricas que abrangem as tarefas padrão e as diretrizes especificadas.

from vertexai import types

eval_result = client.evals.evaluate(
    dataset=eval_dataset,
    metrics=[
        types.RubricMetric.GENERAL_QUALITY(
            metric_spec_parameters={
                "guidelines": "The response must maintain a professional tone and must not provide financial advice."
            }
        )
    ],
)

Métricas de qualidade segmentadas

Se você precisar avaliar um aspecto mais específico da qualidade do modelo, use métricas que geram rubricas focadas em uma área específica. Exemplo:

from vertexai import types

eval_result = client.evals.evaluate(
    dataset=eval_dataset,
    metrics=[
        types.RubricMetric.TEXT_QUALITY,
        types.RubricMetric.INSTRUCTION_FOLLOWING,
    ],
)

O serviço de avaliação de IA generativa oferece os seguintes tipos de rubricas adaptativas:

  • INSTRUCTION_FOLLOWING: mede o quanto a resposta segue as restrições e instruções específicas do comando.

  • TEXT_QUALITY: foca especificamente na qualidade linguística da resposta, avaliando a fluência, a coerência e a gramática.

Conversa com vários turnos

  • multi_turn_general_quality: avalia a qualidade geral da conversa em um diálogo multiturno.

  • multi_turn_text_quality: avalia a qualidade do texto das respostas em um diálogo de várias rodadas.

Avaliação de agentes

  • final_response_reference_free: avalia a qualidade da resposta final de um agente sem precisar de uma resposta de referência.

  • final_response_quality: usa instruções adaptáveis para avaliar a qualidade da resposta final de um agente com base na configuração e no uso de ferramentas dele.

  • hallucination: avalia se as respostas de texto de um agente são fundamentadas com base na configuração do agente e no uso da ferramenta.

  • tool_use_quality: avalia a correção das chamadas de função feitas pelo agente para responder a um comando do usuário.

Para mais detalhes sobre as rubricas adaptativas segmentadas, consulte Detalhes da rubrica adaptativa.

Rubricas estáticas

Uma rubrica estática aplica um único conjunto fixo de diretrizes de pontuação a todos os exemplos no seu conjunto de dados. Essa abordagem baseada em pontuação é útil quando você precisa medir a performance em relação a um comparativo de mercado consistente em todos os comandos.

Por exemplo, a rubrica estática a seguir avalia a qualidade do texto em uma escala de 1 a 5:

5: (Very good). Exceptionally clear, coherent, fluent, and concise. Fully adheres to instructions and stays grounded.
4: (Good). Well-written, coherent, and fluent. Mostly adheres to instructions and stays grounded. Minor room for improvement.
3: (Ok). Adequate writing with decent coherence and fluency. Partially fulfills instructions and may contain minor ungrounded information. Could be more concise.
2: (Bad). Poorly written, lacking coherence and fluency. Struggles to adhere to instructions and may include ungrounded information. Issues with conciseness.
1: (Very bad). Very poorly written, incoherent, and non-fluent. Fails to follow instructions and contains substantial ungrounded information. Severely lacking in conciseness.

O serviço de avaliação de IA generativa oferece as seguintes métricas de rubrica estática:

  • GROUNDING: verifica a veracidade e a consistência em relação a um texto de origem fornecido (verdade fundamental). Essa métrica é crucial para sistemas de RAG.

  • SAFETY: avalia a resposta do modelo quanto a violações das políticas de segurança, como discurso de ódio ou conteúdo perigoso.

Você também pode usar modelos de comandos de métricas, como FLUENCY.

from vertexai import types

eval_result = client.evals.evaluate(
    dataset=eval_dataset,
    metrics=[
        types.RubricMetric.SAFETY,
        types.RubricMetric.GROUNDING,
        types.RubricMetric.FLUENCY,
    ],
)

Personalizar rubricas estáticas

Para necessidades altamente especializadas, é possível criar sua própria rubrica estática. Esse método oferece o máximo de controle, mas exige que você crie com cuidado o comando de avaliação para garantir resultados consistentes e confiáveis. Recomendamos usar diretrizes com GENERAL_QUALITY antes de personalizar rubricas estáticas.

# Define a custom metric to evaluate language simplicity
simplicity_metric = types.LLMMetric(
    name='language_simplicity',
    prompt_template=types.MetricPromptBuilder(
        instruction="Evaluate the story's simplicity for a 5-year-old.",
        criteria={
            "Vocabulary": "Uses simple words.",
            "Sentences": "Uses short sentences.",
        },
        rating_scores={
            "5": "Excellent: Very simple, ideal for a 5-year-old.",
            "4": "Good: Mostly simple, with minor complex parts.",
            "3": "Fair: Mix of simple and complex; may be challenging for a 5-year-old.",
            "2": "Poor: Largely too complex, with difficult words/sentences.",
            "1": "Very Poor: Very complex, unsuitable for a 5-year-old."
        }
    )
)

eval_result = client.evals.evaluate(
    dataset=eval_dataset,
    metrics=[
        simplicity_metric
    ],
)

Métricas com base em computação

As métricas baseadas em computação usam algoritmos deterministas para pontuar a resposta de um modelo comparando-a com uma resposta de referência. Eles exigem uma verdade fundamental no conjunto de dados e são ideais para tarefas em que uma resposta "correta" é bem definida.

  • Recall-Oriented Understudy for Gisting Evaluation (rouge_l, rouge_1): mede a sobreposição de n-gramas (sequências contíguas de palavras) entre a resposta do modelo e um texto de referência. É usado com frequência para avaliar o resumo de texto.

  • Bilingual Evaluation Understudy (BLEU): mede a semelhança de uma resposta com um texto de referência de alta qualidade contando n-gramas correspondentes. É a métrica padrão para qualidade de tradução, mas também pode ser usada para outras tarefas de geração de texto.

  • Correspondência exata (exact_match): mede a porcentagem de respostas idênticas à resposta de referência. Isso é útil para perguntas e respostas baseadas em fatos ou tarefas em que há apenas uma resposta correta.

from vertexai import types

eval_result = client.evals.evaluate(
    dataset=eval_dataset,
    metrics=[
        types.Metric(name='bleu'),
        types.Metric(name='rouge_l'),
        types.Metric(name='exact_match')
    ],
)

Métrica de função personalizada

Também é possível implementar uma lógica de avaliação personalizada transmitindo uma função Python personalizada ao parâmetro custom_function. O serviço de avaliação de IA generativa executa essa função para cada linha do conjunto de dados.

# Define a custom function to check for the presence of a keyword
def contains_keyword(instance: dict) -> dict:
    keyword = "magic"
    response_text = instance.get("response", "")
    score = 1.0 if keyword in response_text.lower() else 0.0
    return {"score": score}

keyword_metric = types.Metric(
    name="keyword_check",
    custom_function=contains_keyword
)

eval_result = client.evals.evaluate(
    dataset=eval_dataset,
    metrics=[keyword_metric]
)

Métrica de função personalizada remota

Além de executar a lógica de avaliação personalizada localmente, você pode implementar uma lógica de avaliação personalizada que é executada com segurança em um ambiente remoto em sandbox. Isso é útil quando você quer integrar a avaliação como parte do fluxo de trabalho de ajuste do modelo ou quando tem um cenário específico do usuário que não é coberto pelas métricas de avaliação atuais. Para isso, transmita um snippet de código Python como uma string para o parâmetro remote_custom_function da classe Metric. O serviço de avaliação de IA generativa executa essa função para cada linha do conjunto de dados remotamente.

import pandas as pd
from vertexai import types

code_snippet = """
def evaluate(instance):
    if instance['response'] == instance['reference']:
        return 1.0
    return 0.0
"""

custom_metric = types.Metric(
    name="my_custom_code_metric",
    remote_custom_function=code_snippet,
)

prompts_df = pd.DataFrame(
    {
        "prompt": ["What is 2+2?", "What is 3+3?"],
        "response": ["4", "5"],
        "reference": ["4", "6"],
    }
)

eval_dataset = types.EvaluationDataset(
    eval_dataset_df=prompts_df,
    candidate_name="test_model",
)

evaluation_result = client.evals.evaluate(
    dataset=eval_dataset,
    metrics=[custom_metric],
)

Entradas da instância de avaliação

A função evaluate usa um dicionário instance como argumento. instance representa a instância de avaliação, e todos os campos preenchidos em EvaluationInstance estão disponíveis para a função como instance[field_name]. Os campos disponíveis incluem:

  • prompt: o comando do usuário dado ao modelo.
  • response: a saída gerada pelo modelo.
  • reference: a verdade fundamental usada para comparar com a resposta.
  • rubric_groups: grupos nomeados de rubricas associadas ao comando.
  • other_data: outros dados usados para preencher marcadores de posição com base na chave deles.
  • agent_eval_data: dados específicos das avaliações do agente, como configurações e rastreamentos.

Restrições técnicas

  • Ambiente de execução:o código personalizado é executado em um ambiente de sandbox sem acesso à rede.
  • Limite de tempo de execução:a execução da avaliação é limitada a 1 minuto.
  • Limite de memória:o tamanho total do código enviado, combinado com os dados carregados durante a execução, não pode exceder 1,5 GB.

Os seguintes pacotes de terceiros estão disponíveis no momento da execução:

altair
chess
cv2
deepdiff
editdistance
jsonschema
matplotlib
mpmath
nltk
numpy
pandas
pdfminer
pydantic
rdkit
reportlab
scipy
seaborn
sklearn
sqlparse
statsmodels
striprtf
sympy
tabulate

A seguir