Poser une question à ses données en français, et obtenir un chiffre juste
Un assistant IA branché sur l’entrepôt invente ses propres définitions. Ce projet explore une autre voie : ne lui exposer que des métriques gouvernées.
L’essentiel en trente secondes
- Les assistants IA calculent vite, mais avec leurs propres définitions.
- L’idée : ne leur donner accès qu’à des métriques définies une seule fois.
- Le moyen : une semantic layer, exposée par un serveur MCP.
01Le problème
Brancher un assistant IA directement sur un entrepôt de données semble simple. Il lit le schéma, écrit une requête, renvoie un chiffre. Le chiffre est souvent plausible. Il est parfois faux — et rien ne permet de le savoir : l’assistant a décidé lui-même de ce qu’était un « client actif ».
02Pourquoi c’est important
Une réponse fausse mais bien présentée est plus dangereuse qu’une absence de réponse. Dès qu’une décision s’appuie sur ces chiffres, c’est la confiance dans toute la donnée qui est en jeu.
03L’approche
Plutôt que d’ouvrir les tables à l’assistant, ne lui ouvrir que des métriques définies une fois pour toutes dans une semantic layer. L’assistant ne calcule plus : il choisit une métrique, un niveau de détail et une période.
04Les décisions techniquesTechnique
| Décision | Alternative écartée | Pourquoi |
|---|---|---|
| Exposer des métriques, pas des tables | Laisser l’assistant écrire du SQL | Une seule définition par indicateur |
| Passer par un serveur MCP | Une intégration sur mesure par assistant | Un protocole commun à plusieurs assistants |
| Une liste fermée de dimensions | Des dimensions libres | Éviter les combinaisons jamais testées |
05L’architectureTechnique
En un coup d’œil
- Question« Combien de clients actifs ce mois-ci ? »
- Assistant IAChoisit un outil plutôt que d’écrire du SQL
- Serveur MCPExpose une liste fermée de métriques
- Semantic layerUne seule définition de « client actif »
- EntrepôtModèles dbt testés et documentés
Détails d’implémentation : l’outil exposé par le serveur MCP
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("semantic-layer")
METRIQUES = {"clients_actifs", "ca_net", "panier_moyen"}
@mcp.tool()
def interroger_metrique(metrique: str, grain: str, periode: str) -> dict:
"""Renvoie une métrique gouvernée, jamais une table brute."""
if metrique not in METRIQUES:
raise ValueError(f"Métrique inconnue : {metrique}")
# client de la semantic layer : [à préciser]
return semantic_layer.query(metrique, grain=grain, periode=periode)06Les difficultés
Une question ambiguë reste ambiguë : « les ventes du mois », est-ce le mois civil ou les trente derniers jours ? L’assistant doit pouvoir demander une précision plutôt que choisir à la place de l’utilisateur. [Autres difficultés rencontrées : à documenter.]
07Résultats et limites
- Résultat mesuré
- [À documenter — aucun chiffre sans mesure]
- Limites connues
- [À documenter — aucun chiffre sans mesure]
- Ce qui reste à faire
- [À documenter — aucun chiffre sans mesure]
08Ce que j’en retiens
[Trois leçons, une phrase chacune.]