La data de bout en bout avec Microsoft Fabric

Lors de la conférence Build 2023, Microsoft a annoncé la sortie d’un nouveau produit dans le monde de la Data & AI. Si l’on excepte le rebranding de SQL Datawarehouse en Synapse Analytics et la sortie plus confidentielle de Data Explorer, il faut sans doute remonter à 2015 et l’arrivée de Power BI pour assister à un tel chamboulement dans l’offre de la firme de Redmond.

Dans ce premier article dédié à Microsoft Fabric, nous allons revenir sur les architectures cloud dites Modern Data Platform et Lakehouse pour bien comprendre le positionnement du produit. Ensuite, nous verrons en quoi ce nouveau service se différencie de l’existant, que ce soit Azure Synapse Analytics ou Power BI, et à qui il s’adresse.

Voici d’ores et déjà le nouveau logo avec lequel nous allons nous familiariser.

Modern Data Platform

L’architecture Modern Data Platform enchaine quatre étapes fondamentales : ingestion > stockage > calcul > exposition auxquelles peut s’ajouter une étape d’enrichissement grâce à l’intelligence artificielle (services cognitifs, machine learning).

https://learn.microsoft.com/en-us/azure/architecture/example-scenario/dataplate2e/data-platform-end-to-end?tabs=portal

Cette architecture, bien que très complète et performante dans le cloud, par son découpage des tâches, montre une certaine complexité, non pas dans l’utilisation des différents services mais bien dans la communication entre ces services (les fameuses flèches entre les logos !). Une première réponse a été apportée avec le produit Azure Synapse Analytics qui regroupe :

  • l’ingestion de données au travers d’un module similaire à Azure Data Factory
  • le calcul avec les moteurs SQL (dedicated ou serverless) et Spark
  • la gestion des données de streaming avec Data Explorer

Ce ne sont pas des formats propriétaires

Et vous, êtes-vous plutôt tables ou plutôt fichiers ? Il n’est plus nécessaire de choisir depuis l’essor des formats de fichiers orientés colonnes comme Apache Parquet ou Delta (ce dernier étant très fortement soutenu par la société Databricks). Plutôt que de dupliquer le contenu des fichiers dans des tables (avec tous les problèmes que cela implique : gestion des mises à jour, espace de stockage, ressources de calcul différentes…), il est beaucoup plus judicieux de travailler avec la logique d’une metastore qui contiendra uniquement les métadonnées nécessaires et autorisera l’accès aux données en langage SQL.

Microsoft Fabric est donc logiquement bâti autour de l’approche dite lakehouse et c’est même le nom du composant de stockage que l’on pourra déployer dans les espaces de travail (workspaces).

Ce n’est pas (que) Synapse Analytics

Avec Microsoft Fabric, le niveau d’intégration de ces différentes briques est maintenant complet, puisque le produit gère simultanément :

  • le stockage sous le nom de “OneLake” (il faut voir ici une similitude, au moins dans le nom, avec OneDrive)
  • l’ingestion avec toujours Data Factory (ses nombreux connecteurs, ses pipelines visuels)
  • le calcul, toujours avec Spark ou SQL, mais cette fois sans distinction dedicated ou serverless
  • la data science s’appuyant sur Azure Machine Learning
  • le stockage et calcul des données de streaming avec Synapse Data Explorer
  • l’exposition avec le service Power BI
  • l’ordonnancement avec un nouveau composant à venir, nommé Data Activator, que l’on peut rapprocher par exemple du rôle d’un service comme Azure Logic Apps

Un nouveau service Power BI ?

Microsoft Fabric est un produit de type Software as a Service (SaaS). Il n’y a donc pas de client à installer localement, tout se fait au travers d’un navigateur web. Si vous connaissez bien Power BI, vous savez qu’historiquement, deux actions ont longtemps été absentes de l’édition des rapports dans le navigateur : la modélisation et les calculs DAX. Ces opérations sont désormais réalisables dans l’interface en ligne.

