Sintetizar conjuntos de avaliação
Importante
Este recurso está na Pré-visualização Pública
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 é demorada e é difícil garantir que ele cubra todas as funcionalidades do seu agente. O Mosaic AI Agent Evaluation remove essa barreira gerando automaticamente um conjunto de avaliação representativo de seus documentos, permitindo que você avalie rapidamente seu agente com uma boa cobertura de casos de teste.
Gerar um conjunto para 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 databricks-agents
Python. Para obter detalhes sobre a API, consulte a referência do SDK Python .
Este método requer 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 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 gerar em todos os documentos. A função tenta distribuir os evals gerados por todos os seus documentos, levando em consideração o tamanho deles. Senum_evals
for inferior ao número de documentos, nem todos os documentos serão abrangidos pelo conjunto de avaliação.Para obter detalhes sobre como o
num_evals
é usado para distribuir avaliações pelos documentos, consulte Como o num_evals é usado.agent_description
: Uma descrição da tarefa do agentequestion_guidelines
: Um conjunto de diretrizes que ajudam a orientar a geração de perguntas sintéticas. Esta é uma cadeia de caracteres de forma livre que será usada para avisar a geração. Veja o exemplo abaixo.
A saída do generate_evals_df
é um DataFrame com as seguintes colunas:
-
request_id
: Uma ID de solicitação exclusiva. -
request
: O pedido sintetizado. -
expected_facts
: Uma lista de factos esperados na resposta. Esta coluna tem dtype list[string]. -
expected_retrieved_context
: O contexto a partir do qual esta 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 diretamente mlflow.evaluate()
para medir o desempenho do Meta Llama 3.1 nesse conjunto eval. O modelo Llama 3.1 nunca viu os seus documentos, por isso é provável que tenha alucinações. Mesmo assim, esse experimento é uma boa linha de 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)
Na saída de exemplo a seguir, as colunas request_id
e expected_retrieved_context
não são mostradas.
pedido | factos_esperados |
---|---|
Para que é usado o Spark SQL no Apache Spark? | - Spark SQL é usado para processamento SQL no Apache Spark. - Spark SQL é usado para processamento de dados estruturados no Apache Spark. |
Quais são algumas ferramentas de alto nível suportadas pelo Apache Spark e para que servem? | - Spark SQL para SQL e processamento de dados estruturados. - API pandas no Spark para lidar com cargas de trabalho de pandas. - MLlib para machine learning. - GraphX para processamento de gráficos. - 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 em Python? | - A abstração primária no Spark é um conjunto de dados. - Em Python, os conjuntos de dados do Spark são chamados de DataFrame. - Em Python, Datasets são representados como Dataset[Row] |
Por que todos os conjuntos de dados em Python são chamados DataFrames no Spark? | - Os conjuntos de dados em 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 em Pandas e R. |
Como é utilizado o num_evals
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 levar em conta as diferenças no tamanho do documento. Ou seja, tenta manter aproximadamente o mesmo número de perguntas por página em todo o conjunto de documentos.
Se num_evals
for inferior ao número de documentos, alguns documentos não terão avaliações geradas. O DataFrame retornado pela função inclui uma coluna com os source_doc_ids
que foram usados para gerar avaliações. Você pode usar esta coluna para unir novamente ao seu DataFrame original para gerar avaliações para os documentos que foram omitidos.
Para ajudar a estimar o num_evals
para uma 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 — bloco de notas de exemplo
Veja o seguinte notebook para um exemplo de código que cria um conjunto de avaliação sintético.
Caderno de exemplo de avaliações sintéticas
Demonstração de 10 minutos para aumentar o desempenho do agente
O bloco de anotações de exemplo a seguir demonstra como melhorar a qualidade do seu agente. Inclui os seguintes passos:
- Gere um conjunto de dados de avaliação sintético.
- Crie e avalie um agente de linha de base.
- Compare o agente base em várias configurações (como diferentes prompts) e modelos base para encontrar o equilíbrio ideal de qualidade, custo e latência.
- Implante o agente em uma interface do usuário da Web para permitir que as partes interessadas testem e forneçam comentários adicionais.
Melhore o desempenho do agente usando o notebook de dados sintéticos
Informações sobre os modelos que alimentam dados sintéticos
- Os dados sintéticos podem usar serviços de terceiros para avaliar seus aplicativos GenAI, incluindo o Azure OpenAI operado pela Microsoft.
- Para o Azure OpenAI, o Databricks optou por não participar do Monitoramento de Abuso, portanto, nenhum prompt ou resposta é armazenado com o Azure OpenAI.
- Para espaços de trabalho da União Europeia (UE), os dados sintéticos utilizam modelos alojados na UE. Todas as outras regiões usam modelos hospedados nos EUA.
- A desativação dos recursos assistidos por IA do Azure impede que o serviço de dados sintéticos chame modelos de IA do Azure.
- 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 um LLM.