Aller au contenu principal

Rechercher les traces par programmation

Recherchez et analysez les traces par programmation en utilisant mlflow.search_traces(). Cette fonction peut query les traces stockées dans les tables Unity Catalog, le serveur de suivi MLflow, ou les tables d'inférence. Utilisez l'argument locations pour spécifier où chercher ; experiment_ids est obsolète. Vous pouvez sélectionner des sous-ensembles de traces à analyser ou pour créer des datasets d'évaluation.

mlflow.search_traces() API

Python
def mlflow.search_traces(
experiment_ids: list[str] | None = None,
filter_string: str | None = None,
max_results: int | None = None,
order_by: list[str] | None = None,
extract_fields: list[str] | None = None,
run_id: str | None = None,
return_type: Literal['pandas', 'list'] | None = None,
model_id: str | None = None,
sql_warehouse_id: str | None = None,
include_spans: bool = True,
locations: list[str] | None = None,
) -> pandas.DataFrame | list[Trace]

mlflow.search_traces() vous permet de filtrer et de sélectionner des données selon quelques dimensions :

  • Filtrer par chaîne de query
  • Filtrer par emplacements : Expérimentation, exécution, modèle ou schéma Unity Catalog
  • Limiter les données : résultats max, inclure ou exclure des intervalles
  • Ajuster le format de la valeur de retour : format des données, ordre des données.

search_traces() renvoie soit un DataFrame pandas, soit une liste d'objets Trace, qui peuvent ensuite être analysés plus en détail ou remodelés en datasets d'évaluation. Consultez les détails du schéma de ces types de retour.

Consultez la documentation de l'APImlflow.search_traces() pour plus de détails.

remarque

MLflow managé par Databricks et MLflow OSS (outil/solution/technologie/plateforme open source) partagent la plupart de la syntaxe de query de recherche, mais présentent quelques différences au niveau des champs. Consultez Différences avec MLflow open source pour plus de détails.

mlflow.search_traces() paramètres

Catégorie

parameter: type

Description

Exemple

Filtrer par chaîne de requête

filter_string: str

Consultez la syntaxe des requêtes de recherche pour connaître les filtres et comparateurs pris en charge.

trace.status = 'OK' AND tag.environment = 'production'

Filtrer par emplacements

locations: list[str]

Cet argument peut être une liste d'ID d'expérimentation ou des emplacements catalog.schema Unity Catalog pour le filtrage. Utilisez ceci pour rechercher les traces stockées dans les tables d'inférence ou Unity Catalog.

['591498498138889', '782498488231546'] OU ['my_catalog.my_schema']

run_id: str

ID d'exécution MLflow.

35464a26b0144533b09d8acbb4681985

model_id: str

ID du modèle MLflow

acc4c426-5dd7-4a3a-85de-da1b22ce05f1

Limiter les données

max_results: int

Nombre maximal de traces (lignes) à renvoyer

100

include_spans: bool

Incluez ou excluez les portées des résultats. Les spans incluent les détails de la trace et peuvent rendre les tailles des résultats nettement plus grandes.

True

Format de la valeur de retour

order_by: list[str]

Consultez la syntaxe et les clés prises en charge.

["timestamp_ms DESC", "status ASC"]

return_type: Literal['pandas', 'list']

Cette fonction peut renvoyer un DataFrame pandas ou une liste d'objets Trace. Consultez les détails du schéma.

'pandas'

Obsolète

experiment_ids: list[str]

Utilisez locations à la place.

extract_fields: list[str]

Sélectionnez plutôt les champs du DataFrame ou des objets de trace renvoyés.

sql_warehouse_id: str

Utilisez plutôt la variable d’environnementMLFLOW_TRACING_SQL_WAREHOUSE_ID.

Catégorie

parameter: type

Description

Exemple

Filtrer par chaîne de requête

filter_string: str

Consultez la syntaxe des requêtes de recherche pour connaître les filtres et comparateurs pris en charge.

