Aller au contenu principal

Modéliser avec Axi

Qui peut le faire

Administrateurs disposant de la permission Modèles sémantiques, sur une offre incluant Axi.

Tout ce que vous faites à la main dans Paramètres → Espace de travail → Données — rédiger la description d'une table, nommer ses colonnes, déclarer une clé primaire ou étrangère, ajouter une mesure, masquer les colonnes ajoutées par votre outil de chargement — vous pouvez aussi le demander à Axi, depuis la section elle-même.

Axi n'enregistre jamais rien. Ses modifications arrivent dans le même brouillon non enregistré que votre propre saisie : chaque ligne qu'il a modifiée porte un point bleu dans la liste des colonnes, sa table aussi dans l'arbre, et Enregistrer le modèle reste la seule action qui écrit dans la couche sémantique. Tant que vous ne l'avez pas pressée, rien de ce qu'utilisent les graphiques, les widgets et les réponses n'a changé.

Comme rien n'est enregistré sans vous, Axi ne demande pas avant d'agir. Demandez une modification : elle est dans votre brouillon à la fin de la réponse, avec en une phrase ce qu'Axi a supposé — relisez-la, corrigez-la, ou retirez tout le lot avec Annuler. Il ne demande d'abord que lorsque votre demande peut se lire de deux façons, lorsque la modification remplacerait un texte que vous avez écrit vous-même, ou lorsque vos données contredisent ce que vous avez demandé.

Ouvrir Axi​

Ouvrez la section Tables, Métriques ou Relations d'une connexion et utilisez Demander à Axi en haut du rail de gauche, ou pressez Cmd/Ctrl + K. La fenêtre s'ancre en bas à droite de l'écran : le rail — son arbre des tables et son bouton Enregistrer — et la liste des colonnes restent visibles et cliquables pendant l'échange, et vous voyez le brouillon changer.

Échap la ferme. La fermer n'arrête pas Axi : une demande en cours va jusqu'au bout, et ses modifications arrivent quand même dans votre brouillon. La conversation vous suit entre les tables, les métriques et les relations, et il y a un historique par connexion — les boutons Nouvelle et historique sont dans l'en-tête de la fenêtre.

Axi sait toujours quelle table est ouverte et quelle colonne est sélectionnée ; les puces au-dessus du champ de saisie l'indiquent. Il voit aussi vos modifications non enregistrées, et répond donc sur ce qui est à l'écran plutôt que sur ce qui est stocké.

À côté de ces puces, un sélecteur indique ce qu'Axi regarde : Cette table, ou Toute la connexion. Voir Décrire une connexion entière.

Ce qu'Axi peut proposer​

Demandez avec vos mots. Par exemple :

  • « Décris cette table et ses colonnes » — une description pour la table, et des noms affichés pour les colonnes qui n'en ont pas.
  • « Masque les colonnes techniques » — les colonnes de service de votre outil de chargement (_fivetran_synced, _airbyte_ab_id, payload_raw) retirées des sélecteurs de champs.
  • « Ajoute une mesure qui somme amount » — une nouvelle mesure, nommée comme le reste du modèle.
  • « Le chiffre d'affaires ne doit compter que les commandes payées » — la règle métier inscrite dans la mesure elle-même ; voir plus bas.
  • « Crée une métrique de taux de conversion » — une métrique, vérifiée contre le moteur avant de vous être proposée.
  • « country contient des codes pays ISO » — le marquage géographique qui permet de dessiner une colonne sur une carte.
  • « created_at est la date principale » — l'axe temporel principal du modèle.
  • « id est la clé primaire, et customer_id pointe vers customers » — les clés, référence comprise, celle qui rend la jointure possible. Axi vérifie une clé sur vos données avant de la déclarer ; voir plus bas.
  • « order_tags est une table de liaison » — une clé qui joint dans les deux sens, pour que la table pointée puisse aussi grouper par les champs de celle-ci.

Les descriptions et les noms d'affichage que vous enregistrez ici ne restent pas dans cette section : c'est ce qu'Axi lit quand il répond aux questions sur un tableau de bord, en mode Lecture et dans l'Accueil, pour relier les mots de votre équipe à vos tables et à vos colonnes — voir Pourquoi c'est important pour Axi.

