次の方法で共有


トレースデータモデル

このドキュメントでは、MLflow トレース データ モデルの詳細な概要について説明します。 このモデルを理解することは、生成 AI アプリケーションの可観測性と分析のために MLflow トレースを活用するための鍵となります。

MLflowトレースは、観測性のために広く採用されている業界標準である OpenTelemetry 仕様と互換性のあるものに設計されています。 これにより、相互運用性が確保され、MLflow トレースをエクスポートし、他の OpenTelemetry 互換システムと共に使用できるようになります。 MLflow は、Generateive AI ユース ケースの特定の構造と属性を定義することで、基本的な OpenTelemetry Span モデルを強化し、より豊富なコンテキストと、品質とパフォーマンスに関するより深い洞察を提供します。

トレースの構造

大まかに言えば、MLflow トレース は 2 つの主要なオブジェクトで構成されます。

  1. TraceInfo:
    • トレースの発生元、トレースの状態、合計実行時間に関する情報の説明に役立つメタデータ。
    • ユーザー、セッション、開発者が指定したキーと値のペアなど、トレースの追加コンテキストを提供するタグ。 タグは、トレースの検索またはフィルター処理に使用できます。
    • 人間や LLM ジャッジ、またはグラウンドトゥルース情報からの構造化されたフィードバック ラベルを、トレースやトレース内の特定のスパンに追加できる評価
  2. TraceData:
    • 実際のペイロード。入力から出力までのアプリケーションのステップ バイ ステップ実行をキャプチャする、インストルメント化された Span オブジェクトが含まれます。

ヒント

これらのデータクラス オブジェクトのヘルパー メソッドの API ドキュメントで、データを変換または抽出する方法の詳細を確認してください。

トレース アーキテクチャ

1. トレース情報

MLflow のトレース機能内の TraceInfo は、トレース全体に関する重要なデータの軽量スナップショットを提供することを目的としています。 TraceInfo は、トレースに関するメタデータを含むデータクラス オブジェクトです。

このメタデータには、トレースの配信元、状態、およびその他のさまざまなデータに関する情報が含まれます。このデータは、 mlflow.client.MlflowClient.search_traces と共に使用される場合や、MLflow UI 内のトレースのナビゲーションに使用されるトレースの取得とフィルター処理に役立ちます。 TraceInfoメタデータを検索に使用する方法の詳細については、ここで例を参照してください。

パラメーター データ型 説明
trace_id str トレースのプライマリ識別子。
trace_location TraceLocation トレースが格納される場所。:p y:class:~mlflow.entities.TraceLocation オブジェクトとして表されます。 現在、MLflow では、トレースの場所として MLflow 実験または Databricks 推論テーブルがサポートされています。
request_time int トレースの開始時刻 (ミリ秒単位)。
state TraceState トレースの状態。:py:class:~mlflow.entities.TraceState 列挙型として表されます。 [OKERRORIN_PROGRESSSTATE_UNSPECIFIED] のいずれかです。
request_preview Optional[str] モデル/エージェントへの要求。ルート スパンの入力に相当しますが、JSON エンコードされ、切り捨て可能です。
response_preview Optional[str] モデル/エージェントからの応答。ルート スパンの出力に相当しますが、JSON でエンコードされ、切り捨てることもできます。
client_request_id Optional[str] トレースに関連するクライアント提供のリクエストID。 これは、トレースを生成した外部システムからのトレース/要求 (Web アプリケーションのセッション ID など) を識別するために使用できます。
execution_duration Optional[int] トレースの期間 (ミリ秒単位)。
trace_metadata dict[str, str] トレースに関連付けられているキーと値のペア。 これらは、トレースに関連付けられている実行 ID などの変更できない値用に設計されています。
tags dict[str, str] トレースに関連付けられているタグ。 これらは変更可能な値用に設計されており、MLflow UI または API を使用してトレースを作成した後に更新できます。
assessments list[Assessment] トレースに関連付けられている評価の一覧。

