Avalie grandes modelos de linguagem usando o MLflow de código aberto
Este artigo descreve como usar o código aberto MLflow LLM funcionalidade de avaliação mlflow.evaluate(). Este artigo também descreve o que é necessário para avaliar seu LLM usando o código aberto MLflow e quais métricas de avaliação são suportadas.
O que é a 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ânciamlflow.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 logsmlflow.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 argumentoparams
. A função deve:Tenha
data
como único argumento, que pode ser umpandas.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"
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 APIlog_model
, comomlflow.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}"}, ], )
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 usandomlflow.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.
|
|
|
---|---|---|
Combinação exata |
||
*
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.
Observação
Você também pode criar LLM personalizado como juiz e métricas de avaliação baseadas em heurística.
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']}" )