Deux choses qu'Axi ne fera pas. Il ne modifiera rien d'importé depuis dbt — cette définition appartient à votre projet dbt, et Axi vous le dit. Et il ne remplacera pas un texte que vous avez écrit : une description que vous avez saisie est laissée telle quelle, sauf si vous le redemandez explicitement.

La date principale et la carte​

Deux réglages décident de ce qu'une table peut faire dans un graphique, et ce sont les plus faciles à oublier :

  • La date principale — l'axe temporel principal. Tendances, filtres de date, par mois et comparaisons de périodes sur la table la suivent toutes ; une table qui a des dates mais pas de date principale ne peut pas être tracée dans le temps sans que quelqu'un choisisse une date à chaque fois.
  • La géographie d'une colonne qui désigne des pays, des États américains, des régions ou des départements français. Sans elle, aucune carte ne peut afficher la colonne.

Axi cherche les deux dès qu'il décrit ou configure une table, et les place dans le même lot : il choisit la date qui dit quand chaque ligne a eu lieu — la date de commande, pas celle du chargement — et lit les valeurs des colonnes qui semblent géographiques avant de les marquer avec l'identifiant qu'elles utilisent vraiment (un code ISO, un nom, un code INSEE…). Une colonne dont les valeurs ne figurent sur aucune carte, comme des régions commerciales, reste sans marquage. Quand la table ouverte n'a pas l'un ou l'autre, la fenêtre d'Axi vide le suggère : Définir la date principale de cette table, Déclarer les colonnes géographiques.

Pour traiter une connexion entière plutôt qu'une table, voir plus bas.

Mesures et métriques​

Une mesure dit comment une colonne s'agrège. Axi sait en écrire les parties faciles à rater et faciles à oublier :

  • Les conditions — « le chiffre d'affaires ne compte que les commandes payées ». La règle vit sur la mesure : tous les graphiques, composants et réponses construits dessus sont d'accord, et personne n'a à penser à ajouter un filtre.
  • La date qui la compte — une mesure est datée par la date principale de sa table, sauf indication contraire. « Compte le CA expédié à la date d'expédition, pas à la date de commande » la fixe sur une autre colonne.
  • Ne jamais sommer dans le temps — un solde ou un niveau de stock n'est pas la somme de ses mois. Demandez la dernière valeur de chaque période à la place, éventuellement par compte ou par magasin.

Une métrique est une définition métier — chiffre d'affaires, taux de conversion, CA MTD — et Axi en propose une quand vous le demandez. Dites ce qu'elle doit vouloir dire : « un taux de conversion : les achats sur les visites », « le chiffre d'affaires depuis le début du mois », « la marge, soit (CA − coûts) / CA », « le CA comparé au même mois l'an dernier ».

Deux choses se passent avant qu'une métrique n'arrive dans votre brouillon :

  • Elle est compilée avant d'arriver. La définition passe par la même vérification que celle affichée sur la page Métriques — se planifie-t-elle, par quelles tables peut-on ensuite la grouper, selon quelle date. Une métrique qui ne compile pas n'arrive jamais dans votre brouillon : elle revient sur la carte en ligne ignorée qui le dit, le reste du lot arrive quand même, et Axi corrige la définition.
  • Elle est rangée où elle appartient. Une métrique est stockée sur la table qui porte sa mesure, et Axi l'y place quelle que soit la table que vous aviez ouverte. La carte nomme la table à enregistrer.

Une métrique ajoutée par Axi est aussitôt dans votre brouillon, comme toute autre modification : elle figure dans la section Métriques avec son point bleu, l'entrée Métriques du volet la compte et porte aussi le point, et la page de la table sur laquelle elle est stockée la liste sous son nom. Voir sur la carte l'ouvre.

Axi écrit la mesure et la métrique d'un même geste, dans cet ordre — une métrique ne peut lire qu'une mesure qui existe, et la mesure n'a pas besoin d'être enregistrée d'abord. Demandez « le chiffre d'affaires » et Axi le crée avec la définition évidente, puis dit ce qu'il a supposé — commandes payées uniquement, hors taxes — pour que vous puissiez corriger, plutôt que de vous le demander avant.