trace.status = 'OK' AND tag.environment = 'production'

Filtrer par emplacements

locations: list[str]

Cet argument peut être une liste d'ID d'expérimentation ou des emplacements catalog.schema Unity Catalog pour le filtrage. Utilisez ceci pour rechercher les traces stockées dans les tables d'inférence ou Unity Catalog.

['591498498138889', '782498488231546'] OU ['my_catalog.my_schema']

run_id: str

ID d'exécution MLflow.

35464a26b0144533b09d8acbb4681985

model_id: str

ID du modèle MLflow

acc4c426-5dd7-4a3a-85de-da1b22ce05f1

Limiter les données

max_results: int

Nombre maximal de traces (lignes) à renvoyer

100

include_spans: bool

Incluez ou excluez les portées des résultats. Les spans incluent les détails de la trace et peuvent rendre les tailles des résultats nettement plus grandes.

True

Format de la valeur de retour

order_by: list[str]

Consultez la syntaxe et les clés prises en charge.

["timestamp_ms DESC", "status ASC"]

return_type: Literal['pandas', 'list']

Cette fonction peut renvoyer un DataFrame pandas ou une liste d'objets Trace. Consultez les détails du schéma.

'pandas'

Obsolète

experiment_ids: list[str]

Utilisez locations à la place.

extract_fields: list[str]

Sélectionnez plutôt les champs du DataFrame ou des objets de trace renvoyés.

sql_warehouse_id: str

Utilisez plutôt la variable d’environnementMLFLOW_TRACING_SQL_WAREHOUSE_ID.

Syntaxe de query de recherche

L’argument filter_string utilise un langage de query de type SQL pour filtrer les traces. Les valeurs de chaîne doivent être placées entre guillemets simples (par exemple, « trace.status = 'OK' »), et les valeurs numériques ne doivent pas être citées (par exemple, trace.execution_time_ms > 1000). Combiner les conditions avec AND. L'opérateur OR n'est pas pris en charge.

Filtres et comparateurs pris en charge

Les champs et comparateurs suivants sont pris en charge sur MLflow géré par Databricks.

remarque

Les filtres marqués (UC only) ne sont pris en charge que pour les traces MLflow stockées dans Unity Catalog. Consultez Stocker les traces OpenTelemetry dans Unity Catalog.

Type de champ

Champs

Comparateurs

Exemple

Statut de la trace

trace.status

=, !=

trace.status = 'OK'

Tracer les horodatages

trace.timestamp_ms, trace.execution_time_ms, trace.end_time_ms (UC seulement)

=, !=, >, <, >=, <=

trace.end_time_ms > 1762408895531

ID de trace

trace.run_id

=

trace.run_id = 'run_id'

Champs de chaîne

trace.client_request_id (UC uniquement), trace.name

=, !=, LIKE, ILIKE, RLIKE

trace.name LIKE '%Generate%'

**Contenu des requêtes et des réponses** (UC uniquement)

trace.request, trace.response

=, !=, LIKE, ILIKE, RLIKE

trace.request LIKE '%weather%'

Nombre de jetons (UC uniquement)

trace.token_count

=, !=, >, <, >=, <=

trace.token_count > 1000

Invites liées

prompt

= (format : 'name/version')

prompt = 'qa-system-prompt/4'

**Nom, type et état de la portée** (UC uniquement)

span.name, span.type, span.status

=, !=, LIKE, ILIKE, RLIKE

span.type RLIKE '^LLM'

Attributs d'étendue OTel (UC uniquement)

span.attributes.<key>

=, !=, LIKE, ILIKE, RLIKE, IS NULL, IS NOT NULL

span.attributes.gen_ai.request.model = 'gpt-4'

Tags

tag.<key>

=, !=, LIKE, ILIKE, RLIKE, IS NULL, IS NOT NULL

Pour les traces MLflow stockées dans une expérimentation (pas dans Unity Catalog), seuls = et != sont pris en charge.

