Compartir a través de


Síntesis de conjuntos de evaluación

En esta página se describe cómo generar sintéticamente un conjunto de evaluación de alta calidad para medir la calidad del agente.

La creación manual de un conjunto de evaluación suele llevar mucho tiempo y es difícil asegurarse de que cubre toda la funcionalidad del agente. Mosaic AI Agent Evaluation elimina esta barrera mediante la generación automática de un conjunto de evaluación representativo de sus documentos, lo que le permite evaluar rápidamente a su agente con una buena cobertura de casos de prueba.

Generación de un conjunto de evaluación

Para sintetizar las evaluaciones de un agente que usa la recuperación de documentos, use el generate_evals_df método que forma parte del databricks-agents paquete de Python. Para más información sobre la API, consulte la referencia del SDK de Python.

Este método requiere que proporcione los documentos como DataFrame de Pandas o un DataFrame de Spark.

La trama de datos de entrada debe tener las columnas siguientes:

  • content: el contenido del documento analizado como una cadena.
  • doc_uri: el URI del documento.

Puede usar tres parámetros adicionales para ayudar a controlar la generación:

  • num_evals: el número total de evaluaciones que se van a generar en todos los documentos. La función intenta distribuir las valoraciones generadas en todos los documentos, teniendo en cuenta su tamaño. Si num_evals es menor que el número de documentos, no todos los documentos se tratarán en el conjunto de evaluación.

    Para obtener más información sobre cómo num_evals se usa para distribuir las evaluaciones entre los documentos, consulte Cómo num_evals se usa.

  • agent_description: descripción de la tarea del agente

  • question_guidelines: un conjunto de directrices que ayudan a guiar la generación de preguntas sintéticas. Se trata de una cadena de forma libre que se usará para provocar la generación. Consulte el ejemplo siguiente.

La salida de generate_evals_df es un dataframe. Las columnas de DataFrame dependen de si usa MLflow 3 o MLflow 2.

MLflow 3

  • request_id: identificador de solicitud único.
  • inputs: las entradas sintetizadas, en Chat Completion API
  • expectations: diccionario con dos campos:
    • expected_facts: una lista de hechos esperados en la respuesta. Esta columna tiene dtype list[string].
    • expected_retrieved_context: el contexto del que se ha sintetizado esta evaluación, incluido el contenido del documento y el doc_uri.

MLflow 2

  • request_id: identificador de solicitud único.
  • request: la solicitud sintetizada.
  • expected_facts: una lista de hechos esperados en la respuesta. Esta columna tiene dtype list[string].
  • expected_retrieved_context: el contexto del que se ha sintetizado esta evaluación, incluido el contenido del documento y el doc_uri.

Ejemplo

En el ejemplo siguiente se usa generate_evals_df para generar un conjunto de evaluación y, a continuación, se llama mlflow.evaluate() directamente para medir el rendimiento de Meta Llama 3.1 en este conjunto de evaluación. El modelo Llama 3.1 nunca ha visto tus documentos, por lo que es probable que alucine. Aún así, este experimento es un buen punto de referencia para tu 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 continuación se muestra la salida de ejemplo. Las columnas de salida dependen de si usa MLflow 3 o MLflow 2.

MLflow 3

En la salida del ejemplo siguiente, las columnas request_id y expectations.expected_retrieved_context no se muestran.

inputs.messages[0].content expectativas.hechos_esperados
¿Para qué se usa Spark SQL en Apache Spark?
  • Spark SQL se usa para el procesamiento de SQL en Apache Spark.
  • Spark SQL se usa para el procesamiento de datos estructurados en Apache Spark.
¿Cuáles son algunas herramientas de alto nivel compatibles con Apache Spark y qué propósitos sirven?
  • Spark SQL para SQL y procesamiento de datos estructurados.
  • Pandas API en Spark para controlar las cargas de trabajo de Pandas.
  • MLlib para el aprendizaje automático.
  • GraphX para el procesamiento de grafos.
  • Structured Streaming para el cálculo incremental y el procesamiento de flujos.
¿Cuál es la abstracción principal de Spark y cómo se representan los conjuntos de datos en Python?
  • La abstracción principal de Spark es un conjunto de datos.
  • En Python, los conjuntos de datos de Spark se conocen como DataFrame.
  • En Python, los conjuntos de datos se representan como Dataset[Row].