次に示すように、 TraceInfo オブジェクトに含まれるデータを使用して、MLflow 追跡 UI 内のトレース ビュー ページを設定します。

MLflow UI で使用される TraceInfo

MLflow TraceInfo オブジェクトの主なコンポーネントを次に示します。

メタデータ

評価

評価は、トレースにキャプチャされた GenAI アプリケーションの動作の品質と正確性を評価するために重要です。 これにより、トレースまたはトレース内の特定のスパンに、構造化されたラベルやスコア、基底情報を添付することができます。

MLflow では、基本 Assessment の概念を継承する 2 つの主要な種類の評価が定義されています。

  1. フィードバック: 操作の出力に関する定性的または定量的な判断を表します。 これは、人間のレビュー担当者、ジャッジとしての LLM、またはカスタム スコアリング関数から取得できます。
  2. 期待値: 特定の操作に対する地上の真実または予想される結果を表します。多くの場合、実際の出力との直接比較に使用されます。

評価は通常、 mlflow.log_feedback()mlflow.log_expectation()、より一般的な mlflow.log_assessment()などの関数を使用してトレースに記録されます。

評価ソース

すべての評価は、ソースに関連付けられて、その発生元を追跡します。

  • source_type: mlflow.entities.AssessmentSourceType 列挙型。 主な値は次のとおりです。
    • HUMAN: 人間が提供するフィードバックまたは期待。
    • LLM_JUDGE: 判事として活動する LLM によって生成された評価。
    • CODE: プログラムによるルール、ヒューリスティック、またはカスタム スコアラーによって生成される評価。
  • source_id: 特定のソースの文字列識別子 (ユーザー ID、LLM ジャッジのモデル名、スクリプト名など)。
from mlflow.entities import AssessmentSource, AssessmentSourceType

# Example: Human source
human_source = AssessmentSource(
    source_type=AssessmentSourceType.HUMAN,
    source_id="reviewer_alice@example.com"
)

# Example: LLM Judge source
llm_judge_source = AssessmentSource(
    source_type=AssessmentSourceType.LLM_JUDGE,
    source_id="gpt-4o-mini-evaluator"
)

# Example: Code-based scorer source
code_source = AssessmentSource(
    source_type=AssessmentSourceType.CODE,
    source_id="custom_metrics/flesch_kincaid_scorer.py"
)

フィードバック

フィードバックは、トレースまたはスパン出力の品質または特性に関する判断をキャプチャします。

キー フィールド:

パラメーター データ型 説明
name str 評価の名前。 指定しない場合は、既定の名前 "feedback" が使用されます。
value Optional[FeedbackValueType] フィードバック値。 float、int、str、bool、これらの型のリスト、またはこれらの型の文字列キーと値を含む dict を指定できます。
error Optional[Union[Exception, AssessmentError]] フィードバックに関連付けられている省略可能なエラー。 これは、フィードバックが無効であるか、処理できないことを示すために使用されます。 例外オブジェクト、:p y:class:~mlflow.entities.Exception オブジェクト、または AssessmentErrorを受け入れます。
rationale Optional[str] フィードバックの根拠/正当性。
source Optional[AssessmentSource] 評価のソース。 指定しない場合、既定のソースは CODE です。
trace_id Optional[str] 評価に関連付けられているトレースの ID。 未設定の場合、評価は現時点ではトレースに関連付けられていません。
metadata Optional[dict[str, str]] 評価に関連付けられているメタデータ。
span_id Optional[str] 評価をトレース内の特定のスパンに関連付ける必要がある場合は、評価に関連付けられているスパンの ID。
create_time_ms Optional[int] 評価の作成時間 (ミリ秒単位)。 設定を解除すると、現在の時刻が使用されます。
last_update_time_ms Optional[int] 評価の最後の更新時刻 (ミリ秒単位)。 設定を解除すると、現在の時刻が使用されます。

:

import mlflow
from mlflow.entities import Feedback, AssessmentSource, AssessmentSourceType

