Condividi tramite


Sintetizzare i set di valutazione

Importante

Questa funzionalità è in Anteprima Pubblica.

Questa pagina descrive come generare in modo sintetico un set di valutazione di alta qualità per misurare la qualità dell'agente.

La creazione manuale di un set di valutazione richiede spesso molto tempo ed è difficile assicurarsi che includa tutte le funzionalità dell'agente. Mosaic AI Agent Evaluation rimuove questa barriera generando automaticamente un set di valutazione rappresentativo dai documenti, consentendo di valutare rapidamente l'agente con una buona copertura dei casi di test.

Generare un set di valutazione

Per sintetizzare le valutazioni per un agente che usa il recupero dei documenti, usare il metodo generate_evals_df che fa parte del pacchetto Python databricks-agents. Per informazioni dettagliate sull'API, vedere le informazioni di riferimento Python SDK.

Questo metodo richiede che tu fornisca i tuoi documenti come un Pandas DataFrame o uno Spark DataFrame.

Il dataframe di input deve avere le colonne seguenti:

  • content: contenuto del documento analizzato come stringa.
  • doc_uri: URI del documento.

È possibile usare tre parametri aggiuntivi per controllare la generazione:

  • num_evals: Il numero totale di valutazioni da generare attraverso tutti i documenti. La funzione tenta di distribuire le valutazioni generate su tutti i tuoi documenti, prendendo in considerazione le dimensioni dei documenti. Se num_evals è minore del numero di documenti, non tutti i documenti verranno trattati nel set di valutazione.

    Per informazioni dettagliate sull'uso di num_evals per distribuire valutazioni nei documenti, vedere Come viene usato num_evals.

  • agent_description: una descrizione dell'attività dell'agente

  • question_guidelines: un set di linee guida per la generazione di domande sintetiche. Si tratta di una stringa in formato libero che verrà usata per richiedere la generazione. Vedere l'esempio seguente.

L'output di generate_evals_df è un dataframe con le colonne seguenti:

  • request_id: ID di richiesta univoco.
  • request: richiesta sintetizzata.
  • expected_facts: elenco dei fatti previsti nella risposta. Questa colonna ha dtype list[string].
  • expected_retrieved_context: il contesto da cui è stata sintetizzata questa valutazione, inclusi il contenuto del documento e il doc_uri.

Esempio

L'esempio seguente usa generate_evals_df per generare un set di valutazione e quindi chiama direttamente mlflow.evaluate() per misurare le prestazioni di Meta Llama 3.1 su questo set di valutazione. Il modello Llama 3.1 non ha mai visto i documenti, quindi è probabile che allucini. Anche in questo caso, questo esperimento è un buon punto di riferimento per l'agente personalizzato.


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

Nell'output di esempio seguente le colonne request_id e expected_retrieved_context non vengono visualizzate.

richiesta fatti_previsti
Per cosa viene usato Spark SQL in Apache Spark? - Spark SQL viene usato per l'elaborazione SQL in Apache Spark.
- Spark SQL viene usato per l'elaborazione dati strutturata in Apache Spark.
Quali sono alcuni strumenti di alto livello supportati da Apache Spark e quali scopi servono? - Spark SQL per SQL ed elaborazione dati strutturata.
- API di pandas su Spark per gestire i carichi di lavoro di pandas.
- MLlib per l'apprendimento automatico.
- GraphX per l'elaborazione del grafo.
- Structured Streaming per il calcolo incrementale e l'elaborazione del flusso.
Qual è l'astrazione primaria in Spark e come sono rappresentati i set di dati in Python? - L'astrazione primaria in Spark è un set di dati.
- In Python i set di dati di Spark vengono definiti dataframe.
In Python, i Dataset sono rappresentati come Dataset[Row]
Perché tutti i set di dati in Python sono chiamati dataframe in Spark? - I set di dati in Python sono denominati dataframe in Spark per mantenere la coerenza con il concetto di frame di dati.
- Il concetto di data frame è standard in Pandas e R.

Come viene usato num_evals

num_evals è il numero totale di valutazioni generate per il set di documenti. La funzione distribuisce queste valutazioni nei documenti durante il tentativo di tenere conto delle differenze nelle dimensioni del documento. Ciò significa che tenta di mantenere approssimativamente lo stesso numero di domande per pagina nel set di documenti.

Se num_evals è minore del numero di documenti, alcuni documenti non avranno alcuna valutazione generata. Il dataframe restituito dalla funzione include una colonna con la source_doc_ids usata per generare valutazioni. È possibile utilizzare questa colonna per collegarsi al DataFrame originale per generare valutazioni per i documenti ignorati.

Per stimare il num_evals per la copertura desiderata, forniamo il metodo 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.
)

Creare un set di valutazione sintetico — taccuino di esempio

Consultare il seguente notebook per un esempio di codice per creare un set di valutazione sintetico.

Taccuino di esempio di valutazioni sintetiche

Ottieni il notebook

Demo di 10 minuti per migliorare le prestazioni dell'agente

Il seguente notebook d'esempio illustra come migliorare la qualità del tuo agente. Include i passaggi seguenti:

  1. Generare un set di dati di valutazione sintetica.
  2. Costruire e valutare un agente di base.
  3. Confrontare l'agente di base tra più configurazioni (ad esempio richieste diverse) e modelli di base per trovare il giusto equilibrio tra qualità, costo e latenza.
  4. Distribuire l'agente in un'interfaccia utente Web per consentire agli stakeholder di testare e fornire commenti e suggerimenti aggiuntivi.

Migliorare le prestazioni dell'agente mediante l'uso del notebook per dati sintetici

Prendere notebook

Informazioni sui modelli che alimentano i dati sintetici

  • I dati sintetici possono usare servizi di terze parti per valutare le applicazioni GenAI, tra cui Azure OpenAI gestito da Microsoft.
  • Per Azure OpenAI, Databricks ha rifiutato esplicitamente il monitoraggio degli abusi, quindi non vengono archiviate richieste o risposte con Azure OpenAI.
  • Per le aree di lavoro dell'Unione europea (UE), i dati sintetici usano modelli ospitati nell'UE. Tutte le altre aree usano modelli ospitati negli Stati Uniti.
  • La disabilitazione delle funzionalità di assistive ai di intelligenza artificiale di Azure impedisce al servizio dati sintetico di chiamare modelli basati su intelligenza artificiale di Azure.
  • I dati inviati al servizio dati sintetici non vengono usati per il training del modello.
  • I dati sintetici sono progettati per aiutare i clienti a valutare le applicazioni degli agenti e gli output non devono essere usati per addestrare, migliorare o ottimizzare un LLM.