はじめに
DatabricksでMLflowエクスペリメントを開くと、エクスペリメント名の隣に「エクスペリメントの種類」として「GenAIアプリとエージェント」または「機械学習」が表示されます。この種類によって画面構成が切り替わり、GenAIなら概要・トレース・セッション・評価といった可観測性中心のビュー、機械学習ならラン中心のビューになります。
普段何気なく使っていますが、ふと「この種類ってどういう条件で決まっているんだろう?」と気になりました。トレースをログしたらGenAI扱いになる気がするものの、トレーニングランと混在していたらどうなるのか、明示的に指定できるのか、意外とはっきり答えられません。
この分類ルール、実は現時点のDatabricks公式ドキュメントには明記されていません。ただ、DatabricksのMLflow UIはOSSのMLflowとコードベースを共有しているので、ソースコードを読めば挙動を確認できます。本記事ではその判定ロジックを整理し、実際に動作検証した結果をまとめます。
なお、以下はOSSのUI実装 (執筆時点のmasterブランチ) に基づく挙動であり、将来変更される可能性がある点にはご留意ください。
結論: 正体はエクスペリメントタグ
エクスペリメントの種類は、エクスペリメントタグ mlflow.experimentKind で管理されています。UIはこのタグの値を見てビューの構成を切り替えており、専用のメタデータフィールドがあるわけではありません。
タグの値は以下のenumとして定義されています (constants.ts)。
| 値 | 表示 |
|---|---|
genai_development |
GenAIアプリとエージェント |
custom_model_development |
機械学習 |
genai_development_inferred |
GenAIアプリとエージェント (推論による分類) |
custom_model_development_inferred |
機械学習 (推論による分類) |
finetuning |
ファインチューニング (機械学習系) |
classification / regression / forecasting / automl
|
AutoML系 (機械学習系) |
no_inferred_type |
推論不能 (タイプなし) |
_inferred サフィックス付きの値は、後述する「UIが中身から推論した結果」を表します。どのkindがどちらのワークフロー (ビュー) に対応するかは ExperimentKindUtils.ts の getWorkflowTypeForExperimentKind で定義されており、GenAI側に行くのは genai_development と genai_development_inferred の2つだけ、それ以外 (ファインチューニングやAutoML系を含む) はすべて機械学習側です。
タグ未設定時の推論ロジック
では、タグが設定されていないエクスペリメントはどう扱われるのでしょうか。この場合、UIがエクスペリメントの中身を見てタイプを推論します。ロジックは useInferExperimentKind.tsx にあり、要点を抜粋すると次のとおりです。
if (containsTraces) {
return ExperimentKind.GENAI_DEVELOPMENT_INFERRED;
}
if (containsRuns) {
return ExperimentKind.CUSTOM_MODEL_DEVELOPMENT_INFERRED;
}
return ExperimentKind.NO_INFERRED_TYPE;
つまり判定は以下の優先順位で行われます。
- トレースが1件でもあれば → GenAIアプリとエージェント
- トレースがなく、ランがあれば → 機械学習
- どちらもなければ → 推論なし (UIでタイプ選択を促される)
冒頭の疑問「トレース入っていればGenAI & Agentsになるの?」への答えはYesで、しかも containsTraces が先に評価されるため、トレースとトレーニングランが混在している場合もGenAI扱いになります。ここが一番迷いやすいポイントかもしれません。たとえばファインチューニングのランと推論時のトレースを同じエクスペリメントに入れると、意図せずGenAIビューで開かれることになります。
推論された種類は、エクスペリメント名横のセレクタから「GenAIアプリとエージェント」⇔「機械学習」に手動で切り替えることもできます。切り替え時は内部的に同じタグをset tagのAPIで更新しているだけです。
エクスペリメント作成時にタイプを指定する
推論に任せず最初から固定したい場合、mlflow.experimentKind は普通のエクスペリメントタグなので、create_experiment の tags 引数で指定できます。
import mlflow
exp_id = mlflow.create_experiment(
"my-genai-app",
tags={"mlflow.experimentKind": "genai_development"},
)
既存のエクスペリメントに後から設定 (変更) する場合はこちらです。
from mlflow import MlflowClient
client = MlflowClient()
client.set_experiment_tag(exp_id, "mlflow.experimentKind", "custom_model_development")
mlflow. プレフィックスのタグは慣習的にはシステム予約ですが、エクスペリメントタグでは設定がブロックされることなく通ります。MLflow 3.4.0のローカル環境で動作確認済みです。
exp = mlflow.get_experiment(exp_id)
print(exp.tags)
# {'mlflow.experimentKind': 'genai_development'}
タグを明示的に設定しておくと中身からの推論はスキップされるため、「トレースもランも両方ログするが機械学習ビューで固定したい」といったケースで有効です。
なお、UIからエクスペリメントを作成する場合も入り口でタイプが決まります。エクスペリメントページの「GenAIアプリとエージェント」から作成すればGenAI kind、AutoML (予測・分類・回帰) やファインチューニングとして作成すれば対応する機械学習系のkindがタグに設定されます。詳細はMLflowエクスペリメントのドキュメントを参照してください。
動作検証
実際にDatabricksワークスペースで確認してみます。タグを設定せずにエクスペリメントを作成し、トレースだけをログしてみます。
import mlflow
mlflow.set_experiment("/Shared/experiment-kind-test")
@mlflow.trace
def my_app(question: str) -> str:
return f"回答: {question}への回答です"
my_app("MLflowとは何ですか?")
エクスペリメントを開くと、種類が「GenAIアプリとエージェント」と表示され、概要やトレースを中心としたGenAIビューになっていることが確認できます。
続けて同じエクスペリメントにトレーニングランをログしても、トレース優先のルールによりGenAI扱いのままであることが確認できます。トレースの基本についてはMLflow Tracingのドキュメントを参照してください。
まとめ
- エクスペリメントの種類の実体はタグ
mlflow.experimentKind - タグ未設定時はUIが中身から推論し、トレースがあればGenAI、なければランの有無で機械学習と判定
- トレースとランが混在している場合はトレース優先でGenAI扱い
-
create_experiment(tags={...})やset_experiment_tagで明示的に指定・変更でき、エクスペリメント名横の種類セレクタからも切り替え可能 - 判定ルールは公式ドキュメント未記載のため、OSSのUI実装に基づく挙動として理解しておくのが安全
普段意識しないところですが、仕組みがわかるとエクスペリメントが意図しない種類のビューで開かれたときも慌てずに済みますね。

