メインコンテンツまでスキップ

評価セットの合成

このページでは、エージェントの品質を測定するための高品質な評価セットを合成的に生成する方法について説明します。

評価セットの手動構築は時間がかかることが多く、エージェントのすべての機能を網羅していることを保証するのは困難です。Agent Evaluation は、ドキュメントから代表的な評価セットを自動的に生成することでこの障壁を取り除き、テストケースを十分に網羅した状態でエージェントを迅速に評価できます。

評価セットの生成

ドキュメント検索を使用するエージェントの評価を合成するには、databricks-agents Pythonパッケージの一部であるgenerate_evals_dfメソッドを使用します。APIの詳細については、Python SDKリファレンスを参照してください。

この方法では、ドキュメントを Pandas データフレーム または Spark データフレーム として提供する必要があります。

入力データフレームには以下の列が必要です。

  • content: 解析されたドキュメントのコンテンツを文字列として。
  • doc_uri:ドキュメントURIです。

生成を制御するために、3つの追加のパラメーターを使用できます:

  • num_evalsすべてのドキュメントで生成する評価の合計数。この関数は、ドキュメントのサイズを考慮して、生成された評価をすべてのドキュメントに分散させようとします。num_evalsがドキュメント数未満の場合、すべてのドキュメントが評価セットで対象になるわけではありません。

    num_evals を使用してドキュメント間で評価を配布する方法の詳細については、num_evals の使用方法」を参照してください。

  • agent_description: エージェントのタスクの説明

  • question_guidelines:合成質問の生成をガイドするのに役立つ一連のガイドラインです。これは生成を促すために使用される自由形式の文字列です。以下の例を参照してください。

generate_evals_df の出力は DataFrame です。DataFrame の列は、MLflow 3 を使用しているか MLflow 2 を使用しているかによって異なります。

  • request_id: 一意のリクエストID。
  • inputs: チャット補完APIでの合成された入力。
  • expectations: 2つのフィールドを持つディクショナリ:
    • expected_facts応答に含まれる期待される事実のリスト。この列のデータ型はリスト[文字列]です。
    • expected_retrieved_context:この評価が合成されたコンテキスト(ドキュメントコンテンツとdoc_uriを含む)。

以下の例では、generate_evals_df を使用して評価セットを生成し、その後 mlflow.genai.evaluate() を直接呼び出して、この評価セットにおける Meta Llama 3.1 のパフォーマンスを測定します。Llama 3.1 モデルはあなたのドキュメントを見たことがないため、ハルシネーションを起こす可能性があります。それでも、このエクスペリメントはカスタムエージェントの良いベースラインとなります。

Python

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

import mlflow
from databricks.agents.evals import generate_evals_df
from mlflow.genai.scorers import Correctness
import pandas as pd

# `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.
predict_fn = mlflow.genai.to_predict_fn("endpoints:/databricks-meta-llama-3-3-70b-instruct")

results = mlflow.genai.evaluate(
predict_fn=predict_fn,
scorers=[Correctness()],
data=evals
)

出力例を以下に示します。出力列は、MLflow 3とMLflow 2のどちらを使用しているかによって異なります。

次の出力例では、列request_idexpectations.expected_retrieved_contextは表示されません。

inputs.messages[0].content

expectations.expected_facts

Apache SparkでSpark SQLは何に使用されますか?

  • Spark SQL は、Apache Spark で SQL 処理に使用されます。
  • Spark SQL は、Apache Spark で構造化データ処理に使用されます。

Apache Sparkでサポートされている主要なツールにはどのようなものがあり、どのような目的に利用されますか?

  • SQL および構造化データ処理向けの Spark SQL。
  • Pandasワークロードを処理するためのPandas API on Spark。
  • 機械学習向けのMLlibです。
  • GraphX グラフ処理用。
  • インクリメンタル計算とストリーム処理のための構造化ストリーミング。

Sparkにおける主要な抽象化とは何ですか?また、データセットはPythonでどのように表現されますか?

  • Sparkにおける主要な抽象化はデータセットです。
  • Pythonでは、SparkのデータセットはDataFrameと呼ばれます。
  • Pythonでは、データセットはDataset[Row]として表されます。

なぜ 内のすべてのデータセットがPython データフレームでSpark と呼ばれるのですか?

  • Pythonのデータセットは、データフレームの概念との一貫性を保つために、SparkではDataFramesと呼ばれます。
  • データフレームの概念は、PandasとRで標準的です。

num_evals の使用方法

num_evals は、ドキュメントセットに対して生成された評価の総数です。この関数は、ドキュメントサイズの差を考慮しながら、これらの評価をドキュメント全体に分散させます。つまり、ドキュメントセット全体で、ページあたりの質問数をほぼ同じに保とうとします。

num_evalsがドキュメントの数より少ない場合、一部のドキュメントでは評価が生成されません。この関数によって返される データフレーム には、評価の生成に使用された source_doc_ids の列が含まれます。 この列を使用して、元の データフレーム に結合し直し、スキップされたドキュメントの評価を生成できます。

目的のカバー範囲に対してnum_evalsを推定するために、estimate_synthetic_num_evalsメソッドを提供しています:

Python

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

合成評価セットを作成 — サンプル ノートブック

合成評価セットを作成するためのコード例については、次のノートブックを参照してください。

合成評価のサンプルノートブック

ノートブックを新しいタブで開く

合成データを強化するモデルに関する情報

  • 合成データは、Microsoftが運営するAzure OpenAIなどのサードパーティサービスを使用して、生成AIアプリケーションを評価する場合があります。
  • Azure OpenAIの場合、Databricksは不正行為モニタリングをオプトアウトしているため、プロンプトや応答はAzure OpenAIに保存されません。
  • 欧州連合(EU)のワークスペースでは、合成データはEUでホストされているモデルを使用します。その他のすべてのリージョンは、米国でホストされているモデルを使用します。
  • パートナーを利用したAI機能を無効にすると、合成データサービスがパートナーを利用したモデルを呼び出すことができなくなります。
  • 合成データサービスに送信されたデータは、モデルのトレーニングには使用されません。
  • 合成データは、顧客がエージェントアプリケーションを評価するのに役立つことを意図しており、その出力はLLMをトレーニングする、改善する、またはファインチューニングするために使用すべきではありません。

制限事項

サーバレス出力制御が有効になっているワークスペースでは、合成評価データセットを作成できません。