Les utilisateurs de Power BI ont également dû longtemps choisir entre rapidité d’affichage (mode import) et donnée fraîche (mode Direct Query). Le mode hybride avec par exemple, la gestion de tables d’agrégats a pu permettre de trouver un compromis mais il fallait un niveau d’expertise assez avancée pour se lancer dans une telle approche. Aujourd’hui, Microsoft Fabric propose le concept de Direct Lake, qui, comme son nom l’indique, propose de travailler sur un mode “Direct Query” sur les sources disponibles dans OneLake.

Malgré l’existence des pipelines de déploiement (licence Premium exigée), l’approche DevOps dans Power BI a toujours été très laborieuse. Nous disposerons, avec Microsoft Fabric, d’un source versioning dans les repositories Azure DevOps (autres gestionnaires à venir sans doute prochainement). Reste à voir en pratique comment se mettra en place le travail collaboratif.

Autre nouveauté sur le plan de la gouvernance et de l’organisation des différents projets : la notion de domain. Les traditionnels groupes de travail (workspaces) peuvent maintenant être assignés à des domaines (sous-entendus fonctionnels), facilitant ainsi la structuration des éléments au sein du tenant.

Qui sont les personae ?

C’est bien toute la famille de la data qui va se réunir au sein de Microsoft Fabric !

Les data engineers vont trouver leur marque dans les menus issus de Synapse Analytics : ingestion de données, pipelines de transformation voire jobs Spark pour les plus codeurs.

Les data scientists manipuleront les environnements, les expériences et les modèles tout comme dans Azure Machine Learning.

Les data analysts connaissent déjà bien l’interface du service Power BI et n’auront plus à basculer du client desktop à l’interface web.

Enfin, les différents modules no code conviendront parfaitement aux “data citizen, qui pourront travailler sur l’ensemble de la chaîne sans avoir à coder.

Dans quelles langues parlons-nous ?

On peut parfois redouter le passage à un nouveau produit car celui-ci implique un temps d’apprentissage en particulier quand il est nécessaire d’appréhender de nouveaux langages. Avec Microsoft Fabric, nous sommes en terrain connu. Voyons cela en détail.

Data engineering (chargement des données)

Il existe quatre modes de chargement de la donnée au sein d’un lakehouse :

  • les dataflow (de génération 2) : no code ou langage M
  • les data pipelines (Data Factory) : no code voire low code si l’on considère les quelques formules qui peuvent être utilisées
  • les notebooks s’exécutant dans un environnement Apache Spark, avec les langages Scala, Python (API pyspark) ou Spark SQL
  • les shortcuts (no code) qui permettent de pointer vers une source déjà présente au sein de OneLake ou bien vers une source externe comme ADLS gen2 ou Amazon S3
Data Warehouse

Ici, et comme depuis un demi-siècle, le langage SQL est roi ! Nous sommes bien évidemment dans la version T-SQL de Microsoft, enrichi par quelques fonctions propres à Synapse Analytics.

Data Science

Nous sommes en terrain connu (et conquis !) pour les scientifiques de données : Scala, Python & R. Pour ces deux derniers, il sera nécessaire d’utiliser les API pyspark et SparkR pour profiter pleinement de la puissance du moteur de calcul distribué.

Streaming

L’intégration du produit Azure Data Explorer s’accompagne bien sûr du langage KustoQL (KQL) pour le chargement et l’interrogation des données.

Modélisation décisionnelles et mesures

Depuis l’arrivée des modèles tabulaires concurrençant les modèles multi-dimensionnels, le langage DAX s’est imposé pour manipuler la couche sémantique de la Business Intelligence. Ici, rien ne change.

OpenAI en copilote ?