tag.environment = 'production'

Métadonnées

metadata.<key>

=, !=, LIKE, ILIKE, RLIKE, IS NULL, IS NOT NULL

Pour les traces MLflow stockées dans une expérimentation (pas dans Unity Catalog), seuls = et != sont pris en charge.

metadata.`mlflow.trace.user` = 'user_123'

Commentaires (UC uniquement)

feedback.<name>

=, !=, LIKE, ILIKE, RLIKE

feedback.rating = 'excellent'

Attentes (UC uniquement)

expectation.<name>

=, !=, LIKE, ILIKE, RLIKE

expectation.result = 'pass'

Type de champ

Champs

Comparateurs

Exemple

Statut de la trace

trace.status

=, !=

trace.status = 'OK'

Tracer les horodatages

trace.timestamp_ms, trace.execution_time_ms, trace.end_time_ms (UC seulement)

=, !=, >, <, >=, <=

trace.end_time_ms > 1762408895531

ID de trace

trace.run_id

=

trace.run_id = 'run_id'

Champs de chaîne

trace.client_request_id (UC uniquement), trace.name

=, !=, LIKE, ILIKE, RLIKE

trace.name LIKE '%Generate%'

**Contenu des requêtes et des réponses** (UC uniquement)

trace.request, trace.response

=, !=, LIKE, ILIKE, RLIKE

trace.request LIKE '%weather%'

Nombre de jetons (UC uniquement)

trace.token_count

=, !=, >, <, >=, <=

trace.token_count > 1000

Invites liées

prompt

= (format : 'name/version')

prompt = 'qa-system-prompt/4'

**Nom, type et état de la portée** (UC uniquement)

span.name, span.type, span.status

=, !=, LIKE, ILIKE, RLIKE

span.type RLIKE '^LLM'

Attributs d'étendue OTel (UC uniquement)

span.attributes.<key>

=, !=, LIKE, ILIKE, RLIKE, IS NULL, IS NOT NULL

span.attributes.gen_ai.request.model = 'gpt-4'

Tags

tag.<key>

=, !=, LIKE, ILIKE, RLIKE, IS NULL, IS NOT NULL

Pour les traces MLflow stockées dans une expérimentation (pas dans Unity Catalog), seuls = et != sont pris en charge.

tag.environment = 'production'

Métadonnées

metadata.<key>

=, !=, LIKE, ILIKE, RLIKE, IS NULL, IS NOT NULL

Pour les traces MLflow stockées dans une expérimentation (pas dans Unity Catalog), seuls = et != sont pris en charge.

metadata.`mlflow.trace.user` = 'user_123'

Commentaires (UC uniquement)

feedback.<name>

=, !=, LIKE, ILIKE, RLIKE

feedback.rating = 'excellent'

Attentes (UC uniquement)

expectation.<name>

=, !=, LIKE, ILIKE, RLIKE

expectation.result = 'pass'

Différences par rapport à MLflow OSS

La syntaxe des query de recherche sur MLflow géré par Databricks suit de près MLflow OSS, avec les différences suivantes :

Champ

MLflow géré par Databricks

OSS MLflow

Notes

trace.request, trace.response

Pris en charge (UC uniquement)

Non pris en charge

Utilisez ces champs pour filtrer le contenu sérialisé des requêtes et des réponses.

trace.token_count

Pris en charge (UC uniquement)

Non pris en charge

Filtrer les traces par nombre total de jetons.

span.attributes.<key>

Pris en charge (UC uniquement)

Non pris en charge

Filtrer les traces par les attributs d'étendue OpenTelemetry.

trace.text

Non pris en charge

Pris en charge (uniquement un magasin SQLAlchemy)

OSS expose trace.text pour la recherche en texte intégral dans le contenu des traces. Sur Databricks, utilisez trace.request et trace.response pour filtrer le contenu des traces à la place.

trace.prompt

Non pris en charge

Pris en charge (mappé au tag des prompts liés)