Les métriques importées depuis dbt restent en lecture seule, comme tout ce que dbt possède.

Décrire une connexion entière​

Une connexion que personne n'a encore modélisée est le cas où Axi sert le plus, et elle a sa propre porte d'entrée. Ouvrez Axi sans rien demander : tant que l'essentiel de la connexion est vide, les premières suggestions portent sur la connexion plutôt que sur la table devant vous :

  • Configurer cette connexion — 3 tables sur 42 ont une description · 5 ont des clés
  • Décrire les 39 tables sans description
  • Configurer les clés de cette connexion — 12 colonnes ressemblent à des clés étrangères et ne joignent encore rien

Toutes trois lancent un balayage. Axi cherche les tables auxquelles il manque encore une description, une clé primaire, une date principale ou une clé étrangère, lit leurs colonnes, et les traite cinq à la fois, par ordre de nom — une carte de proposition par table, qui marque aussi au passage les colonnes géographiques qu'il trouve. Il vous dit ensuite ce qu'il reste ; la dernière carte du lot porte un bouton Continuer qui prend les cinq suivantes, en reprenant après la dernière table du lot, et taper « continue » fait la même chose.

Il ne se répète pas. Une table qu'il vient de décrire n'est plus sans description, même si vous n'avez pas encore enregistré : Axi voit votre brouillon, donc le lot suivant porte bien sur les tables suivantes. Une table qu'un lot n'a pas pu terminer — aucune colonne que vos données montrent unique, par exemple, ou une clé que ses valeurs ne confirment pas — ne revient pas non plus en tête de chaque lot : le balayage passe à la suite, et une fois terminé Axi nomme ce qui manque encore, et pourquoi. Ce que l'entrepôt déclare déjà compte aussi : une table qu'il décrit, ou une clé qu'il déclare, n'est pas un manque — et Axi n'écrit pas par-dessus une description de colonne venue de l'entrepôt.

Pointer Axi sur la connexion​

Le sélecteur au-dessus du champ de saisie indique normalement Cette table, et Axi répond sur ce que la page a ouvert. Passez-le sur Toute la connexion et Axi cesse complètement de regarder cette table : les puces se réduisent au nom de la connexion, les suggestions deviennent celles listées ci-dessus, et une demande comme « configure les clés étrangères de cette connexion » est traitée en balayant les tables qui en ont besoin plutôt que celle devant vous.

Le choix reste où vous l'avez mis pendant que vous passez d'une table à une métrique ou aux relations — un balayage qui se rétrécirait dès que vous cliquez sur Voir dans une proposition ne servirait à rien. Il revient à Cette table quand vous changez de connexion.

Une clé étrangère est un manque comme un autre. Une table peut avoir une description et une clé primaire et ne joindre à rien, parce que ses colonnes customer_id et store_id n'ont jamais été déclarées. Axi les compte comme manquantes et les balaye avec le reste — vérifiées sur vos données d'abord, comme toujours.

Les descriptions qu'il rédige pour un balayage suivent celles déjà présentes sur la connexion : même langue, même registre. S'il n'y en a aucune, il utilise la langue dans laquelle vous lui écrivez.

Les clés coûtent des requêtes

Un balayage qui déclare des clés vérifie chaque candidate sur vos données, dans une limite d'une vingtaine de vérifications par message. Sur BigQuery ce sont des analyses de colonnes facturées, plafonnées chacune à 10 Go ; sur Snowflake, elles s'exécutent sur l'entrepôt et facturent son temps — si cela compte, balayez d'abord les descriptions et demandez les clés quelques tables à la fois.

Sur une grande connexion​

