Avalie grandes modelos de linguagem com MLflow

Este artigo apresenta o MLflow LLM Evaluate, o pacote de funcionalidade de avaliação do modelo de linguagem grande (LLM) do MLflow em mlflow.evaluate. Este artigo também descreve o que é necessário para avaliar seu LLM e quais métricas de avaliação são suportadas.

O que é avaliação do MLflow LLM?

A avaliação do desempenho do LLM é um pouco diferente dos modelos tradicionais de ML, pois muitas vezes não há uma verdade única para comparar. O MLflow fornece uma API mlflow.evaluate() para ajudar a avaliar seus LLMs.

A funcionalidade de avaliação LLM do MLflow consiste em três componentes principais:

  • Um modelo para avaliar: pode ser um modelo MLflow pyfunc , um DataFrame com uma coluna de previsões, um URI que aponta para um modelo MLflow registrado ou qualquer chamada Python que represente seu modelo, como um pipeline de resumo de texto HuggingFace.

  • Métricas: as métricas a serem compute, a avaliação LLM usa métricas LLM.

  • Dados de avaliação: os dados nos quais seu modelo é avaliado podem ser um Pandas DataFrame, uma lista Python, um array numpy ou uma instância mlflow.data.dataset.Dataset .

Requisitos

  • MLflow 2.8 e acima.

  • Para avaliar seu LLM com mlflow.evaluate(), seu LLM deve ser um dos seguintes:

    • Uma instância mlflow.pyfunc.PyFuncModel ou um URI que aponta para um modelo logs mlflow.pyfunc.PyFuncModel.

    • Uma função Python personalizada que recebe entradas strings e gera uma única strings. Sua chamada deve corresponder à assinatura de mlflow.pyfunc.PyFuncModel.predict sem um argumento params . A função deve:

      • Tenha data como único argumento, que pode ser um pandas.Dataframe, numpy.ndarray, lista Python, dicionário ou matriz scipy.

      • Retorne um dos seguintes: pandas.DataFrame, pandas.Series, numpy.ndarray ou lista.

    • Um dataset estático.

Avalie com um modelo MLflow

Você pode avaliar seu LLM como um modelo MLflow. Para obter instruções detalhadas sobre como converter seu modelo em uma instância mlflow.pyfunc.PyFuncModel , consulte como Criar um modelo pyfunc personalizado.

Para avaliar seu modelo como um modelo MLflow, Databricks recomenda seguir estes passos:

Observação

Para registrar com êxito um modelo direcionado ao serviço Azure OpenAI, você deve especificar a seguinte variável de ambiente para autenticação e funcionalidade. Consulte a documentação do OpenAI com MLflow para obter mais detalhes.

os.environ["OPENAI_API_TYPE"] = "azure"
os.environ["OPENAI_API_VERSION"] = "2023-05-15"
os.environ["OPENAI_API_BASE"] = "https://<>.<>.<>.com/"
os.environ["OPENAI_DEPLOYMENT_NAME"] = "deployment-name"
  1. pacote seu LLM como um modelo MLflow e logs -o no servidor MLflow usando log_model. Cada variação (opeanai, pytorch, …) tem sua própria API log_model , como mlflow.openai.log_model():

    with mlflow.start_run():
        system_prompt = "Answer the following question in two sentences"
        # Wrap "gpt-3.5-turbo" as an MLflow model.
        logged_model_info = mlflow.openai.log_model(
            model="gpt-3.5-turbo",
            task=openai.ChatCompletion,
            artifact_path="model",
            messages=[
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": "{question}"},
            ],
        )
    
  2. Use o URI dos modelos registrados como instância do modelo em mlflow.evaluate():

    results = mlflow.evaluate(
        logged_model_info.model_uri,
        eval_data,
        targets="ground_truth",
        model_type="question-answering",
    )
    

Avalie com uma função personalizada

No MLflow 2.8.0 e acima, mlflow.evaluate() oferece suporte à avaliação de uma função Python sem exigir que o modelo seja logs no MLflow. Isso é útil quando você não deseja logs o modelo e apenas avaliá-lo. O exemplo a seguir usa mlflow.evaluate() para avaliar uma função.

Você também precisa configurar a autenticação OpenAI para executar o seguinte código:

