Pular para o conteúdo principal

Sintetizar conjuntos de avaliação

Esta página descreve como gerar sinteticamente um conjunto de avaliação de alta qualidade para medir a qualidade do seu agente.

A criação manual de um conjunto de avaliação é frequentemente demorada, e é difícil garantir que cubra todas as funcionalidades do seu agente. Agent Evaluation remove essa barreira gerando automaticamente um conjunto de avaliação representativo a partir dos seus documentos, permitindo que você avalie rapidamente seu agente com boa cobertura de casos de teste.

Gerar um conjunto de avaliação

Para sintetizar avaliações para um agente que usa recuperação de documentos, use o método generate_evals_df que faz parte do pacote Python databricks-agents. Para obter detalhes sobre a API, consulte a referência do Python SDK.

Este método exige que você forneça seus documentos como um Pandas DataFrame ou um Spark DataFrame.

O dataframe de entrada deve ter as seguintes colunas:

  • content: O conteúdo do documento analisado como strings.
  • doc_uri: O URI do documento.

Você pode usar três parâmetros adicionais para ajudar a controlar a geração:

  • num_evals: O número total de avaliações a serem geradas em todos os documentos. A função tenta distribuir as avaliações geradas por todos os seus documentos, levando em consideração o tamanho deles. Se num_evals for menor que o número de documentos, nem todos os documentos serão cobertos no conjunto de avaliação.

    Para obter detalhes sobre como num_evals é usado para distribuir avaliações entre os documentos, consulte Como num_evals é usado.

  • agent_description: Uma descrição da tarefa do agente

  • question_guidelines: Um conjunto de diretrizes que ajudam a fornecer um guia para a geração de perguntas sintéticas. Esta é uma string de formato livre que será usada para instruir a geração. Consulte o exemplo abaixo.

A saída de generate_evals_df é um DataFrame. As colunas no DataFrame dependem se você está usando MLflow 3 ou MLflow 2.

  • request_id: a unique request id.
  • inputs: As entradas sintetizadas, na API de Conclusão de Chat
  • expectations: um dicionário com dois campos:
    • expected_factsUma lista de fatos esperados na resposta. Esta coluna tem o dtype list[strings].
    • expected_retrieved_context: o contexto a partir do qual esta avaliação foi sintetizada, incluindo o conteúdo do documento e o URI do documento.

Exemplo

O exemplo a seguir usa generate_evals_df para gerar um conjunto de avaliação e, em seguida, chama diretamente mlflow.genai.evaluate() para medir o desempenho do Meta Llama 3.1 neste conjunto de avaliação. O modelo Llama 3.1 nunca viu seus documentos, portanto, é provável que ele alucine. Ainda assim, este experimento é uma boa linha de base para o seu agente personalizado.

Python

%pip install mlflow[databricks] databricks-agents
dbutils.library.restartPython()

import mlflow
from databricks.agents.evals import generate_evals_df
from mlflow.genai.scorers import Correctness
import pandas as pd

# `docs` can be a Pandas DataFrame or a Spark DataFrame with two columns: 'content' and 'doc_uri'.
docs = pd.DataFrame.from_records(
[
{
'content': f"""
Apache Spark is a unified analytics engine for large-scale data processing. It provides high-level APIs in Java,
Scala, Python and R, and an optimized engine that supports general execution graphs. It also supports a rich set
of higher-level tools including Spark SQL for SQL and structured data processing, pandas API on Spark for pandas
workloads, MLlib for machine learning, GraphX for graph processing, and Structured Streaming for incremental
computation and stream processing.
""",
'doc_uri': 'https://spark.apache.org/docs/3.5.2/'
},
{
'content': f"""
Spark's primary abstraction is a distributed collection of items called a Dataset. Datasets can be created from Hadoop InputFormats (such as HDFS files) or by transforming other Datasets. Due to Python's dynamic nature, we don't need the Dataset to be strongly-typed in Python. As a result, all Datasets in Python are Dataset[Row], and we call it DataFrame to be consistent with the data frame concept in Pandas and R.""",
'doc_uri': 'https://spark.apache.org/docs/3.5.2/quick-start.html'
}
]
)

agent_description = """
The Agent is a RAG chatbot that answers questions about using Spark on Databricks. The Agent has access to a corpus of Databricks documents, and its task is to answer the user's questions by retrieving the relevant docs from the corpus and synthesizing a helpful, accurate response. The corpus covers a lot of info, but the Agent is specifically designed to interact with Databricks users who have questions about Spark. So questions outside of this scope are considered irrelevant.
"""

question_guidelines = """
# User personas
- A developer who is new to the Databricks platform
- An experienced, highly technical Data Scientist or Data Engineer

# Example questions
- what API lets me parallelize operations over rows of a delta table?
- Which cluster settings will give me the best performance when using Spark?

# Additional Guidelines
- Questions should be succinct, and human-like
"""

