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

ドメインの専門家のフィードバックを収集する

生成AIアプリケーションを改善する最も効果的な方法の1つは、ドメインの専門家に既存のトレースをレビューし、ラベル付けしてもらうことです。MLflow のレビュー アプリは、アプリケーションとの実際の対話に関するこの専門家のフィードバックを収集するための構造化されたプロセスを提供します。

アプリのプレビューヒーロー画像を確認します。

前提 条件

  • 開発環境は、生成AI アプリケーション トレースがログに記録される MLflow エクスペリメントに接続されています。

  • Databricksドメインの専門家は、MLflow エクスペリメントを含む ワークスペースにアクセスできる必要があります。

注記

このガイドで説明する機能には、MLflow バージョン 3.1.0 が必要ですまたはそれ以上。

次のコマンドを実行して、Databricks 統合に必要な追加機能を含む MLflow SDK をインストールまたはアップグレードします。

Bash
pip install --upgrade "mlflow[databricks]>=3.1.0" openai

概要

ステップ 1: トレースを使用してアプリを作成する

フィードバックを収集する前に、生成AI アプリケーションからのトレースをログに記録する必要があります。これらのトレースは、アプリケーションの実行の入力、出力、および中間ステップ (ツール呼び出しや取得アクションなど) をキャプチャします。

トレースをログに記録する方法の例を次に示します。この例には偽のレトリーバーが含まれているため、トレースで取得したドキュメントがレビューアプリでどのようにレンダリングされるかを説明できます。Review Appがトレースをレンダリングする方法の詳細については、 Review Appの概要 を参照してください。

Python
import os
import mlflow
from openai import OpenAI
from mlflow.entities import Document
from typing import List, Dict

# Enable auto instrumentation for OpenAI SDK
mlflow.openai.autolog()

# Connect to a Databricks LLM via OpenAI using the same credentials as MLflow
# Alternatively, you can use your own OpenAI credentials here
mlflow_creds = mlflow.utils.databricks_utils.get_databricks_host_creds()
client = OpenAI(
api_key=mlflow_creds.token,
base_url=f"{mlflow_creds.host}/serving-endpoints"
)

# Spans of type RETRIEVER are rendered in the Review App as documents.
@mlflow.trace(span_type="RETRIEVER")
def retrieve_docs(query: str) -> List[Document]:
normalized_query = query.lower()
if "john doe" in normalized_query:
return [
Document(
id="conversation_123",
page_content="John Doe mentioned issues with login on July 10th. Expressed interest in feature X.",
metadata={"doc_uri": "http://domain.com/conversations/123"},
),
Document(
id="conversation_124",
page_content="Follow-up call with John Doe on July 12th. Login issue resolved. Discussed pricing for feature X.",
metadata={"doc_uri": "http://domain.com/conversations/124"},
),
]
else:
return [
Document(
id="ticket_987",
page_content="Acme Corp raised a critical P0 bug regarding their main dashboard on July 15th.",
metadata={"doc_uri": "http://domain.com/tickets/987"},
)
]

# Sample app that we will review traces from
@mlflow.trace
def my_app(messages: List[Dict[str, str]]):
# 1. Retrieve conversations based on the last user message
last_user_message_content = messages[-1]["content"]
retrieved_documents = retrieve_docs(query=last_user_message_content)
retrieved_docs_text = "\n".join([doc.page_content for doc in retrieved_documents])

# 2. Prepare messages for the LLM
messages_for_llm = [
{"role": "system", "content": "You are a helpful assistant!"},
{
"role": "user",
"content": f"Additional retrieved context:\n{retrieved_docs_text}\n\nNow, please provide the one-paragraph summary based on the user's request {last_user_message_content} and this retrieved context.",
},
]

# 3. Call LLM to generate the summary
return client.chat.completions.create(
model="databricks-claude-3-7-sonnet", # This example uses Databricks hosted Claude-3-7-Sonnet. If you provide your own OpenAI credentials, replace with a valid OpenAI model e.g., gpt-4o, etc.
messages=messages_for_llm,
)

ステップ 2: ラベリングスキーマを定義する

ラベリングスキーマは、ドメインの専門家がトレースに関するフィードバックを提供するために使用する質問と入力タイプを定義します。MLflow の組み込みスキーマを使用することも、特定の評価基準に合わせたカスタムスキーマを作成することもできます。

ラベリングスキーマには、主に次の 2 つのタイプがあります。

  • 期待値タイプ(type="expectation"): 専門家が「グラウンドトゥルース」または正しい答えを提供するときに使用されます。たとえば、RAG システムの応答の expected_facts を提供します。これらのラベルは、多くの場合、評価データセットで直接使用できます。
  • フィードバックの種類 (type="feedback"): 主観的な評価、評価、または分類に使用されます。たとえば、礼儀正しさについて1〜5のスケールで回答を評価したり、回答が特定の基準を満たしているかどうかを分類したりします。