Sur une connexion de plusieurs centaines de tables, Axi les connaît toujours toutes. Il voit en entier la table que vous avez ouverte, et chaque autre table en une ligne — sur une très grande connexion, les moins pertinentes seulement par ce qui leur manque, ou comptées par dataset. Il trouve les autres par ce qu'elles contiennent : demandez-lui la table des avis clients et il cherche dans les noms, les noms d'affichage et les descriptions de vos tables et de vos colonnes. Il sait aussi trouver quelle colonne contient une valeur que vous citez (« où sont les magasins de Lyon ? »), et vérifier comment deux tables se joignent — ou pourquoi elles ne se joignent pas — de la même façon que le fera chaque graphique.

Une table très large est montrée avec ses colonnes les plus utiles d'abord : celle que vous avez sélectionnée, les dates, les lieux, les clés et celles que votre équipe a décrites. Axi lit les autres par leur nom quand il en a besoin.

Enregistrer plusieurs tables d'un coup​

Un balayage laisse des modifications non enregistrées sur des tables que vous n'avez jamais ouvertes : le rail de gauche affiche donc un bouton Enregistrer 5 tables en bas. Il compte toutes les tables ayant des modifications non enregistrées, quelle qu'en soit l'origine — les propositions d'Axi comme votre propre saisie — et il est présent dans Tables, Métriques et Relations, car un brouillon n'appartient pas à la page où vous vous trouvez.

Un lot n'est pas tout ou rien. Chaque table est enregistrée séparément : si l'une d'elles a été modifiée par quelqu'un d'autre pendant votre travail, les autres sont tout de même enregistrées et Axiome nomme celle qui ne l'a pas été. Rechargez cette table pour voir la version actuelle, puis redemandez.

Les clés sont vérifiées avant d'être déclarées​

Une mauvaise description est une phrase malheureuse. Une mauvaise clé étrangère corrompt silencieusement toutes les jointures bâties dessus — Axi ne déclare donc pas une clé sur la foi de son nom. Avant d'en proposer une, il lit vos données :

  • Pour une clé primaire, il échantillonne jusqu'à 50 000 lignes de la colonne et compte combien de valeurs il a vues, combien étaient différentes, et combien étaient vides. Une clé dont les valeurs se répètent, ou qui est parfois vide, n'est pas une clé.
  • Pour une clé étrangère, il prend jusqu'à 10 000 valeurs distinctes de la colonne et compte combien d'entre elles existent dans la colonne visée. Tout ce qui n'atteint pas la totalité signifie que la jointure perdrait des lignes sans le dire.

Vous pouvez le suivre en direct : pendant qu'Axi travaille, chaque lecture terminée s'affiche dans la fenêtre — 50 000 lignes de orders échantillonnées, Vérification de customer_id face à customers.id… — un tour long n'est donc jamais un tour muet. Voir Découvrir Axi.

Ces chiffres apparaissent sous la modification sur la carte de proposition, et de nouveau dans l'inspecteur — 4 812 valeurs distinctes sur 4 812 lignes échantillonnées, 9 998 valeurs sur 10 000 échantillonnées trouvées dans customers.id. Ils viennent de la requête, pas d'Axi : il les lit pour décider, et ne peut ni les arrondir ni les inventer.

Ce sont des échantillons, pas des preuves. Une colonne qui semble unique sur 50 000 lignes peut encore se répéter à la dix-millionième : lisez-les comme un indice fort, et gardez le jugement pour vous.

Une clé étrangère peut viser une clé primaire qui n'existe que dans votre brouillon. Quand la table visée n'a pas encore de clé primaire, Axi la vérifie aussi et déclare les deux dans le même lot, la clé primaire d'abord — il n'y a rien à enregistrer entre les deux.

Une clé qu'Axi n'a pas vérifiée revient en gris sur la carte, marquée Pas encore vérifié sur vos données — dites « déclare-la quand même » et il le fera, en précisant dans sa réponse qu'il n'a pas regardé. Et une colonne qui ressemble à une clé pointant vers une table absente de cette connexion est signalée plutôt que proposée : Axi vous dit vers quoi elle semble pointer et s'arrête là, car une référence vers une table qu'Axiome ne voit pas ne deviendrait jamais une jointure.

La carte de proposition​