num_evals = 10

evals = generate_evals_df(
docs,
# The total number of evals to generate. The method attempts to generate evals that have full coverage over the documents
# provided. If this number is less than the number of documents, is less than the number of documents,
# some documents will not have any evaluations generated. See "How num_evals is used" below for more details.
num_evals=num_evals,
# A set of guidelines that help guide the synthetic generation. These are free-form strings that will be used to prompt the generation.
agent_description=agent_description,
question_guidelines=question_guidelines
)

display(evals)

# Evaluate the model using the newly generated evaluation set. After the function call completes, click the UI link to see the results. You can use this as a baseline for your agent.
predict_fn = mlflow.genai.to_predict_fn("endpoints:/databricks-meta-llama-3-3-70b-instruct")

results = mlflow.genai.evaluate(
predict_fn=predict_fn,
scorers=[Correctness()],
data=evals
)

Exemplo de saída é mostrado abaixo. As colunas de saída dependem de você estar usando o MLflow 3 ou o MLflow 2.

No exemplo de saída a seguir, as colunas request_id e expectations.expected_retrieved_context não são mostradas.

inputs.messages[0].content

expectativas.fatos esperados

Para que o Spark SQL é usado no Apache Spark?

  • O Spark SQL é usado para processamento SQL no Apache Spark.
  • O Spark SQL é usado para processamento de dados estruturados no Apache Spark.

Quais são algumas ferramentas de alto nível compatíveis com o Apache Spark, e para que propósitos elas servem?

  • Spark SQL para SQL e processamento de dados estruturados.
  • API do Pandas no Spark para lidar com cargas de trabalho do Pandas.
  • MLlib para machine learning.
  • GraphX para processamento gráfico.
  • Transmissão estructurada para computação incremental e processamento de transmissão.

Qual é a abstração primária no Spark e como os datasets são representados em Python?

  • A principal abstração no Spark é um Dataset.
  • Em Python, os dataset do Spark são referidos como DataFrame.
  • Em Python, dataset são representados como Dataset[Row].

Por que todo dataset em Python é chamado de DataFrames no Spark?

  • dataset em Python são chamados de DataFrames no Spark para manter a consistência com o conceito de data frame.
  • O conceito de dataframe é padrão em Pandas e R.

Como num_evals é usado

num_evals É o número total de avaliações geradas para o conjunto de documentos. A função distribui essas avaliações pelos documentos, enquanto tenta account as diferenças no tamanho do documento. Ou seja, ele tenta manter aproximadamente o mesmo número de perguntas por página em todo o conjunto de documentos.

Se num_evals for menor que o número de documentos, alguns documentos não terão nenhuma avaliação gerada. O DataFrame retornado pela função inclui uma coluna com o source_doc_ids que foi usado para gerar avaliações. Você pode usar essa coluna para join de volta ao seu DataFrame original para gerar avaliações para os documentos que foram ignorados.

Para ajudar a estimar o num_evals para uma cobertura desejada, fornecemos o método estimate_synthetic_num_evals:

Python

from databricks.agents.evals import estimate_synthetic_num_evals

num_evals = estimate_synthetic_num_evals(
docs, # Same docs as before.
eval_per_x_tokens = 1000 # Generate 1 eval for every x tokens to control the coverage level.
)

Crie um conjunto de avaliação sintético — exemplo de Notebook

Consulte o notebook a seguir para ver o código de exemplo para criar um conjunto de avaliação sintético.

Notebook de exemplo de avaliações sintéticas

Abrir notebook em uma nova aba

Informações sobre os modelos que capacitam dados sintéticos

  • Dados sintéticos podem utilizar serviços de terceiros para avaliar suas aplicações de IA generativa, incluindo o Azure OpenAI operado pela Microsoft.
  • Para o Azure OpenAI, a Databricks optou por não utilizar o Abuse Monitoring, portanto nenhum prompt ou resposta é armazenado com o Azure OpenAI.
  • Para os workspace da União Europeia (UE), os dados sintéticos utilizam modelos hospedados na UE. Todas as outras regiões utilizam modelos hospedados nos EUA.
  • Desabilitar recursos de AI desenvolvidos por parceiros impede que o serviços de dados sintéticos chame modelos desenvolvidos por parceiros.
  • Os dados enviados para o serviço de dados sintéticos não são usados para nenhum treinamento de modelo.
  • Os dados sintéticos destinam-se a ajudar os clientes a avaliar seus aplicativos de agente, e os resultados não devem ser usados para ensinar, melhorar ou ajustar um LLM.

Limitação

Não é possível criar conjuntos de dados de avaliação sintéticos em um workspace com controle de saída serverless habilitado.