¿Por qué todos los conjuntos de datos de Python se denominan DataFrames en Spark?
  • Los conjuntos de datos de Python se denominan DataFrames en Spark para mantener la coherencia con el concepto de trama de datos.
  • El concepto de trama de datos es estándar en Pandas y R.

MLflow 2

En la salida del ejemplo siguiente, las columnas request_id y expected_retrieved_context no se muestran.

solicitud hechos_esperados
¿Para qué se usa Spark SQL en Apache Spark?
  • Spark SQL se usa para el procesamiento de SQL en Apache Spark.
  • Spark SQL se usa para el procesamiento de datos estructurados en Apache Spark.
¿Cuáles son algunas herramientas de alto nivel compatibles con Apache Spark y qué propósitos sirven?
  • Spark SQL para SQL y procesamiento de datos estructurados.
  • Pandas API en Spark para controlar las cargas de trabajo de Pandas.
  • MLlib para el aprendizaje automático.
  • GraphX para el procesamiento de grafos.
  • Structured Streaming para el cálculo incremental y el procesamiento de flujos.
¿Cuál es la abstracción principal de Spark y cómo se representan los conjuntos de datos en Python?
  • La abstracción principal de Spark es un conjunto de datos.
  • En Python, los conjuntos de datos de Spark se conocen como DataFrame.
  • En Python, los conjuntos de datos se representan como Dataset[Row].
¿Por qué todos los conjuntos de datos de Python se denominan DataFrames en Spark?
  • Los conjuntos de datos de Python se denominan DataFrames en Spark para mantener la coherencia con el concepto de trama de datos.
  • El concepto de trama de datos es estándar en Pandas y R.

Cómo num_evals se usa

num_evals es el número total de evaluaciones generadas para el conjunto de documentos. La función distribuye estas evaluaciones en los documentos al intentar tener en cuenta las diferencias en el tamaño del documento. Es decir, intenta mantener aproximadamente el mismo número de preguntas por página en el conjunto de documentos.

Si num_evals es menor que el número de documentos, algunos documentos no tendrán ninguna evaluación generada. La trama de datos devuelta por la función incluye una columna con la source_doc_ids que se usó para generar evaluaciones. Puede usar esta columna para volver a unirla a la trama de datos original para generar valores para los documentos que se omitieron.

Para ayudar a estimar el num_evals para una cobertura deseada, proporcionamos el 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.
)

Creación de un conjunto de evaluación sintético: cuaderno de ejemplo

Consulte el siguiente cuaderno para ver el código de ejemplo para crear un conjunto de evaluación sintético.

Cuaderno de ejemplo de evaluaciones sintéticas

Obtener el cuaderno

Demostración de 10 minutos para aumentar el rendimiento del agente

En el cuaderno de ejemplo siguiente se muestra cómo mejorar la calidad del agente. Incluye los siguientes pasos:

  1. Genere un conjunto de datos de evaluación sintética.
  2. Compile y evalúe un agente de línea base.
  3. Compare el agente de línea base entre varias configuraciones (como mensajes diferentes) y modelos fundamentales para encontrar el equilibrio adecuado de calidad, costo y latencia.
  4. Implemente el agente en una interfaz de usuario web para permitir que las partes interesadas prueben y proporcionen comentarios adicionales.

Mejora del rendimiento del agente mediante el cuaderno de datos sintéticos

Obtener el cuaderno

Información sobre los modelos que potencian los datos sintéticos

  • Los datos sintéticos pueden usar servicios de terceros para evaluar las aplicaciones de IA generativas, incluido Azure OpenAI operado por Microsoft.
  • Para Azure OpenAI, Databricks ha optado por no realizar la supervisión de abusos, por lo que no se almacenan solicitudes ni respuestas con Azure OpenAI.
  • En el caso de las áreas de trabajo de la Unión Europea (UE), los datos sintéticos usan modelos hospedados en la UE. Todas las demás regiones usan modelos hospedados en Estados Unidos.
  • Deshabilitar las características de IA impulsadas por socios impide que el servicio de datos sintéticos llame a modelos impulsados por socios.
  • Los datos enviados al servicio de datos sintéticos no se usan para ningún entrenamiento del modelo.
  • Los datos sintéticos están diseñados para ayudar a los clientes a evaluar sus aplicaciones de agente y las salidas no deben usarse para entrenar, mejorar ni ajustar un LLM.