Le partenariat entre la société OpenAI et Microsoft s’est renforcé en novembre 2022 et le succès planétaire de ChatGPT a montré tout le potentiels de l’IA générative pour les outils bureautiques (Microsoft Copilot à venir prochainement), comme dans le monde du développement (GitHub Copilot). Microsoft Fabric s’appuie également sur les fundation models tels que GPT ou Codex.

Vous connaissiez la création de visuel en langage naturel depuis plusieurs années dans Power BI ? Voici maintenant la création de rapport ! Le copilot demande une description en quelques mots des attentes en termes de reporting ou d’analyse et la page de rapport se génèrera automatiquement. Tout simplement magique ! Finalement, les spécifications ne sont-elles pas l’étape la plus importante d’un projet de tableau de bord ?

Vous pouvez retrouver plus de détails sur le blog officiel de Power BI.

En attendant la mise en pratique

En conclusion, et avant de passer véritablement aux tests de cette nouvelle plateforme, nous pouvons saluer l’effort de vision de bout en bout de la part de Microsoft, qui vise à fédérer pour les acteurs de la data dans l’entreprise autour d’une même source et d’une gouvernance unifiée.

N’oublions pas non plus le service Azure Databricks qui reste sans doute la plateforme d’entreprise pour les projets Big Data sur Azure, et qui dispose également d’une vision unifiée des usages de la donnée.

De nombreux éléments demandent maintenant à être vérifier dans la pratique :

  • le coût exact du produit à l’usage
  • la capacité à monter à l’échelle avec la volumétrie ou la vélocité requise
  • la collaboration entre les profils data (engineer, analytist, scientist…)
  • la simplicité de gouvernance (data discovery, data catalog, lineage…)
  • la possibilité de travailler dans des environnements multi-tenants
  • … (liste non exhaustive)

Mais que les utilisateurs se rassurent d’ores et déjà : il sera toujours possible d’obtenir les données dans Excel 🙂 !

Structurer une conversation en JSON à l’aide d’un prompt GPT-4

La donnée non structurée est partout autour de nous : texte, image, son, vidéo… rien de cela ne tient dans une base de données SQL ou NOSQL. Les grands modèles de langage comme GPT-4 sont une aubaine pour structurer les corpus de texte, et en particulier les conversations entre plusieurs personnes, desquelles il faudra extraire quelques informations bien structurées.

Nous allons ici tester différents prompts sur le dialogue ci-dessous, tenu dans un contexte bancaire, entre un client, une employée et un banquier. L’objectif principal sera de produire un fichier JSON avec plusieurs informations relatives au client.

L’employée : – Bonjour, que puis-je faire pour vous ?
Le client : – Bonjour Madame, je souhaite ouvrir un compte.
L’employée : – Bien, alors vous devez prendre rendez-vous avec un conseiller clientèle.
Le client : – Et dois-je apporter des papiers ?
L’employée : – Oui, il faut apporter un justificatif de domicile, une facture d’électricité ou de téléphone par exemple.
Le client : – Oui, et c’est tout ?
L’employée : – Non, il faut une pièce d’identité, carte d’identité ou passeport si vous êtes étranger.
Le client : – Bien. Et combien ça coûte ?
L’employée : – À la BG, c’est gratuit et il n’y a pas de somme minimum à verser.
Le client : – C’est parfait ! Est-ce que je peux prendre un rendez-vous maintenant ?
L’employée : – Bien sûr ! Pouvez-vous revenir demain à 15 h 30 ? Le client : – Oui, c’est possible. L’employée : – Très bien. Alors vous avez rendez-vous avec monsieur Didier Desmarais.
Le client : – D’accord, merci et au revoir.
L’employée : – Je vous en prie, au revoir.
Le conseiller : – Bonjour monsieur, je suis Didier Desmarais. Asseyez-vous.
Le client : – Bonjour monsieur, je m’appelle Frank Bayer et je viens pour ouvrir un compte.
Le conseiller : – Bien, alors, tout d’abord est-ce que vous avez les documents nécessaires ?
Le client : – Oui, j’ai tout apporté.
Le conseiller : – Parfait, je les photocopie et ensuite je vous explique tout.
Le conseiller : – Alors, nous allons ouvrir un compte courant pour les opérations de tous les jours, vous pouvez déposer ou retirer des espèces, faire virer votre salaire, verser des chèques ou émettre des chèques, recevoir ou émettre des virements, ou encore effectuer des retraits ou payer par carte. Vous recevrez un relevé de compte (la liste des opérations effectuées sur le compte pour une période déterminée) tous les mois (gratuit) ou tous les 15 jours (service payant).

