Compartilhar via


Sintetizar conjuntos de avaliação

Esta página descreve como gerar de forma sintética um conjunto de avaliação de alta qualidade para medir a qualidade do agente.

Criar manualmente um conjunto de avaliação geralmente é demorado e é difícil garantir que ele cubra toda a funcionalidade do seu agente. A Avaliação do Agente de IA da Mosaico remove essa barreira ao gerar automaticamente um conjunto de avaliação representativo a partir de 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 a recuperação de documentos, use o generate_evals_df método que faz parte do pacote python databricks-agents . Para obter detalhes sobre a API, consulte a referência do SDK do Python.

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

O dataframe de entrada deve ter as seguintes colunas:

  • content: o conteúdo do documento analisado como uma cadeia de caracteres.
  • 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 em 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 abordados 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 orientar a geração de perguntas sintéticas. Essa é uma cadeia de caracteres de forma livre que será usada para solicitar a geração. Veja o exemplo abaixo.

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

MLflow 3

  • request_id: uma ID de solicitação exclusiva.
  • inputs: as entradas sintetizadas, na API de Conclusão do Chat
  • expectations: um dicionário com dois campos:
    • expected_facts: uma lista de fatos esperados na resposta. Esta coluna tem uma lista de dtype[cadeia de caracteres].
    • expected_retrieved_context: o contexto do qual essa avaliação foi sintetizada, incluindo o conteúdo do documento e o doc_uri.

MLflow 2

  • request_id: uma ID de solicitação exclusiva.
  • request: a solicitação sintetizada.
  • expected_facts: uma lista de fatos esperados na resposta. Esta coluna tem uma lista de dtype[cadeia de caracteres].
  • expected_retrieved_context: o contexto do qual essa avaliação foi sintetizada, incluindo o conteúdo do documento e o doc_uri.

Exemplo

O exemplo a seguir usa generate_evals_df para gerar um conjunto de avaliação e, em seguida, chama mlflow.evaluate() diretamente para medir o desempenho do Meta Llama 3.1 nesse conjunto de avaliações. O modelo llama 3.1 nunca viu seus documentos, portanto, é provável que ele tenha alucinado. Mesmo assim, esse experimento é uma boa referência para seu agente personalizado.


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

import mlflow
from databricks.agents.evals import generate_evals_df
import pandas as pd
import math

# `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.
results = mlflow.evaluate(
  model="endpoints:/databricks-meta-llama-3-1-405b-instruct",
  data=evals,
  model_type="databricks-agent"
)

# Note: To use a different model serving endpoint, use the following snippet to define an agent_fn. Then, specify that function using the `model` argument.
# MODEL_SERVING_ENDPOINT_NAME = '...'
# def agent_fn(input):
#   client = mlflow.deployments.get_deploy_client("databricks")
#   return client.predict(endpoint=MODEL_SERVING_ENDPOINT_NAME, inputs=input)

A saída de exemplo é mostrada abaixo. As colunas de saída dependem se você está usando o MLflow 3 ou o MLflow 2.

MLflow 3

Na saída de exemplo 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 SQL do Spark é usado para processamento de SQL no Apache Spark.
  • O SQL do Spark é 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 quais finalidades elas servem?
  • Spark SQL para processamento de SQL e dados estruturados.
  • API do pandas no Spark para lidar com cargas de trabalho do pandas.
  • MLlib para machine learning.
  • GraphX para processamento de grafo.
  • Streaming estruturado para computação incremental e processamento de fluxo.
Qual é a abstração primária no Spark e como os conjuntos de dados são representados no Python?
  • A abstração primária no Spark é um conjunto de dados.
  • No Python, os conjuntos de dados do Spark são conhecidos como DataFrame.
  • No Python, os conjuntos de dados são representados como Conjunto de dados[Linha].
Por que todos os conjuntos de dados no Python são chamados DataFrames no Spark?
  • Os conjuntos de dados no Python são chamados de DataFrames no Spark para manter a consistência com o conceito de quadro de dados.
  • O conceito de quadro de dados é padrão no Pandas e no R.

MLflow 2

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

solicitação fatos_esperados
Para que o Spark SQL é usado no Apache Spark?
  • O SQL do Spark é usado para processamento de SQL no Apache Spark.
  • O SQL do Spark é 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 quais finalidades elas servem?
  • Spark SQL para processamento de SQL e dados estruturados.
  • API do pandas no Spark para lidar com cargas de trabalho do pandas.
  • MLlib para machine learning.
  • GraphX para processamento de grafo.
  • Streaming estruturado para computação incremental e processamento de fluxo.
Qual é a abstração primária no Spark e como os conjuntos de dados são representados no Python?
  • A abstração primária no Spark é um conjunto de dados.
  • No Python, os conjuntos de dados do Spark são conhecidos como DataFrame.
  • No Python, os conjuntos de dados são representados como Conjunto de dados[Linha].
Por que todos os conjuntos de dados no Python são chamados DataFrames no Spark?
  • Os conjuntos de dados no Python são chamados de DataFrames no Spark para manter a consistência com o conceito de quadro de dados.
  • O conceito de quadro de dados é padrão no Pandas e no 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 entre os documentos ao tentar considerar as diferenças no tamanho do documento. Ou seja, ele tenta manter aproximadamente o mesmo número de perguntas por página no 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 a source_doc_ids que foram usadas para gerar avaliações. Você pode usar essa coluna para mesclar novamente ao DataFrame original, gerando avaliações para os documentos que foram ignorados.

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


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.
)

Criar um conjunto de avaliação sintética — notebook de exemplo

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

Notebook de exemplo de avaliações sintéticas

Obter laptop

Demonstração de 10 minutos para aumentar o desempenho do agente

O notebook de exemplo a seguir demonstra como melhorar a qualidade do agente. Inclui as seguintes etapas:

  1. Gerar um conjunto de dados de avaliação sintética.
  2. Compile e avalie um agente de linha de base.
  3. Compare o agente de referência em várias configurações (como prompts diferentes) e modelos fundamentais para encontrar o equilíbrio certo de qualidade, custo e latência.
  4. Implante o agente em uma interface do usuário da Web para permitir que os stakeholders testem e forneçam comentários adicionais.

Melhorar o desempenho do agente usando o notebook de dados sintéticos

Obter laptop

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

  • Os dados sintéticos podem usar serviços de terceiros para avaliar seus aplicativos de IA generativos, incluindo o Azure OpenAI operado pela Microsoft.
  • Para o Azure OpenAI, a Databricks optou por não usar o Monitoramento de Abuso, portanto, nenhum prompt ou resposta é armazenado com o Azure OpenAI.
  • Para ambientes de trabalho da União Europeia (UE), os modelos usados pelos dados sintéticos são localizados na UE. Todas as outras regiões usam modelos hospedados nos EUA.
  • Desabilitar recursos de IA habilitados para parceiros impede que o serviço de dados sintéticos chame modelos alimentados 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 as saídas não devem ser usadas para treinar, melhorar ou ajustar uma LLM.