Sur Databricks, utilisez le champ prompt de niveau supérieur.

trace.request_id

Non pris en charge

Pris en charge

Sur Databricks, utilisez trace.client_request_id plutôt.

issue.id

Non pris en charge

Pris en charge

Filtrer les traces liées à un ID de problème spécifique.

Champ

MLflow géré par Databricks

OSS MLflow

Notes

trace.request, trace.response

Pris en charge (UC uniquement)

Non pris en charge

Utilisez ces champs pour filtrer le contenu sérialisé des requêtes et des réponses.

trace.token_count

Pris en charge (UC uniquement)

Non pris en charge

Filtrer les traces par nombre total de jetons.

span.attributes.<key>

Pris en charge (UC uniquement)

Non pris en charge

Filtrer les traces par les attributs d'étendue OpenTelemetry.

trace.text

Non pris en charge

Pris en charge (uniquement un magasin SQLAlchemy)

OSS expose trace.text pour la recherche en texte intégral dans le contenu des traces. Sur Databricks, utilisez trace.request et trace.response pour filtrer le contenu des traces à la place.

trace.prompt

Non pris en charge

Pris en charge (mappé au tag des prompts liés)

Sur Databricks, utilisez le champ prompt de niveau supérieur.

trace.request_id

Non pris en charge

Pris en charge

Sur Databricks, utilisez trace.client_request_id plutôt.

issue.id

Non pris en charge

Pris en charge

Filtrer les traces liées à un ID de problème spécifique.

Recherchez les spans OpenTelemetry tiers

Pour rechercher les traces ingérées à partir d'outils OpenTelemetry tiers tels que Langfuse, utilisez plutôt le préfixe span.attributes.*. Consultez Rechercher des traces par attributs d'étendue OTel.

Bonnes pratiques

Arguments par mot-clé

Utilisez toujours des arguments par mot-clé (nommés) avec mlflow.search_traces(). Il permet des arguments positionnels, mais les arguments de la fonction sont en évolution.

Bonnes pratiques : mlflow.search_traces(filter_string="trace.status = 'OK'")

Mauvaise pratique : mlflow.search_traces([], "trace.status = 'OK'")

filter_string pièges

Lorsque vous effectuez une recherche à l'aide de l'argument filter_string pour mlflow.search_traces(), n'oubliez pas de :

  • Utilisez les préfixes : trace., tag., ou metadata.
  • Utilisez des guillemets obliques si les noms de balises ou d'attributs contiennent des points : tag.`mlflow.traceName`
  • Utilisez uniquement des guillemets simples : 'value' pas "value"
  • Utilisez le timestamp Unix (millisecondes) pour l'heure : 1749006880539 et non des dates
  • Utiliser UNIQUEMENT ET : pas de prise en charge du OU

Consultez la syntaxe de query de recherche pour la liste complète des champs et opérateurs pris en charge.

Intégration de SQL Warehouse

mlflow.search_traces() peut utiliser en option un SQL Warehouse Databricks pour améliorer les performances sur les grands datasets de trace dans les tables d'inférence ou les tables Unity Catalog. Spécifiez l'ID de votre SQL Warehouse à l'aide de la variable d'environnement MLFLOW_TRACING_SQL_WAREHOUSE_ID.

Exécutez des queries de trace à l'aide d'un warehouse Databricks SQL pour des performances améliorées sur les grands datasets de trace :

Python
import os

os.environ['MLFLOW_TRACING_SQL_WAREHOUSE_ID'] = 'fa92bea7022e81fb'

# Use SQL warehouse for better performance
traces = mlflow.search_traces(
filter_string="trace.status = 'OK'",
locations=['my_catalog.my_schema'],
)

Pagination

mlflow.search_traces() renvoie les résultats en mémoire, ce qui fonctionne bien pour les ensembles de résultats plus petits. Pour gérer les résultats volumineux, utilisez MlflowClient.search_traces() car il prend en charge la pagination.

Ressources supplémentaires