- Introduction : le texte non structuré, angle mort du Data Warehouse
- Les 7 fonctions AI intégrées
- Setup : charger AdventureWorks dans Fabric
- Scénario 1 : Analyse de sentiment et classification des commandes
- Scénario 2 : Extraction d'entités structurées (ai_extract + OPENJSON)
- Scénario 3 : Catalogue de produits multilingue
- Scénario 4 : Recommandations cross-sell avec ai_generate_response
- Pipeline complet : Gold table enrichie
- Performance et limitations
- Pourquoi ça change la donne pour les Data Engineers
01. Introduction : le texte non structuré, angle mort du Data Warehouse
En tant que Data Engineers, nous passons l'essentiel de notre temps à structurer, nettoyer et transformer des données. Mais il existe une catégorie de données que nous avons historiquement évitée dans nos warehouses : le texte non structuré. Avis clients, tickets de support, notes CRM, descriptions libres... Ils contiennent tous des insights métier précieux, mais en extraire la valeur nécessitait traditionnellement des notebooks Python, des bibliothèques NLP ou des API AI externes.
Cela vient de changer. Microsoft Fabric propose désormais des fonctions AI intégrées directement dans le Data Warehouse et le SQL Analytics Endpoint. Vous pouvez analyser le sentiment, classifier du texte, extraire des entités, résumer, traduire et même corriger la grammaire, le tout en pur T-SQL. Pas de notebook Spark, pas d'endpoint Azure OpenAI à configurer, pas d'infrastructure à gérer.
Dans cet article, je vous présente ces fonctions en utilisant la base de données AdventureWorks, un dataset que chaque utilisateur Fabric peut charger en quelques minutes. Tous les exemples sont immédiatement reproductibles dans votre propre workspace.
02. Les 7 fonctions AI intégrées
| Fonction | Usage | Syntaxe |
|---|---|---|
ai_analyze_sentiment |
Détecter le sentiment (positive/negative/mixed/neutral) | ai_analyze_sentiment(<text>) |
ai_classify |
Classifier du texte dans des catégories fournies | ai_classify(<text>, 'cat1', 'cat2', ...) |
ai_extract |
Extraire des entités sous forme d'objet JSON | ai_extract(<text>, 'entity1', 'entity2', ...) |
ai_summarize |
Résumer du texte | ai_summarize(<text>) |
ai_translate |
Traduire du texte (de, en, fr, es, it, el, pl, sv, fi, cs) | ai_translate(<text>, 'fr') |
ai_fix_grammar |
Corriger la grammaire | ai_fix_grammar(<text>) |
ai_generate_response |
Générer une réponse à partir d'un prompt custom | ai_generate_response(<prompt>, <data>) |
Ces fonctions appellent Azure OpenAI sous le capot, mais vous n'avez rien à provisionner. C'est intégré au runtime de Fabric. Vitesse de traitement : 20 à 100 lignes par seconde.
03. Setup : charger AdventureWorks dans Fabric
Pour reproduire les exemples de cet article, vous aurez besoin de trois éléments :
- Créer une SQL Database dans Fabric et charger le sample AdventureWorks LT
- Créer un Warehouse dans le même workspace
- Copier les tables dans le Warehouse avec
CREATE TABLE AS SELECT(car les AI Functions ne fonctionnent que dans le Warehouse, PAS dans la SQL Database)
Important : les AI Functions ne sont disponibles que dans le Warehouse et le SQL Analytics Endpoint. Elles ne fonctionnent PAS dans une SQL Database Fabric. Vous devez copier les tables dans un Warehouse.
CREATE TABLE dbo.SalesOrderHeader
AS SELECT * FROM [AdventureWorksLT].SalesLT.SalesOrderHeader;
CREATE TABLE dbo.Customer
AS SELECT * FROM [AdventureWorksLT].SalesLT.Customer;
CREATE TABLE dbo.Product
AS SELECT * FROM [AdventureWorksLT].SalesLT.Product;
CREATE TABLE dbo.ProductDescription
AS SELECT * FROM [AdventureWorksLT].SalesLT.ProductDescription;
CREATE TABLE dbo.ProductModel
AS SELECT * FROM [AdventureWorksLT].SalesLT.ProductModel;
CREATE TABLE dbo.ProductModelProductDescription
AS SELECT * FROM [AdventureWorksLT].SalesLT.ProductModelProductDescription;
Par défaut, AdventureWorks ne contient pas de commentaires sur les commandes (les champs Comment sont NULL). Ajoutons des commentaires réalistes pour nos tests :
UPDATE dbo.SalesOrderHeader
SET Comment = CASE SalesOrderID % 6
WHEN 0 THEN 'Shipping was too slow, package arrived damaged. Very disappointed with the service.'
WHEN 1 THEN 'Great experience! The bike arrived on time and in perfect condition. Will order again.'
WHEN 2 THEN 'Price seems too high compared to competitors. Please review your pricing policy.'
WHEN 3 THEN 'URGENT: Need this order delivered before Friday for a corporate event. Please rush!'
WHEN 4 THEN 'Product quality is excellent. The frame is lightweight and durable. Highly recommend.'
WHEN 5 THEN 'Wrong color received. I ordered red but got blue. Need a replacement ASAP.'
END;
04. Scénario 1 : Analyse de sentiment et classification des commandes
Le problème : les commentaires des commandes sont stockés en texte libre. Personne ne les lit de manière systématique, aucune tendance n'est détectée et les plaintes urgentes se noient dans le volume.
Avec trois fonctions AI dans une seule requête, nous pouvons analyser le sentiment, classifier la catégorie et résumer chaque commentaire :
SELECT
s.SalesOrderID,
s.OrderDate,
c.CompanyName,
s.Comment,
ai_analyze_sentiment(s.Comment) AS sentiment,
ai_classify(s.Comment,
'shipping', 'product quality', 'pricing',
'urgent request', 'general feedback', 'other') AS category,
ai_summarize(s.Comment) AS summary
FROM dbo.SalesOrderHeader s
INNER JOIN dbo.Customer c ON s.CustomerID = c.CustomerID
WHERE s.Comment IS NOT NULL;
Résultat : chaque commentaire de commande est analysé en sentiment, catégorie et résumé, en seulement 3,7 secondes
Résultat clé
- Une seule requête. Chaque commentaire reçoit un sentiment (positive/negative), une catégorie (shipping, pricing...) et un résumé en une ligne.
- Connectez le résultat à Power BI via Direct Lake pour des tableaux de bord en temps réel sur le sentiment client.
- Aucun notebook Python, aucune API externe. Tout se fait en T-SQL natif.
05. Scénario 2 : Extraction d'entités structurées (ai_extract + OPENJSON)
Le texte libre contient des informations structurables : type de problème, niveau d'urgence, action demandée. Traditionnellement, il faudrait des regex complexes ou du NLP custom. Avec ai_extract, l'AI comprend le sens sémantique du texte et extrait directement les entités souhaitées.
SELECT
s.SalesOrderID,
s.Comment,
extraction.*
FROM dbo.SalesOrderHeader s
CROSS APPLY OPENJSON(
ai_extract(s.Comment,
'issue_type', 'urgency', 'requested_action', 'delivery_preference')
) WITH (
issue_type VARCHAR(200),
urgency VARCHAR(50),
requested_action VARCHAR(500),
delivery_preference VARCHAR(200)
) AS extraction
WHERE s.Comment IS NOT NULL;
ai_extract transforme du texte libre en colonnes structurées : issue_type, urgency, requested_action, delivery_preference
Le pattern CROSS APPLY OPENJSON est la clé pour exploiter ai_extract. La fonction retourne du JSON, OPENJSON le décompose en colonnes relationnelles. C'est le bridge entre l'AI et le monde relationnel.
06. Scénario 3 : Catalogue de produits multilingue
Internationaliser un catalogue de produits nécessitait traditionnellement des traducteurs humains ou des API de traduction externes. Avec ai_translate, une seule requête SQL génère le catalogue en plusieurs langues :
SELECT TOP 10
pm.ProductModelID,
pm.Name AS ModelName,
pd.Description AS description_en,
ai_translate(pd.Description, 'fr') AS description_fr,
ai_translate(pd.Description, 'de') AS description_de,
ai_translate(pd.Description, 'es') AS description_es
FROM dbo.ProductModel pm
INNER JOIN dbo.ProductModelProductDescription pmpd
ON pm.ProductModelID = pmpd.ProductModelID
INNER JOIN dbo.ProductDescription pd
ON pmpd.ProductDescriptionID = pd.ProductDescriptionID
WHERE pmpd.Culture = 'en';
Descriptions de produits traduites automatiquement en français, allemand et espagnol, en 7,4 secondes pour 10 produits
07. Scénario 4 : Recommandations cross-sell avec ai_generate_response
ai_generate_response est la fonction la plus flexible. Elle permet d'envoyer un prompt personnalisé avec des données contextuelles. Ici, nous l'utilisons pour générer des suggestions de ventes croisées à partir des descriptions de produits :
SELECT TOP 5
p.ProductID,
p.Name,
pd.Description,
ai_generate_response(
'Based on this product description, suggest 2 complementary product categories a customer might also need. Return as a short comma-separated list.',
pd.Description
) AS cross_sell_suggestions
FROM dbo.Product p
INNER JOIN dbo.ProductModelProductDescription pmpd
ON p.ProductModelID = pmpd.ProductModelID
INNER JOIN dbo.ProductDescription pd
ON pmpd.ProductDescriptionID = pd.ProductDescriptionID
WHERE pmpd.Culture = 'en';
ai_generate_response génère des recommandations cross-sell pertinentes à partir des descriptions produits
08. Pipeline complet : Gold table enrichie
Combinons maintenant toutes les fonctions AI dans une seule requête pour créer une table Gold enrichie, prête pour Power BI. C'est le pattern Medallion Architecture appliqué à l'enrichissement par l'IA :
CREATE TABLE dbo.gold_orders_enriched
AS
SELECT
s.SalesOrderID,
s.OrderDate,
c.CompanyName,
c.FirstName + ' ' + c.LastName AS CustomerName,
s.TotalDue,
s.Comment,
ai_summarize(s.Comment) AS comment_summary,
ai_analyze_sentiment(s.Comment) AS comment_sentiment,
ai_classify(s.Comment,
'shipping', 'product issue', 'pricing',
'urgent', 'positive feedback', 'other') AS comment_category,
ai_translate(s.Comment, 'fr') AS comment_fr,
ai_translate(s.Comment, 'es') AS comment_es
FROM dbo.SalesOrderHeader s
INNER JOIN dbo.Customer c ON s.CustomerID = c.CustomerID
WHERE s.Comment IS NOT NULL;
Table Gold enrichie : sentiment, catégorie, résumé, traductions FR et ES. Prête pour Power BI via Direct Lake
Résultat
- Une seule requête. Données brutes en entrée, intelligence structurée en sortie.
- Table Gold prête pour Power BI via Direct Lake : zéro copie, performance maximale.
- Sentiment, catégorie, résumé et traductions dans 5 nouvelles colonnes matérialisées.
09. Performance et limitations
| Aspect | Détail |
|---|---|
| Vitesse | 20 à 100 lignes par seconde (appels API AI sous le capot) |
| Limite texte | 15 KB maximum par appel. Au-delà, retourne NULL |
| Gestion NULL | Toujours utiliser ISNULL(ai_function(text), original_value) |
| Responsible AI | Le contenu inapproprié est filtré par Azure et retourne NULL |
| Régions | Disponible dans les régions supportant Azure OpenAI Service |
| Prérequis | Activation au niveau workspace + capacité F2 minimum |
Pour les grands volumes, matérialisez les résultats dans des tables de staging plutôt que d'exécuter les fonctions AI dans chaque SELECT. Le pattern CREATE TABLE ... AS SELECT est votre meilleur allié.
10. Pourquoi ça change la donne pour les Data Engineers
Avant les AI Functions, traiter du texte non structuré dans un Data Warehouse nécessitait :
- Exporter les données vers un notebook Python
- Configurer un endpoint Azure OpenAI
- Écrire du code de transformation avec des appels API
- Gérer les rate limits, retries et erreurs
- Recharger les résultats dans le warehouse
Maintenant, c'est une seule instruction T-SQL. N'importe quel développeur SQL peut le faire.
Il ne s'agit pas de remplacer les Data Scientists, mais de donner aux Data Engineers les outils pour gérer 80 % des cas d'usage de traitement de texte sans quitter leur zone de confort.
Conclusion
Les AI Functions dans Fabric Data Warehouse comblent le fossé entre l'analytique structurée et le texte non structuré. Les fonctions sont encore en preview, mais la valeur est claire : le texte non structuré n'est plus une boîte noire dans votre warehouse.
Avec sept fonctions couvrant le sentiment, la classification, l'extraction, le résumé, la traduction, la correction grammaticale et la génération de réponses, le tout en pur T-SQL, Microsoft démocratise l'accès à l'IA pour chaque professionnel de la donnée.
Vous avez testé les AI Functions dans Fabric ? Partagez vos cas d'usage en commentaire sur LinkedIn !