# Log simple binary feedback
mlflow.log_feedback(
    trace_id="trace_123",
    name="is_correct",
    value=True,
    source=AssessmentSource(source_type=AssessmentSourceType.HUMAN, source_id="user_bob"),
    rationale="The answer provided was factually accurate."
)

# Log a numeric score from an LLM judge
llm_judge_feedback = Feedback(
    name="relevance_score",
    value=0.85,
    source=AssessmentSource(source_type=AssessmentSourceType.LLM_JUDGE, source_id="claude-3-sonnet"),
    rationale="The response directly addressed the user's core question.",
    metadata={"judge_prompt_version": "v1.2"}
)
# Assuming trace_id is known, you can also use log_assessment
# mlflow.log_assessment(trace_id="trace_456", assessment=llm_judge_feedback)

期待

期待値は、操作の基準真実またはターゲット出力を定義します。

キー フィールド:

パラメーター データ型 説明
name str 評価の名前。
value Any 操作の予期される値。 任意の JSON シリアル化可能な値を指定できます。
source Optional[AssessmentSource] 評価のソース。 指定しない場合、既定のソースは HUMAN です。 (詳細については 、評価ソース を参照してください)。
trace_id Optional[str] 評価に関連付けられているトレースの ID。 未設定の場合、評価は現時点ではトレースに関連付けられていません。
metadata Optional[dict[str, str]] 評価に関連付けられているメタデータ。
span_id Optional[str] 評価をトレース内の特定のスパンに関連付ける必要がある場合は、評価に関連付けられているスパンの ID。
create_time_ms Optional[int] 評価の作成時間 (ミリ秒単位)。 設定を解除すると、現在の時刻が使用されます。
last_update_time_ms Optional[int] 評価の最後の更新時刻 (ミリ秒単位)。 設定を解除すると、現在の時刻が使用されます。

:

import mlflow
from mlflow.entities import Expectation, AssessmentSource, AssessmentSourceType

# Log a ground truth answer
mlflow.log_expectation(
    trace_id="trace_789",
    name="ground_truth_response",
    value="The Battle of Hastings was in 1066.",
    source=AssessmentSource(source_type=AssessmentSourceType.HUMAN, source_id="history_expert_01")
)

# Log an expected structured output for a tool call
expected_tool_output = Expectation(
    name="expected_tool_call_result",
    value={"result": {"status": "success", "data": "item_abc_123"}},
    metadata={"tool_name": "inventory_check"}
)
# Assuming trace_id is known:
# mlflow.log_assessment(trace_id="trace_101", assessment=expected_tool_output)

評価エラー

フィードバックまたは期待の生成または計算中に発生したエラーをログに記録するために使用されます (たとえば、LLM のジャッジが失敗した場合)。

キー フィールド:

  • error_code (str): エラーのコード (例: "RATE_LIMIT_EXCEEDED"、"JUDGE_ERROR")。
  • error_message (省略可能[str]): 詳細なエラー メッセージ。
  • stack_trace (省略可能[str]): スタック トレース (使用可能な場合)。

:

import mlflow
from mlflow.entities import AssessmentError, Feedback, AssessmentSource, AssessmentSourceType

judge_error = AssessmentError(
    error_code="LLM_JUDGE_TIMEOUT",
    error_message="The LLM judge timed out after 30 seconds while assessing relevance."
)

mlflow.log_feedback(
    trace_id="trace_error_example",
    name="relevance_with_judge_v2",
    source=AssessmentSource(source_type=AssessmentSourceType.LLM_JUDGE, source_id="custom_judge_model"),
    error=judge_error
    # Note: `value` is typically None when an error is provided
)

これらのエンティティは、豊富な定性および定量データをトレースに関連付ける柔軟かつ構造化された方法を提供し、MLflow Tracing 内の可観測性と評価機能の重要な部分を形成します。

タグ

MLflow の tags オブジェクトの TraceInfo プロパティは、トレースの追加のコンテキストを提供するために使用されます。 これらのタグは、トレースに関する検索、フィルター処理、または追加情報の提供に使用できます。