Cette conversation est issue de ce site dédié à l’apprentissage de la langue française.

Nous débutons par un premier prompt qui vise à expliquer comment se structure le dialogue et quelles sont les informations recherchées.

Tu es un assistant IA qui aide à résumer un dialogue entre plusieurs personnes. Chaque personne sera citée en début de phrase et suivi par le signe :.
Tu produiras un fichier JSON contenant les informations suivantes : nom du client, prénom du client, date du rendez-vous, heure du rendez-vous, nom du conseiller et sous forme imbriquée, les documents fournis puis les services souscrits. Tu pourras ensuite répondre à des questions spécifiques sur la conversation.

Le premier résultat est assez satisfaisant mais il peut être amélioré. La date est donnée à “demain” et n’est donc pas contextualisée. Le modèle GPT-4 n’a pas pas accès à l’information de la date du jour, nous devons la préciser dans le prompt. Ensuite, les services souscrits sont trop détaillés. Nous allons donc fournir dans le prompt un exemple de la structure JSON attendue, en nous inspirant tout simplement de la première itération réalisée.

Tu es un assistant IA qui aide à résumer un dialogue entre plusieurs personnes. Chaque personne sera citée en début de phrase et suivi par le signe :.
Tu produiras un fichier JSON contenant les informations suivantes : nom du client, prénom du client, date du rendez-vous, heure du rendez-vous, nom du conseiller et sous forme imbriquée, les documents fournis puis les services souscrits. Tu pourras ensuite répondre à des questions spécifiques sur la conversation. Le fichier JSON devra être structuré de la sorte :
{
"nom_client": "PETON",
"prenom_client": "Paul",
"date_rendezvous": "2023-01-08",
"heure_rendezvous": "09h30",
"nom_conseiller": "Jérôme KERVIEL",
"documents_fournis": {
"justificatif_domicile": "facture d'électricité",
"piece_identite": "carte d'identité"
},
"services_souscrits": {
"compte_courant"}
}
La date de rendez-vous devra être interprétée en considérant que nous sommes aujourd'hui le 17 mai 2023.

C’est beaucoup mieux ! Nous avons résolu les deux problèmes identifiés.

Il reste une interprétation de la part du modèle quant aux documents fournis. Ceux-ci sont les documents cités par l’employée et nous ne savons pas si le client a fourni une facture d’électricité ou bien de téléphone. Il serait préférable que le modèle ne donne l’information que si celle-ci est réellement fiable.

Nous pouvons compléter le précédent prompt de la sorte :

Les documents fournis devront correspondre à ce que le client déclare et non ce que propose la banque. Si ce n'est pas le client qui donne l'information, indiquer "Ne Sait Pas" dans le fichier JSON.

Modifions légèrement le dialogue pour vérifier la robustesse de ce prompt.

Le client cite explicitement les pièces.
Le conseiller cite explicitement les pièces, sans ambiguïté.

Terminons par une série de questions / réponses sur le dialogue. Ici, le modèle GPT-4 est à son aise.

Cette démarche fonctionne ici très bien car le dialogue tient dans la limite des 32000 tokens autorisés par le modèle GPT-4. Pour des corpus de texte plus long, nous devrons utiliser une autre approche, qui sera détaillée dans de prochains articles sur ce blog.

Comment ChatGPT a résolu les énigmes KustoQL