eval_data = pd.DataFrame(
    {
        "inputs": [
            "What is MLflow?",
            "What is Spark?",
        ],
        "ground_truth": [
            "MLflow is an open-source platform for managing the end-to-end machine learning (ML) lifecycle. It was developed by Databricks, a company that specializes in big data and machine learning solutions. MLflow is designed to address the challenges that data scientists and machine learning engineers face when developing, training, and deploying machine learning models.",
            "Apache Spark is an open-source, distributed computing system designed for big data processing and analytics. It was developed in response to limitations of the Hadoop MapReduce computing model, offering improvements in speed and ease of use. Spark provides libraries for various tasks such as data ingestion, processing, and analysis through its components like Spark SQL for structured data, Spark Streaming for real-time data processing, and MLlib for machine learning tasks",
        ],
    }
)


def openai_qa(inputs):
    answers = []
    system_prompt = "Please answer the following question in formal language."
    for index, row in inputs.iterrows():
        completion = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": "{row}"},
            ],
        )
        answers.append(completion.choices[0].message.content)

    return answers


with mlflow.start_run() as run:
    results = mlflow.evaluate(
        openai_qa,
        eval_data,
        model_type="question-answering",
    )

Avalie com um conjunto de dados estático

Para o MLflow 2.8.0 e acima, mlflow.evaluate() oferece suporte à avaliação de um dataset estático sem especificar um modelo. Isso é útil quando você salva a saída do modelo em uma coluna em um Pandas DataFrame ou MLflow PandasDataset e deseja avaliar o dataset estático sem executar novamente o modelo.

Defina model=None e coloque as saídas do modelo no argumento data . Esta configuração só é aplicável quando os dados são um Pandas DataFrame.

Se você estiver usando um Pandas DataFrame, deverá especificar o nome da coluna que contém a saída do modelo usando o parâmetro predictions de nível superior em mlflow.evaluate():

import mlflow
import pandas as pd

eval_data = pd.DataFrame(
    {
        "inputs": [
            "What is MLflow?",
            "What is Spark?",
        ],
        "ground_truth": [
            "MLflow is an open-source platform for managing the end-to-end machine learning (ML) lifecycle. "
            "It was developed by Databricks, a company that specializes in big data and machine learning solutions. "
            "MLflow is designed to address the challenges that data scientists and machine learning engineers "
            "face when developing, training, and deploying machine learning models.",
            "Apache Spark is an open-source, distributed computing system designed for big data processing and "
            "analytics. It was developed in response to limitations of the Hadoop MapReduce computing model, "
            "offering improvements in speed and ease of use. Spark provides libraries for various tasks such as "
            "data ingestion, processing, and analysis through its components like Spark SQL for structured data, "
            "Spark Streaming for real-time data processing, and MLlib for machine learning tasks",
        ],
        "predictions": [
            "MLflow is an open-source platform that provides handy tools to manage Machine Learning workflow "
            "lifecycle in a simple way",
            "Spark is a popular open-source distributed computing system designed for big data processing and analytics.",
        ],
    }
)

with mlflow.start_run() as run:
    results = mlflow.evaluate(
        data=eval_data,
        targets="ground_truth",
        predictions="predictions",
        extra_metrics=[mlflow.metrics.genai.answer_similarity()],
        evaluators="default",
    )
    print(f"See aggregated evaluation results below: \n{results.metrics}")

    eval_table = results.tables["eval_results_table"]
    print(f"See evaluation table below: \n{eval_table}")

Tipos de métricas de avaliação LLM

Existem dois tipos de métricas de avaliação LLM no MLflow:

  • métricas que dependem de modelos SaaS, como OpenAI, para pontuação como mlflow.metrics.genai.answer_relevance. Essas métricas são criadas usando mlflow.metrics.genai.make_genai_metric(). Para cada registro de dados, essas métricas enviam um prompt composto pelas seguintes informações ao modelo SaaS e extraem a pontuação da resposta do modelo.

    • Definição de métricas.

    • Critérios de classificação de métricas.

    • Exemplos de referência.

    • Dados de entrada ou contexto.

    • Saída do modelo.

    • [opcional] Verdade fundamental.

  • Estatísticas por linha baseadas em função. Essas métricas calculam uma pontuação para cada registro de dados (linha em termos de Pandas ou Spark DataFrame), com base em determinadas funções, como Rouge, mlflow.metrics.rougeL ou Flesch Kincaid,mlflow.metrics.flesch_kincaid_grade_level. Essas métricas são semelhantes às métricas tradicionais.