スキーマの ラベル付けに関するドキュメント を参照して、スキーマのさまざまな入力方法 (カテゴリの選択肢 (ラジオボタン)、数値スケール、自由形式テキストなど) を理解してください。

Python

from mlflow.genai.label_schemas import create_label_schema, InputCategorical, InputText

# Collect feedback on the summary
summary_quality = create_label_schema(
name="summary_quality",
type="feedback",
title="Is this summary concise and helpful?",
input=InputCategorical(options=["Yes", "No"]),
instruction="Please provide a rationale below.",
enable_comment=True,
overwrite=True,
)

# Collect a ground truth summary
expected_summary = create_label_schema(
name="expected_summary",
type="expectation",
title="Please provide the correct summary for the user's request.",
input=InputText(),
overwrite=True,
)

ステップ 3: ラベリングセッションを作成する

ラベリングセッションは、選択したラベリングスキーマを使用して特定の専門家がレビューするための一連のトレースを整理する特殊なタイプの MLflow です。 これは、レビュープロセスのキューとして機能します。

詳細については、 ラベリングセッションのドキュメント を参照してください。

ラベル付けセッションを作成する方法は次のとおりです。

Python
from mlflow.genai.labeling import create_labeling_session

# Create the Labeling Session with the schemas we created in the previous step
label_summaries = create_labeling_session(
name="label_summaries",
assigned_users=[],
label_schemas=[summary_quality.name, expected_summary.name],
)

ステップ 4: トレースを生成し、ラベリングセッションに追加する

ラベリングセッションが作成されたら、トレースを追加する必要があります。トレースはラベリングセッションにコピーされるため、レビュープロセス中に行われたラベルや変更は、元のログトレースに影響を与えません。

エクスペリメント MLflow に任意のトレースを追加できます。 詳細については、 ラベリングセッションのドキュメント を参照してください。

注記

トレースが生成されたら、トレースタブでトレースを選択し、 トレースのエクスポート をクリックして、上記で作成したラベリング セッションを選択することで、トレースをラベリング セッションに追加することもできます。

Python
import mlflow

# Use verison tracking to be able to easily query for the traces
tracked_model = mlflow.set_active_model(name="my_app")

# Run the app to generate traces
sample_messages_1 = [
{"role": "user", "content": "what issues does john doe have?"},
]
summary1_output = my_app(sample_messages_1)

sample_messages_2 = [
{"role": "user", "content": "what issues does acme corp have?"},
]
summary2_output = my_app(sample_messages_2)

# Query for the traces we just generated
traces = mlflow.search_traces(model_id=tracked_model.model_id)

# Add the traces to the session
label_summaries.add_traces(traces)

# Print the URL to share with your domain experts
print(f"Share this Review App with your team: {label_summaries.url}")

ステップ5:レビューアプリを専門家と共有する

ラベリングセッションにトレースが入力されたら、そのURLをドメインの専門家と共有できます。この URL を使用してレビューアプリにアクセスし、割り当てられたトレースを表示 (または割り当てられていないトレースから選択) し、設定したラベル付けスキーマを使用してフィードバックを提供できます。

important

ドメインの専門家は、 DatabricksワークスペースとMLflowエクスペリメントのWRITEのアクセス許可にアクセスできる必要があります。

ステップ 6: 収集したラベルを表示して使用する

ドメインの専門家がレビューを完了すると、収集されたフィードバックがラベリングセッション内のトレースに添付されます。これらのラベルは、プログラムで取得して分析したり、評価データセットの作成に使用したりできます。

ラベルは、ラベリング セッション内の各トレースに Assessment オブジェクトとして保存されます。

MLflow UI を使用する

結果を確認するには、 MLflow エクスペリメントに移動します。

MLflow UI でのフィードバックの収集結果

MLflow SDK を使用する

次のコードは、ラベル付けセッションの実行からすべてのトレースをフェッチし、評価 (ラベル) を Pandas DataFrame に抽出して分析を容易にします。

Python
labeled_traces_df = mlflow.search_traces(run_id=label_summaries.mlflow_run_id)

ノートブックの例

次のノートブックには、このページのすべてのコードが含まれています。

ドメイン専門家のフィードバック ノートブックを収集する

Open notebook in new tab

次のステップ

評価データセットへの変換

「期待値」タイプのラベル(例の expected_summary など)は、 評価データセットを作成するのに特に役立ちます。これらのデータセットを mlflow.genai.evaluate() と一緒に使用して、専門家が定義したグラウンドトゥルースに対して新しいバージョンのGenAIアプリケーションを体系的にテストできます。