Ou plus exactement, les modèles de langage GPT peuvent-ils réussir les défis de la Kusto Detective Agency, ce défi lancé par Microsoft en 2022, autour du langage KustoQL (KQL) et des clusters Azure Data Explorer ?

Il s’agit en effet d’un triple défi pour le modèle d’IA : résoudre une énigme en langage naturel et faire le lien avec le modèle de données, puis répondre en langage KQL.

Echauffement avec ChatGPT

La première épreuve consiste à calculer la somme d’une colonne numérique dans une table ne contenant que cette colonne.

Nous allons tout d’abord tester ChatGPT au travers du site de la société OpenAI, dans son accès public. C’est donc le modèle GPT-3.5 qui est utilisé.

Aucun problème pour ce robot ! Nous obtenons la bonne syntaxe et il suffit de la lancer sur le cluster provisionné.

Enigme “The rarest book is missing!

Nous poursuivons avec la première véritable énigme. Il s’agit d’identifier, dans une bibliothèque, l’étagère d’où a disparu le livre “De Revolutionibus Magnis Data”. Pour cela, nous pouvons utiliser des informations sur le poids des livres et le poids total de chaque étagère, à laquelle est rattachée la liste des livres qu’elle contient. Le prompt peut être composé de la sorte :

Here is an enigma 
""" This was supposed to be a great day for Digitown’s National Library Museum and all of Digitown.
The museum has just finished scanning more than 325,000 rare books, so that history lovers around the world can experience the ancient culture and knowledge of the Digitown Explorers.
The great book exhibition was about to re-open, when the museum director noticed that he can't locate the rarest book in the world:
"De Revolutionibus Magnis Data", published 1613, by Gustav Kustov.
The mayor of the Digitown herself, Mrs. Gaia Budskott - has called on our agency to help find the missing artifact.

Luckily, everything is digital in the Digitown library:
- Each book has its parameters recorded: number of pages, weight.
- Each book has RFID sticker attached (RFID: radio-transmitter with ID).
- Each shelve in the Museum sends data: what RFIDs appear on the shelve and also measures actual total weight of books on the shelve.

Unfortunately, the RFID of the "De Revolutionibus Magnis Data" was found on the museum floor - detached and lonely.
Perhaps, you will be able to locate the book on one of the museum shelves and save the day?
"""
Complete the following code to resolve the enigma.
"""
.execute database script <|
// Create table for the books
.create-merge table Books(rf_id:string, book_title:string, publish_date:long, author:string, language:string, number_of_pages:long, weight_gram:long)
// Import data for books
// (Used data is utilzing catalogue from https://github.com/internetarchive/openlibrary )
.ingest into table Books ('https://kustodetectiveagency.blob.core.windows.net/digitown-books/books.csv.gz') with (ignoreFirstRecord=true)
// Create table for the shelves
.create-merge table Shelves (shelf:long, rf_ids:dynamic, total_weight:long) 
// Import data for shelves
.ingest into table Shelves ('https://kustodetectiveagency.blob.core.windows.net/digitown-books/shelves.csv.gz') with (ignoreFirstRecord=true)
"""

ChatGPT se lance alors dans un commentaire de code.

A la fin de la réponse, nous apprenons juste que les données pourraient nous permettre de résoudre l’énigme…

GPT-4 à la rescousse

Nous allons donc utiliser la version suivante du modèle GPT : GPT-4 32k ! Pour cela, nous utiliserons le playground du service Azure OpenAI.

Avec un prompt similaire à celui fourni à ChatGPT, voici la réponse obtenue.

La structure de la réponse est intéressante : le modèle d’AI explique sa démarche, propose un code KQL et ajoute une explication de ce code.

Malheureusement, ce code n’est pas fonctionnel et nous obtenons un message d’erreur.

Essayons tout simplement de copier-coller ce message d’erreur dans le chat.