タグはキーと値のペアであり、変更可能です。 つまり、トレースが実験に記録された後でも、いつでもタグを追加、変更、または削除できます。

カスタム メタデータをキャプチャするカスタム タグを追加する方法については、「 カスタム タグ/メタデータをアタッチする」を参照してください。

標準タグ

MLflow では、ユーザー、セッション、環境に関する一般的なコンテキスト情報に一連の標準タグを使用します。このタグを使用すると、MLflow UI と SDK 内でフィルター処理とグループ化の機能が強化されます。

  • mlflow.trace.session: セッション ID の標準タグはユーザーとセッションを追跡で導入されました。
  • mlflow.trace.user: ユーザー ID の標準タグ。ユーザー の追跡とセッションで導入されました。
  • mlflow.source.name: トレースを生成したエントリ ポイントまたはスクリプト。
  • mlflow.source.git.commit: Git リポジトリから実行する場合は、ソース コードのコミット ハッシュ。
  • mlflow.source.type: トレースを生成したソースの種類。一般的に PROJECT (MLflow プロジェクトの実行の場合) または NOTEBOOK (ノートブックから実行される場合)。

これらを実装する方法の詳細については、ユーザーとセッションの追跡と環境とコンテキストの追跡に関するガイドを参照してください。

2. トレース データ

TraceData経由でアクセスできる MLflow Trace.data オブジェクトは、トレースのコア ペイロードを保持します。 これには主に、発生した一連の操作 (スパン) と、トレースをトリガーした最初の要求と、生成された最終的な応答が含まれます。

キー フィールド:

  • spans (リスト[Span]):

    • これは、トレース内の個々のステップ、操作、または関数呼び出しを表す Span オブジェクト ( mlflow.entities.Span および OpenTelemetry 仕様に準拠) の一覧です。 各スパンでは、特定の作業単位について詳しく説明します。
    • スパンは、実行フローを表すために parent_id を介して階層的に編成されます。
    • オブジェクトの詳細な内訳については、後述のSpan」セクションを参照してください。

requestプロパティとresponseプロパティは、下位互換性のために保持されます。 これらの値は、ルート スパンのそれぞれの inputs および outputs 属性から検索され、 TraceData オブジェクトのユーザーによって直接設定されるわけではありません。

  • request (str):

    • トレースのルート スパンの入力データを表す JSON シリアル化文字列。 これは通常、エンド ユーザーの要求、またはトレースされたアプリケーションまたはワークフローを呼び出した初期パラメーターです。
    • : '{"query": "What is MLflow Tracing?", "user_id": "user123"}'
  • response (str):

    • トレースされたアプリケーションまたはワークフローのルートスパンからの最終的な出力データを表す JSON シリアル化された文字列。
    • : '{"answer": "MLflow Tracing provides observability...", "confidence": 0.95}'

概念表現:

通常、クライアントを介して取得したTraceData オブジェクト (mlflow.entities.Trace など) を介してclient.get_trace(trace_id).dataを操作しますが、概念的には次のコア コンポーネントがバンドルされます。

# Conceptual structure (not direct instantiation like this)
class TraceData:
    def __init__(self, spans: list[Span], request: str, response: str):
        self.spans = spans # List of Span objects
        self.request = request # JSON string: Overall input to the trace
        self.response = response # JSON string: Overall output of the trace

TraceDataを理解することは、GenAI アプリケーションのライフサイクル全体で発生する詳細な実行パスとデータ変換をプログラムで分析する上で重要です。

スパン

MLflow のトレース機能内の Span オブジェクトは、トレースの個々のステップに関する詳細情報を提供します。

OpenTelemetry Span 仕様に準拠しています。各 Span オブジェクトには、span_id、名前、start_time、parent_id、状態、入力、出力、属性、イベントなど、インストルメント化されるステップに関する情報が含まれます。

スパン アーキテクチャ

スパン スキーマ

スパンはトレース データの中核です。 これらは、genai アプリケーション内の各ステップに関する重要なキー データを記録します。