Chaque lot de modifications apparaît dans la conversation sous forme de carte, au-dessus de la réponse d'Axi :

  • Une ligne par modification, disant ce qui a changé et, en dessous, sur quoi elle repose — les chiffres d'une vérification de clé, Vérifié sur les données quand Axi a exécuté une requête, D'après les noms et les types quand il lit le schéma.
  • Voir ouvre la liste des colonnes et l'inspecteur sur la ligne concernée.
  • Les lignes ignorées, en gris, avec la raison — Géré par votre projet dbt, Un texte existe déjà, Déjà le cas, Pas encore vérifié sur vos données.
  • Annuler retire tout le lot du brouillon. Si vous avez modifié ce brouillon entre-temps, Axiome vous prévient : l'annulation remet le brouillon dans son état précédent, vos modifications ultérieures comprises.

Dans la liste des colonnes, chaque ligne ayant des modifications non enregistrées porte un point bleu à côté de son nom — que la modification vienne d'Axi ou de vous — et un groupe de champs imbriqués replié le porte dès que l'un de ses champs a changé : un lot qui a touché trois colonnes d'une table large se repère d'un coup d'œil. Dans l'inspecteur, ce qu'Axi a déposé dans le brouillon porte la mention Proposé par Axi. Les deux disparaissent à l'enregistrement du modèle — à ce moment-là, cela fait simplement partie du modèle.

Une carte d'une conversation rouverte n'est pas dans votre brouillon : elle affiche Pas dans ce brouillon, et propose Appliquer à nouveau.

Votre brouillon survit à la navigation​

Les modifications non enregistrées survivent désormais à la sortie de la section et au rechargement de l'onglet. À votre retour, Axiome les restaure et vous le signale.

C'est vrai pour un balayage entier : cinq tables de propositions survivent à un rechargement comme les modifications d'une seule.

Si le modèle a été enregistré entre-temps ailleurs — par un collègue, ou par vous dans un autre onglet — le brouillon périmé est abandonné plutôt que réappliqué par-dessus cet enregistrement, et la notification indique quelles tables sont concernées. Fermer l'onglet abandonne toujours le travail non enregistré.

Lire les données coûte des requêtes​

Axi échantillonne vos données avant d'affirmer quoi que ce soit à leur sujet, ce qui signifie de vraies requêtes sur votre entrepôt. Elles sont en lecture seule, plafonnées, et abandonnées au bout de dix secondes ; chaque clé candidate est vérifiée une fois par tour de conversation, dix au maximum par requête.

Sur BigQuery, elles sont facturées comme n'importe quelle requête : un échantillon scanne les colonnes qu'il lit. Une vérification de clé lit une colonne de la table — et une vérification de clé étrangère lit aussi, en entier, une colonne de la table visée, car une valeur absente d'un échantillon de la cible passerait pour introuvable alors qu'elle est simplement ailleurs. Vérifier dix clés sur une connexion large représente donc dix à vingt scans de colonne. Si cela compte pour vous, demandez à Axi de traiter une table à la fois plutôt que de balayer toute une connexion.

Sur Snowflake, elles s'exécutent sur l'entrepôt de la connexion, quatre vérifications de clés à la fois, et facturent son temps plutôt que les octets lus : un balayage réveille un entrepôt suspendu et le maintient en marche pendant ses vérifications (Ce que ça coûte).

Les vérifications de clés, comme la lecture des valeurs d'une colonne ou de son profil, sont des lectures de valeurs : sur BigQuery, chacune peut facturer au plus 10 Go, et celle qui facturerait davantage est refusée avant de s'exécuter, sans frais (Les lectures de valeurs). Une grande table partitionnée par date — ou une table que BigQuery n'accepte d'interroger qu'avec un filtre de date — est échantillonnée sur ses 30 derniers jours de données, et Axi le précise en donnant les chiffres. Une vérification de clé étrangère lit toujours en entier la colonne visée : quand cette table n'accepte que des requêtes filtrées par date, ou est trop grande pour être lue, la clé n'est pas vérifiée — Axi vous dit pourquoi, et ne la déclare que si vous le lui demandez.

📖 Métriques · La couche sémantique · Clés et jointures · Dimensions et mesures