Le modèle d’IA réagit et corrige son code. Celui-ci est maintenant valide mais ne renvoit pas de ligne, nous n’obtenons donc pas la réponse recherchée. Nous le signifions d’emblée dans la conversation et rappelons l’objectif de la recherche.

Cette fois-ci, le raisonnement semble plus évolué et le code plus structuré. Pour autant, celui-ci n’est toujours pas valide. Nous allons guider le modèle en lui donnant la marche à suivre.

Ca y est ! Nous avons maintenant un code valide et surtout… la bonne réponse !

Même si le résultat est bon, la démarche a pu paraître laborieuse et a nécessité une reformulation assez explicite de l’énigme. Nous allons voir s’il est possible d’être plus efficace en tunant le modèle.

Prompt engineering

Le modèle de conversation peut être amélioré en donnant un message système initial, suivi d’un ou plusieurs exemples (one or few-shot-learning).

Voici le prompt fourni.

You are an AI assistant who helps solve puzzles. The statement of the puzzle will be given after the [ENIGMA] tag. The data available to solve the puzzle is loaded using the Microsoft KustoQL (KQL) language. The loading code will be given after the [KQL] tag. You will detail your reasoning by commenting the KQL code produced.

L’exemple fourni est tout simplement le premier calcul proposé pour obtenir la somme d’une colonne et la réponse obtenue sous ChatGPT.

Voici maintenant la première réponse du modèle d’IA, lors de la soumission du prompt reformulé de la manière suivante :

[ENIGMA]  
This was supposed to be a great day for Digitown’s National Library Museum and all of Digitown.  
The museum has just finished scanning more than 325,000 rare books, so that history lovers around the world can experience the ancient culture and knowledge of the Digitown Explorers.  
The great book exhibition was about to re-open, when the museum director noticed that he can't locate the rarest book in the world:  
"De Revolutionibus Magnis Data", published 1613, by Gustav Kustov.  
The mayor of the Digitown herself, Mrs. Gaia Budskott - has called on our agency to help find the missing artifact.  
&nbsp;  
Luckily, everything is digital in the Digitown library:  
- Each book has its parameters recorded: number of pages, weight.  
- Each book has RFID sticker attached (RFID: radio-transmitter with ID).  
- Each shelve in the Museum sends data: what RFIDs appear on the shelve and also measures actual total weight of books on the shelve.  
&nbsp;  
Unfortunately, the RFID of the "De Revolutionibus Magnis Data" was found on the museum floor - detached and lonely.  
Perhaps, you will be able to locate the book on one of the museum shelves and save the day?  
[KQL]  
.execute database script <|  
// Create table for the books  
.create-merge table Books(rf_id:string, book_title:string, publish_date:long, author:string, language:string, number_of_pages:long, weight_gram:long)  
// Import data for books  
// (Used data is utilzing catalogue from https://github.com/internetarchive/openlibrary )  
.ingest into table Books ('https://kustodetectiveagency.blob.core.windows.net/digitown-books/books.csv.gz') with (ignoreFirstRecord=true)  
// Create table for the shelves  
.create-merge table Shelves (shelf:long, rf_ids:dynamic, total_weight:long)   
// Import data for shelves  
.ingest into table Shelves ('https://kustodetectiveagency.blob.core.windows.net/digitown-books/shelves.csv.gz') with (ignoreFirstRecord=true)  

La logique semble bonne mais aucune ligne ne ressort. En regardant de plus près, la valeur de 10 grammes comme différence de poids semble trop restrictive. Nous pouvons en faire part au bot.

Cette fois-ci, c’est bon ! Le prompt engineering aura donc montré son efficacité.

En conclusion, il manque vraisemblablement une information pour que le modèle GPT-4 donne la bonne réponse du premier coup : une exploration des données qui aurait montré qu’il existe une marge d’erreur entre la somme du poids des livres et le poids total de l’étagère. Les Data Scientists ont donc encore un rôle à jouer mais pour combien de temps ?