Sintetize conjuntos de avaliação

Prévia

Esse recurso está em Pré-lançamento público.

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 geralmente consome tempo e é difícil garantir que ele cubra todas as funcionalidades do seu agente. O Mosaic AI Agent Evaluation elimina essa barreira ao gerar automaticamente um conjunto de avaliação representativo a partir de seus documentos, permitindo que o senhor avalie rapidamente seu agente com uma boa cobertura de casos de teste.

Gere um conjunto de avaliação

Para sintetizar avaliações para um agente que usa a 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.

Esse método exige que o senhor forneça seus documentos como um Pandas DataFrame ou um Spark DataFrame.

O quadro de dados 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 seu tamanho. Se num_evals for menor que o número de documentos, nem todos os documentos serão incluídos no conjunto de avaliação.

    Para obter detalhes sobre como o num_evals é usado para distribuir avaliações nos 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 formato livre que será usada para solicitar a geração. Veja o exemplo abaixo.

O resultado de generate_evals_df é um DataFrame com as seguintes colunas:

  • request_id: um ID de solicitação exclusivo.

  • request: A solicitação sintetizada.

  • expected_facts: Uma lista dos fatos esperados na resposta. Essa coluna tem o dtype list[strings].

  • expected_retrieved_context: O contexto a partir do qual essa avaliação foi sintetizada, incluindo o conteúdo do documento e o doc_uri.

Exemplo

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


%pip install mlflow mlflow[databricks] 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)

No exemplo de saída 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 Spark SQL é usado para o processamento de SQL no Apache Spark.

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

Quais são algumas das ferramentas de alto nível suportadas pelo Apache Spark e a que propósitos elas servem?

  • Spark SQL para SQL e processamento de dados estruturados.

  • Pandas API em Spark para lidar com as cargas de trabalho de Pandas.

  • MLlib Para machine learning.

  • GraphX para processamento gráfico.

  • transmissão estruturada para computação incremental e processamento de transmissão.

Qual é a principal abstração em Spark e como o conjunto de dados é representado em Python?

  • A principal abstração em Spark é um conjunto de dados.

  • Em Python, o conjunto de dados de Sparké chamado de DataFrame.

  • Em Python, o conjunto de dados é representado como dataset[Row].

Por que todos os conjuntos de dados em Python são chamados de DataFrames em Spark?

  • O conjunto de dados em Python é chamado de DataFrames em Spark para manter a consistência com o conceito de estrutura de dados.

  • O conceito de quadro de dados é padrão no Pandas e no R.

Como o 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, tentando account levar em conta 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 endereço source_doc_ids que foi usado para gerar avaliações. O senhor pode usar essa coluna para join voltar ao seu DataFrame original para gerar provas para os documentos que foram ignorados.

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


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ético - exemplo de Notebook

Veja no Notebook a seguir um exemplo de código para criar um conjunto de avaliação sintético.

Exemplo de avaliações sintéticas Notebook

Abra o bloco de anotações em outra guia

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

O exemplo de Notebook a seguir demonstra como melhorar a qualidade do seu agente. Ele inclui as seguintes etapas:

  1. Gerar uma avaliação sintética dataset.

  2. Crie e avalie um agente básico.

  3. Compare o agente básico em várias configurações (como solicitações diferentes) e modelos básicos para encontrar o equilíbrio certo entre qualidade, custo e latência.

  4. implantado o agente em uma interface de usuário da Web para permitir que as partes interessadas testem e forneçam feedback adicional.

Melhorar o desempenho do agente usando dados sintéticos Notebook

Abra o bloco de anotações em outra guia

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

  • Os dados sintéticos podem usar serviços de terceiros para avaliar seus aplicativos GenAI, incluindo Azure OpenAI operado por 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 o espaço de trabalho da União Europeia (UE), modelos de uso sintético de dados hospedados na UE. Todas as outras regiões usam modelos hospedados nos EUA.

  • A desativação do recurso assistivo do parceiroAI impede que os serviços de dados sintéticos chamem os modelos do parceiro.

  • Os dados enviados para os serviços sintéticos de dados não são utilizados para nenhum modelo de treinamento.

  • 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 treinar, melhorar ou ajustar um LLM.