Selecione métricas para avaliar seu LLM

Você pode selecionar quais métricas avaliar seu modelo. A referência completa para métricas de avaliação suportadas pode ser encontrada na documentação de avaliação do MLflow.

Você também pode:

  • Use as métricas default predefinidas para seu tipo de modelo.

  • Use uma lista personalizada de métricas.

Para usar métricas default para tarefas pré-selecionadas, especifique o argumento model_type em mlflow.evaluate, conforme mostrado no exemplo abaixo:

results = mlflow.evaluate(
    model,
    eval_data,
    targets="ground_truth",
    model_type="question-answering",
)

A tabela resume os tipos de modelo LLM suportados e as métricas default associadas.

question-answering

text-summarization

text

Combinação exata

ROUGE

toxicidade*

toxicidade*

toxicidade*

ari_grade_level**

ari_grade_level**

ari_grade_level**

flesch_kincaid_grade_level**

flesch_kincaid_grade_level**

flesch_kincaid_grade_level**

* Requer avaliação de pacote, tocha e transformadores.

** Requer pacote textstat.

Requer pacote avaliar, nltk e rouge-score.

Use uma lista personalizada de métricas

Você pode especificar uma lista personalizada de métricas no argumento extra_metrics em mlflow.evaluate.

Para adicionar métricas adicionais à lista de métricas default do tipo de modelo predefinido, mantenha o parâmetro model_type e adicione suas métricas a extra_metrics. A seguir avalia seu modelo usando todas as métricas do modelo question-answering e mlflow.metrics.latency().

results = mlflow.evaluate(
    model,
    eval_data,
    targets="ground_truth",
    model_type="question-answering",
    extra_metrics=[mlflow.metrics.latency()],
)

Para desativar o cálculo de métricas default e calcular apenas as métricas selecionadas, remova o argumento model_type e defina as métricas desejadas.

results = mlflow.evaluate(model,
                          eval_data,
                          targets="ground_truth",
                          extra_metrics=[mlflow.metrics.toxicity(), mlflow.metrics.latency()],
                        )

medições com LLM como juiz

Você também pode adicionar métricas predefinidas que usam LLM como juiz do argumento extra_metrics em mlflow.evaluate(). Para obter uma lista desses LLM como métricas de juiz, consulte Métricas com LLM como juiz.

from  mlflow.metrics.genai import answer_relevance

answer_relevance_metric = answer_relevance(model="openai:/gpt-4")

eval_df = pd.DataFrame() # Index(['inputs', 'predictions', 'context'], dtype='object')

eval_results = mlflow.evaluate(
    data = eval_df, # evaluation data
    model_type="question-answering",
    predictions="predictions", # prediction column_name from eval_df
    extra_metrics=[answer_relevance_metric]
)

Ver resultados da avaliação

mlflow.evaluate() retorna os resultados da avaliação como uma instância mlflow.models.EvaluationResult .

Para ver a pontuação nas métricas selecionadas, você pode verificar os seguintes atributos do resultado da avaliação:

  • metrics: armazena os resultados agregados, como média ou variação no dataset de avaliação. A seguir, uma segunda passagem do exemplo de código acima e se concentra na impressão dos resultados agregados.

    with mlflow.start_run() as run:
        results = mlflow.evaluate(
            data=eval_data,
            targets="ground_truth",
            predictions="predictions",
            extra_metrics=[mlflow.metrics.genai.answer_similarity()],
            evaluators="default",
        )
        print(f"See aggregated evaluation results below: \n{results.metrics}")
    
  • tables['eval_results_table']: armazena os resultados da avaliação por linha.

    with mlflow.start_run() as run:
        results = mlflow.evaluate(
            data=eval_data,
            targets="ground_truth",
            predictions="predictions",
            extra_metrics=[mlflow.metrics.genai.answer_similarity()],
            evaluators="default",
        )
        print(
            f"See per-data evaluation results below: \n{results.tables['eval_results_table']}"
        )
    

Avaliação LLM com exemplo de MLflow Notebook

A avaliação LLM a seguir com exemplo de MLflow Notebook é um exemplo orientado a casos de uso.

Avaliação LLM com exemplo de MLflow Notebook

Abra o bloco de anotações em outra guia