MLflow UI 内でトレースを表示すると、次に示すようにスパンのコレクションが表示されます。

MLflow UI 内のスパン

以下のセクションでは、スパンの構造の詳細を示します。

スパンの種類

スパン型は、トレース内のスパンを分類する方法です。 既定では、トレース デコレーターを使用する場合、スパンの種類は "UNKNOWN" に設定されます。 MLflow には、一般的なユース ケース用に定義済みのスパン型のセットが用意されていますが、カスタム スパンの種類を設定することもできます。

次のスパンの種類を使用できます。 さらに、スパンの種類を開発者が指定した任意の str 値に設定できます。

スパンの種類 説明
"CHAT_MODEL" チャット モデルに対するクエリを表します。 これは、LLM 対話の特殊なケースです。
"CHAIN" 操作のチェーンを表します。
"AGENT" 自律エージェント操作を表します。
"TOOL" 検索エンジンのクエリなど、ツールの実行 (通常はエージェントによって) を表します。
"EMBEDDING" テキスト埋め込み操作を表します。
"RETRIEVER" ベクター データベースのクエリなど、コンテキスト取得操作を表します。
"PARSER" テキストを構造化形式に変換する解析操作を表します。
"RERANKER" 関連性に基づいて取得したコンテキストを並べ替える、再ランク付け操作を表します。
"UNKNOWN" 他のスパン型が指定されていない場合に使用される既定のスパン型。

スパンの種類を設定するには、 span_type パラメーターを mlflow.trace デコレーターまたはコンテキスト マネージャー mlflow.start_span 渡します。 自動トレースを使用している場合、スパンの種類は MLflow によって自動的に設定されます。

import mlflow
from mlflow.entities import SpanType


# Using a built-in span type
@mlflow.trace(span_type=SpanType.RETRIEVER)
def retrieve_documents(query: str):
    ...


# Setting a custom span type
with mlflow.start_span(name="add", span_type="MATH") as span:
    span.set_inputs({"x": z, "y": y})
    z = x + y
    span.set_outputs({"z": z})

    print(span.span_type)
    # Output: MATH

特定のスパン型のスキーマ

MLflow には一連の定義済みのスパン ( mlflow.entities.SpanTypeを参照) があり、特定のスパンの種類には、UI 内の追加機能や、評価などのダウンストリーム タスクを有効にするために必要なプロパティがあります。

レトリバースパン

RETRIEVER スパン型は、データ ストアからデータを取得する操作 (ベクター ストアからドキュメントを照会するなど) に使用されます。 RETRIEVERスパンの出力は、ドキュメントの一覧である必要があります。

リスト内の各ドキュメントはディクショナリ (または次のキーを使用してディクショナリにシリアル化できるオブジェクト) である必要があり、理想的には次のものが含まれます。

  • page_content (str): 取得したドキュメント チャンクのテキスト コンテンツ。
  • metadata (Optional[Dict[str, Any]]): ドキュメントに関連付けられている追加のメタデータのディクショナリ。
    • MLflow UI と評価メトリックは、このメタデータ内で doc_uri (ドキュメント ソースの文字列 URI) と chunk_id (ドキュメントがより大きなチャンクドキュメントの一部である場合は文字列識別子) を検索して、表示と機能を強化することができます。
  • id (Optional[str]): ドキュメント チャンク自体の省略可能な一意識別子です。

動作中のレトリバー スパンの例:

import mlflow
from mlflow.entities import SpanType, Document


def search_store(query: str) -> list[(str, str)]:
    # Simulate retrieving documents (e.g., from a vector database)
    return [
        ("MLflow Tracing helps debug GenAI applications...", "docs/mlflow/tracing_intro.md"),
        ("Key components of a trace include spans...", "docs/mlflow/tracing_datamodel.md"),
        ("MLflow provides automatic instrumentation...", "docs/mlflow/auto_trace.md")
    ]


@mlflow.trace(span_type=SpanType.RETRIEVER)
def retrieve_relevant_documents(query: str):
    # Get documents from the search store
    docs = search_store(query)

    # Get the current active span (created by @mlflow.trace)
    span = mlflow.get_current_active_span()

    # Set the outputs of the span in accordance with the tracing schema
    outputs = [Document(page_content=doc, metadata={"doc_uri": uri}) for doc, uri in docs]
    span.set_outputs(outputs)

    # Return the original format for downstream usage
    return docs


# Example usage
user_query = "MLflow Tracing benefits"
retrieved_docs = retrieve_relevant_documents(user_query)

# Read path: Reconstructing the document list from the span outputs
trace_id = mlflow.get_last_active_trace_id()
trace = mlflow.get_trace(trace_id)
span = trace.search_spans(name="retrieve_relevant_documents")[0]
documents = [Document(**doc) for doc in span.outputs]

print(documents)

この構造 (特にpage_contentmetadataなどの関連するdoc_uriを含む) に準拠すると、RETRIEVERスパンが MLflow UI で有益にレンダリングされ (ドキュメント コンテンツの表示やリンクの提供など)、ダウンストリームの評価タスクで取得されたコンテキストを正しく処理できるようになります。

チャットの完了とツールの呼び出しスパン

CHAT_MODELまたはLLMの種類のスパンは、チャット入力候補 API (OpenAI のチャット入力候補、Anthropic のメッセージ API など) との対話を表すために使用されます。 これらのスパンでは、モデルで使用できるツール (関数) に関する情報をキャプチャすることもできます。

プロバイダーは API に対して異なるスキーマを持つ可能性があるため、生の LLM 呼び出し自体に対するスパンの入力と出力の形式に厳密な制限はありません。 ただし、豊富な UI 機能 (会話の表示やツール呼び出しの視覚化など) を有効にし、評価用のデータを標準化するために、MLflow ではチャット メッセージとツール定義の特定の属性を定義します。

上記のユーティリティ関数の使用方法と、 span.get_attribute() 関数を使用してそれらを取得する方法の簡単なデモについては、次の例を参照してください。

import mlflow
from mlflow.entities.span import SpanType # Corrected from mlflow.entities.span import SpanType
from mlflow.tracing.constant import SpanAttributeKey
from mlflow.tracing import set_span_chat_messages, set_span_chat_tools

# example messages and tools
messages = [
    {
        "role": "system",
        "content": "please use the provided tool to answer the user's questions",
    },
    {"role": "user", "content": "what is 1 + 1?"},
]

tools = [
    {
        "type": "function",
        "function": {
            "name": "add",
            "description": "Add two numbers",
            "parameters": {
                "type": "object",
                "properties": {
                    "a": {"type": "number"},
                    "b": {"type": "number"},
                },
                "required": ["a", "b"],
            },
        },
    }
]


@mlflow.trace(span_type=SpanType.CHAT_MODEL)
def call_chat_model(messages, tools):
    # mocking a response
    response = {
        "role": "assistant",
        "tool_calls": [
            {
                "id": "123",
                "function": {"arguments": '{"a": 1,"b": 2}', "name": "add"},
                "type": "function",
            }
        ],
    }

    combined_messages = messages + [response]

    span = mlflow.get_current_active_span()
    set_span_chat_messages(span, combined_messages)
    set_span_chat_tools(span, tools)

    return response


call_chat_model(messages, tools)

trace = mlflow.get_last_active_trace()
span = trace.data.spans[0]

print("Messages: ", span.get_attribute(SpanAttributeKey.CHAT_MESSAGES))
print("Tools: ", span.get_attribute(SpanAttributeKey.CHAT_TOOLS))

次のステップ

これらの推奨されるアクションとチュートリアルを使用して、体験を続けます。

リファレンス ガイド

関連する概念に関する詳細なドキュメントを確認します。

  • トレースの概念 - データ モデルの背後にある高度な概念を理解する
  • ログ評価 - フィードバックと期待をトレースに添付する方法について説明します
  • トレースの削除 - トレースのライフサイクルとクリーンアップを管理する