À trancherRéf. DWH-ARCH-01Destinataires : équipe technique TerraCrew

Fiche d'arbitrage

Quel entrepôt de données
pour alimenter l'agent TEIA

L'agent lit son contexte dans la base de production et y écrit sa télémétrie, sans couche intermédiaire, sans rétention et sans corpus versionné. Quatre architectures sont proposées pour y remédier. Ce document sert à en choisir une.

Décision attendue

Retenir une des quatre options et ouvrir sa phase 1, ou nommer explicitement l'information manquante qui empêche de trancher et la date à laquelle elle sera disponible.

01 — La décision

Les quatre options, en une page

Toutes poursuivent le même objectif : sortir l'agent et l'analytique du moteur de production, et donner à TEIA un contexte gouverné. Elles diffèrent sur ce qu'elles coûtent, ce qu'elles exigent de l'équipe, et ce qu'elles rendent possible dans trois ans.

OptionPrincipeCe qu'elle donne à l'agentMise en œuvreExploitation
A1Socle PostgreSQL dédiéL'entrepôt là où l'équipe sait déjà opérerDes vues de service stables pour le contexte4 à 6 semaines0,3 ETP en régime établi
A2Lakehouse ouvertLe bucket qui existe déjà devient l'entrepôtLe corpus RAG devient un artefact versionné3 à 5 mois0,8 à 1 ETP la première année, 0,5 ensuite
A3Entrepôt managé BigQueryLà où vivent déjà Earth Engine et les journauxLe contexte géospatial devient une requête3 à 6 semaines0,2 ETP — aucune infrastructure à exploiter
A4Trajectoire hybrideLe socle d'abord, le lakehouse quand le volume le prouveLes vues de service arrivent en phase 16 semaines pour la phase 1, puis par paliers0,3 ETP en phase 1, 0,6 en phase 2

Proposition de l'auteur

A4 — trajectoire hybride, phase 1 ouverte immédiatement

La phase 1 d'A4 est A1 : six semaines, aucune technologie nouvelle, et l'agent lit son contexte ailleurs que dans la base de production. Elle livre au passage le chiffre que personne n'a aujourd'hui : le coût réel d'une conversation TEIA. La phase 2 ne s'ouvre que si la mesure de volumétrie le justifie.

La réserve est claire : si l'équipe sait déjà que la gouvernance du corpus RAG est le sujet de l'année, A4 fait perdre six mois et il faut aller directement en A2.

À arbitrer en séance

  1. 1Le corpus RAG est-il un chantier de cette année, ou de la suivante ? La réponse départage A4 et A2 à elle seule.
  2. 2Les données personnelles peuvent-elles sortir de l'infrastructure maîtrisée ? Si non, A3 sort de la discussion.
  3. 3Accepte-t-on de différer la décision de huit semaines, le temps de mesurer la volumétrie, en engageant quand même la phase 1 ?
02 — Le besoin

Ce que l'agent lit, ce qu'il écrit

TEIA est aujourd'hui le plus gros producteur de données de la plateforme et son plus gros consommateur de contexte. Les deux se font sur la même instance PostgreSQL que la facturation.

POSTGRESQL — INSTANCE UNIQUEBase métier38 tables · AlembicBase postgres10 tables · aucune migrationcollab_db7 tables · SQL idempotentbusiness-service180 endpointsanalysis-processing58 endpointscolab-serviceHocuspocus / YjsMongoDB11 collections · 0 schémaRedis 7broker + cache + pub/subObject storage4 préfixesÉcrits par les services, hors de PostgreSQLMetabaseconnexion SQL directeCONNEXION DIRECTE — AUCUNE COUCHE SÉMANTIQUECROISSANCE NON BORNÉEyjs_updatesapi_logscheckpointslangchain_pg_embeddinglogs (Mongo)0 politique de rétention
Relevé du recensement : une seule instance PostgreSQL sert les trois backends, et Metabase interroge la base métier en connexion directe.

Lecture Ce que l'agent consomme

  • Référentiel métier

    base métier · via la gateway KrakenD

    zones, projets, produits, quotas, cultures

    Recomposé appel par appel à chaque tour de conversation.

  • Corpus RAG — 4 collections de connaissance

    pgvector · langchain_pg_embedding

    ee_recipes, agricultural_docs, reglementation, documentation — CLIP ViT-B/32, 512 dimensions

    Indexation manuelle, aucune source versionnée : impossible de rejouer un index.

  • Documents de l'utilisateur

    pgvector · 2 collections + bucket pdf-analyse

    generic-report-documents et -raw-documents, chunks de 700 caractères, texte et image

    Nommage divergent des autres collections, cycle de vie lié à un appel de suppression applicatif.

  • Référentiel administratif malgache

    fichiers plats dans l'image Docker

    region.zip, district.zip, commune.zip, fkt.zip, resultats_final.xlsx

    Relu du disque à CHAQUE appel, résolution spatiale par balayage GeoPandas en mémoire.

  • Catalogue Earth Engine

    Google Earth Engine

    1 ImageCollection propriétaire + une vingtaine de datasets publics

    Identifiants codés en dur dans les recettes Python : une dépréciation Google casse silencieusement une analyse.

Écriture Ce que l'agent produit

  • chats

    MongoDB · chat_archives

    1 document par conversation, tableau messages non borné

    Plafond MongoDB de 16 Mo par document. Aucun index déclaré.

  • checkpoints, checkpoint_blobs, checkpoint_writes

    PostgreSQL · base postgres

    mémoire d'exécution LangGraph, permet de reprendre un agent interrompu par un job GEE

    Croissance très forte, aucune rétention, aucune interface ne les expose.

  • llm_call_logs

    PostgreSQL · base postgres

    1 ligne par appel de modèle, 4 index, JSONB, écriture non bloquante

    La table la mieux conçue du parc — mais créée hors migration, et sans rétention.

  • quota_usage_logs puis usages

    base métier · via la gateway

    consommation déclarée puis facturée, clé d'idempotence unique

    Trois comptages de tokens coexistent sans réconciliation.

  • reports, sections, artifacts

    PostgreSQL · base postgres

    sorties de rapport, y compris des binaires stockés en base

    Hors de toute migration : un déploiement neuf ne crée pas ces tables.

Cinq points bloquants, relevés par le recensement

  • RestitutionMetabase interroge la base métier en connexion directe, sans couche sémantique. Toute requête analytique s'exécute sur le moteur qui sert l'agent et la facturation.
  • Coût de l'agentTrois comptages de tokens divergents — llm_call_logs, chats.messages[], quota_usage_logs. Aucun n'est désigné comme faisant foi : le coût réel d'une conversation TEIA n'est pas connu.
  • RétentionAucune politique de rétention, sur aucun magasin. Dix objets croissent sans borne, dont les trois tables de checkpoints de l'agent.
  • Gouvernance de schémaQuatre tables de production vivent hors de toute migration, dont les trois qui portent les rapports générés par l'agent.
  • Référentiel géographiqueLe référentiel administratif est relu du disque à chaque appel. C'est le chemin d'accès le plus fréquent de l'agent, et le moins optimisé.
03 — Socle commun

Ce qui ne dépend pas de l'option retenue

Les quatre architectures portent le même modèle et exposent la même couche de service. C'est ce qui rend la décision réversible : changer de plateforme coûte une migration, changer de modèle coûte un projet.

01

Contexte métier

Un jeu de vues stables — zone, projet, quota restant, catalogue produit, seuils agronomiques — au lieu d'une recomposition par appels successifs. Le contrat est la vue, pas la table.

rafraîchi par lot, latence de la minute

02

Corpus versionné

La source du corpus RAG vit dans l'entrepôt ; l'index pgvector devient une projection reconstructible. Réindexer cesse d'être une opération manuelle à risque.

une version par publication de corpus

03

Télémétrie réconciliée

llm_call_logs désigné comme mesure technique de référence, quota_usage_logs comme mesure facturée, l'écart publié comme métrique. Le compteur de chats devient un affichage dérivé.

une ligne par appel, agrégée par conversation

04

Base d'évaluation

Les traces conservées deviennent un jeu de test : coût par conversation, taux de reprise après job GEE, part des réponses appuyées sur le RAG. Sans entrepôt, ces chiffres n'existent pas.

constituée en continu, requêtée à la demande

Le modèle en étoile, dérivé des dix domaines du recensement

Sept tables de faits, huit dimensions conformes. dim_date et dim_user sont partagées par tous les faits : c'est ce qui rend comparables la consommation, la facturation et le coût des modèles.

dim_datejour, saison agricoledim_userSCD2, pseudonymiséedim_projectworkspacedim_zonegéométrie 4326dim_producturi, hiérarchie cataloguedim_pricingSCD2, tarif figédim_crop20 seuils agronomiquesdim_serviceservice émetteurfct_analysis_usage5 dim.fct_quota_declaration4 dim.fct_llm_call4 dim.fct_order_line4 dim.fct_user_activity4 dim.fct_api_call3 dim.fct_zone_footprint4 dim.
Survolez un fait ou une dimension pour isoler ses liens. Le nombre affiché sur chaque fait est celui des dimensions qu'il appelle.

Les faits et leur grain

  • fct_analysis_usageUne ligne par analyse lancée
  • fct_quota_declarationUne ligne par appel POST /quota/usage
  • fct_llm_callUne ligne par appel de modèle de langage
  • fct_order_lineUne ligne par ligne de commande
  • fct_user_activityUne ligne par action utilisateur
  • fct_api_callUne ligne par appel HTTP
  • fct_zone_footprintUne ligne par zone et par jour de validité

Les dimensions

  • dim_dateUne ligne par jour
  • dim_userUne ligne par version d'utilisateur (SCD2)
  • dim_projectUne ligne par espace de travail
  • dim_zoneUne ligne par zone, versionnée
  • dim_productUne ligne par produit unitaire
  • dim_pricingUne ligne par version de tarif (SCD2)
  • dim_cropUne ligne par culture
  • dim_serviceUne ligne par service émetteur

Ce qui reste dehors, volontairement

  • checkpoints, checkpoint_blobs, checkpoint_writesMémoire d'exécution des agents LangGraph. Volumineuse, sans valeur analytique : ce qui compte est déjà dans llm_call_logs. À purger en production, pas à répliquer.
  • yjs_updatesDeltas CRDT bruts, rendus redondants par yjs_documents une fois appliqués. L'entrepôt consomme yjs_snapshots, pas le journal de deltas.
  • artifacts.data_bytesBinaires stockés en base. Seules les métadonnées entrent dans l'entrepôt ; le binaire doit d'abord rejoindre l'object storage.
  • langchain_pg_embedding.embeddingVecteurs CLIP 512 dimensions. Le vecteur reste dans pgvector où il sert ; seules les métadonnées de chunk entrent dans l'entrepôt.
  • logs (Mongo) — parameters et responseCharge utile complète d'appel, non rédigée, porteuse de données personnelles. Elle ne doit pas être dupliquée : la rédaction précède toute réplication.
04 — Les options

Quatre architectures, détaillées

Chaque fiche suit la même structure pour être comparable ligne à ligne : schéma de flux, pile technique justifiée, apport pour l'agent, règles d'exploitation, ce qui est résolu et ce qui ne l'est pas.

A1

Socle PostgreSQL dédié

L'entrepôt là où l'équipe sait déjà opérer

Mise en œuvre
4 à 6 semaines
Infrastructure
Une VM 4 vCPU / 16 Go + disque SSD
Charge humaine
0,3 ETP en régime établi

Le recensement décrit 55 tables sur une seule instance PostgreSQL et 11 collections MongoDB. À cette échelle, la première cause de douleur n'est pas le volume : c'est que l'analytique et la production partagent le même moteur. Cette architecture ne change pas de technologie, elle change de frontière.

Lots planifiés — 4 à 24 exécutions par jour
SOURCESCAPTUREENTREPÔTTRANSFORMATIONRESTITUTIONBoucle de retour — la télémétrie de l'agent (llm_call_logs, chats, checkpoints) redevient une sourcePostgreSQL prod55 tables · 3 bases logiquesMongoDB11 collectionsObject storagebucket pdf-analyseRéplication logiquepgoutput · publication dédiéedlt / AirbyteMongo → Postgres, incrémentalMétadonnées objetsmanifeste, pas les binairesschéma rawcopie fidèle, immuableschéma stagingtypage, UUID → texteschéma martsétoile, tables partitionnéesdbt-coretests, snapshots SCD2Dagster / cronordonnancement + alertesMetabasebranché sur marts seulementContexte agent TEIAvues de service, quotas, zonesdbt docsdictionnaire de données généré
flux continu lot planifié requête de lecture pilotage et gouvernance boucle de retour

La pile, couche par couche

  • 01

    Capture PostgreSQL

    Réplication logique native (pgoutput) sur une publication dédiée

    Aucune brique tierce, aucune charge de requêtage sur la production, et la latence descend à la seconde. La publication liste explicitement les tables : les binaires d'artifacts et les vecteurs pgvector restent dehors.

  • 02

    Capture MongoDB

    dlt ou Airbyte en incrémental sur _id / last_update

    Les 11 collections n'ont pas de schéma. On aplatit à l'ingestion, pas dans le BI. chats.messages[] est éclaté en une table fille dès le staging.

  • 03

    Moteur

    PostgreSQL 16 + PostGIS, instance séparée, 4 vCPU / 16 Go

    PostGIS est indispensable : zones porte l'assiette de la facturation à l'hectare. Une instance séparée rend enfin possible un index analytique qui n'a pas de sens en production.

  • 04

    Volumétrie

    Partitionnement déclaratif mensuel sur api_logs, activity_log, llm_call_logs, usages

    Les quatre tables à croissance forte deviennent purgeables par DETACH PARTITION, en O(1). C'est le mécanisme qui rend la politique de rétention applicable sans script de suppression ligne à ligne.

  • 05

    Transformation

    dbt-core, trois couches raw / staging / marts

    Les tests unique, not_null et relationships rattrapent en aval les contraintes absentes en amont. Les snapshots donnent l'historique SCD2 que pricings n'a pas.

  • 06

    Restitution

    Metabase reconnecté aux seuls schémas marts

    C'est la correction du défaut principal relevé par le recensement : le schéma transactionnel cesse d'être une interface publique.

Pour l'agent TEIA

Des vues de service stables pour le contexte

L'agent lit quotas, zones, catalogue produit et historique de consommation dans un jeu de vues rafraîchies par lot, au lieu de recomposer le contexte par appels successifs à la gateway. Latence de la minute : suffisant pour un tour de conversation, insuffisant pour un affichage temps réel.

Le coût d'une conversation devient un chiffre

Le mart de réconciliation confronte llm_call_logs, quota_usage_logs et chats.messages[]. Le coût réel d'une conversation TEIA cesse d'être une estimation, et l'écart entre consommé et facturé devient une métrique suivie.

Le corpus RAG reste hors périmètre

Les six collections pgvector continuent d'être indexées à la main, sans source versionnée. C'est la principale limite d'A1 du point de vue de l'agent : elle règle la facturation et l'observabilité, pas la gouvernance du contexte.

Règles d'exploitation

Le contrat d'ingestion est une liste blanche

La publication PostgreSQL et la configuration dlt énumèrent les objets répliqués. Une nouvelle table de production n'entre pas dans l'entrepôt par accident : elle y entre par une revue.

Rien ne se transforme à la capture

raw est une copie fidèle, horodatée, jamais modifiée. Toute correction se rejoue depuis raw. C'est ce qui rend une erreur de modélisation réparable sans re-synchroniser la production.

La conversion UUID → texte se fait une fois

Le glossaire du recensement documente le piège : Mongo stocke str(uuid), PostgreSQL stocke un UUID natif. La conversion appartient au staging, jamais à la requête de l'analyste.

Résolu

  • RestitutionMetabase quitte le schéma transactionnel. Les requêtes analytiques n'entrent plus en concurrence avec la facturation.
  • Facturationusages.result est laissé en production : l'entrepôt n'ingère que les colonnes de facturation. L'agrégation cesse de balayer la charge utile.
  • Coût de l'agentUn mart de réconciliation confronte llm_call_logs, quota_usage_logs et chats.messages[] et publie l'écart. Le désaccord devient une métrique suivie.
  • RétentionLe partitionnement mensuel rend la purge instantanée. La production peut enfin purger : l'historique vit dans l'entrepôt.
  • Documentationdbt docs génère le dictionnaire de données à chaque exécution. Il ne peut plus diverger du modèle.

Non résolu

  • Plafond volumétrique réel. langchain_pg_embedding, checkpoints et yjs_updates croissent sans borne ; les faire entrer dans un PostgreSQL analytique déplace le problème sans le résoudre.
  • Pas de séparation stockage / calcul : une requête lourde et un rafraîchissement dbt se disputent la même machine.
  • Pas de palier d'archivage bon marché. Au-delà de 12 à 18 mois d'historique, le disque devient le poste de coût.
  • Le non structuré reste dehors. Les documents, images et vecteurs de la plateforme ne sont pas analysables ici.

À retenir si

  • Le volume analytique utile reste sous quelques centaines de gigaoctets.
  • L'équipe data compte deux à trois personnes, déjà compétentes en PostgreSQL.
  • La priorité du trimestre est de rendre les chiffres de facturation fiables, pas d'ouvrir un nouveau chantier.

À écarter si

  • Si l'ambition à douze mois inclut l'analyse des documents, des images et des embeddings.
  • Si la croissance des tables qualifiées de TRÈS FORTE est déjà mesurée en dizaines de gigaoctets par mois.

L'option qui donne le plus de valeur par semaine investie. Elle corrige le défaut le plus coûteux du recensement — l'analytique sur le moteur de production — sans rien apprendre de nouveau à l'équipe.

A2

Lakehouse ouvert

Le bucket qui existe déjà devient l'entrepôt

Mise en œuvre
3 à 5 mois
Infrastructure
Stockage objet au gigaoctet + 2 à 3 nœuds de calcul
Charge humaine
0,8 à 1 ETP la première année, 0,5 ensuite

Le recensement décrit déjà un stockage objet en production, un backend interchangeable GCS ou MinIO, et une chaîne d'ingestion mature. Le lakehouse ne crée pas un nouveau magasin : il donne un format de table, un catalogue et un moteur SQL à celui qui existe.

Flux continu — latence de l'ordre de la minute
SOURCESCAPTURELAKEHOUSECALCULRESTITUTIONBoucle de retour — la télémétrie de l'agent (llm_call_logs, chats, checkpoints) redevient une sourcePostgreSQL prodWAL logiqueMongoDBchange streamsObject storagerasters, documents, imagesEarth Engineexports d'analyseDebeziumCDC transactionnelRedpanda / Kafkajournal rejouableLecture en placeaucune copie du binaireBronzebrut append-only, IcebergArgentconformé, dédupliqué, typéOrmarts en étoileCatalogue Nessieversions, branches, tagsdbt-duckdbtransformation par lotsTrinoSQL fédéré, ad hocMaintenance Icebergcompaction, expirationMetabaseconnecteur TrinoNotebooksDuckDB en local, lecture directeContexte agent TEIAcorpus RAG + features, versionnés
flux continu lot planifié requête de lecture pilotage et gouvernance boucle de retour

La pile, couche par couche

  • 01

    Format de table

    Apache Iceberg sur Parquet

    Transactions ACID, évolution de schéma sans réécriture, et surtout time travel : l'expiration de snapshots transforme la politique de rétention en déclaration, pas en script de purge.

  • 02

    Catalogue

    Nessie (ou Polaris) — branches et tags sur les données

    Une transformation se teste sur une branche du lakehouse, comme un correctif se teste sur une branche Git. Pour une équipe sans environnement de pré-production data, c'est déterminant.

  • 03

    Capture

    Debezium sur le WAL PostgreSQL et les change streams MongoDB

    Un seul mécanisme pour les deux magasins, sans requêter la production. Le journal Kafka rend le rejeu possible : une erreur de modélisation se corrige sans re-synchroniser la source.

  • 04

    Calcul par lots

    DuckDB via dbt-duckdb

    Sur des jeux de quelques dizaines de gigaoctets, un seul nœud DuckDB fait le travail d'un cluster Spark pour une fraction du coût et de la complexité. Spark n'entre dans l'équation qu'au-delà.

  • 05

    Calcul interactif

    Trino

    Un seul point SQL pour Metabase, capable d'interroger Iceberg et de fédérer au besoin la production PostgreSQL pour les référentiels très petits.

  • 06

    Non structuré

    Les documents, images et métadonnées d'embeddings restent où ils sont, lus en place

    Le lakehouse est le seul modèle où les 4 préfixes du bucket deviennent analysables sans recopie. Les vecteurs restent dans pgvector : on n'indexe que leurs métadonnées.

Pour l'agent TEIA

Le corpus RAG devient un artefact versionné

ee_recipes, agricultural_docs, reglementation et documentation cessent d'être des index alimentés à la main. La table Iceberg devient la source de vérité, l'index pgvector une projection reconstructible à tout moment.

Deux versions de contexte deviennent comparables

Le time travel permet de rejouer l'indexation à une version connue du corpus. On peut mesurer l'effet d'un ajout de documents sur la qualité des réponses, au lieu de le supposer.

Les documents de l'utilisateur entrent dans le même plan

Les quatre préfixes du bucket, déjà validés par la chaîne d'ingestion la plus mature de la plateforme, sont lus en place : texte, images extraites et tableaux HTML relèvent du même catalogue que le reste.

Règles d'exploitation

Bronze est append-only et ne ment jamais

On y écrit ce que la source a émis, avec l'horodatage de capture. Aucune correction, aucune suppression. C'est la seule couche qu'on ne rejoue pas, parce qu'elle EST le rejeu.

MERGE INTO sur clé fonctionnelle

L'idempotence de l'argent prolonge ce que la plateforme fait déjà bien : l'empreinte de fichier à l'ingestion et la clé d'idempotence de la facturation. Le lakehouse hérite de ces clés au lieu d'en inventer d'autres.

La maintenance est un travail planifié, pas une option

Compaction des petits fichiers, expiration des snapshots, purge des fichiers orphelins. Un lakehouse sans maintenance devient lent en quelques semaines, et c'est le mode d'échec le plus courant.

Résolu

  • RestitutionMetabase interroge Trino. La production ne voit plus jamais une requête analytique.
  • RétentionL'expiration de snapshots Iceberg exprime la rétention en jours, par table, de façon déclarative. Le tier froid coûte le prix du stockage objet.
  • Facturationusages.result trouve sa place naturelle : la charge utile JSON vit en bronze, la table de facturation en or reste étroite.
  • Référentiel géographiqueLe référentiel administratif malgache devient une table Iceberg versionnée par valid_from / valid_to, au lieu de cinq fichiers relus du disque à chaque requête.
  • Non structuréLes 4 préfixes du bucket et les exports Earth Engine entrent dans le périmètre analytique sans être recopiés.

Non résolu

  • Quatre à cinq briques nouvelles à exploiter : Debezium, un bus, un catalogue, un moteur de requête, un ordonnanceur. Chacune a son mode de panne.
  • La compétence Iceberg et Trino est rare et chère. Sans elle, le lakehouse devient un dépôt de fichiers Parquet lents.
  • Latence de l'ordre de la minute, pas de la seconde. Ce qui convient à l'analytique, pas à un affichage temps réel.
  • Le vrai coût n'est pas l'infrastructure, c'est le temps d'ingénierie de la première année.

À retenir si

  • La croissance des tables qualifiées de TRÈS FORTE est confirmée et mesurée.
  • Les documents, images et métadonnées d'embeddings doivent devenir analysables.
  • L'indépendance vis-à-vis d'un fournisseur est un critère explicite.

À écarter si

  • Si personne dans l'équipe n'a déjà exploité un lakehouse en production.
  • Si la première restitution attendue est à moins de deux mois.

L'architecture qui correspond à la trajectoire réelle des données décrites par le recensement : des tables à croissance non bornée, du non structuré volumineux, et un besoin de rétention déclarative. Elle demande une compétence que l'équipe n'a pas encore.

A3

Entrepôt managé BigQuery

Là où vivent déjà Earth Engine et les journaux

Mise en œuvre
3 à 6 semaines
Infrastructure
0,02 $/Go/mois de stockage + le calcul à l'octet scanné
Charge humaine
0,2 ETP — aucune infrastructure à exploiter

Le recensement est explicite : Earth Engine, Cloud Logging et, selon le déploiement, le stockage objet sont déjà chez Google. Cette architecture ne fait pas entrer un fournisseur, elle assume celui qui est là et supprime la question de l'exploitation.

Capture continue, calcul à la requête
SOURCESCAPTUREBIGQUERYTRANSFORMATIONRESTITUTIONBoucle de retour — la télémétrie de l'agent (llm_call_logs, chats, checkpoints) redevient une sourcePostgreSQL prod55 tablesMongoDB11 collectionsCloud Storagebucket pdf-analyseCloud Loggingx-correlation-id propagéDatastreamCDC managé, sans agentDataflowchange streams MongoBigLaketables externes, zéro copieLog sinkexport natifJeu landingréplique CDC bruteJeu coreconformé, partitionné, clustériséJeu martétoile + vues autoriséesPolicy tagsmasquage des colonnes personnellesDataform / dbtSQL versionné, assertionsBigQuery GISST_Contains indexéGarde-fous de coûtquotas, réservationsMetabase / Lookersur les vues autoriséesRetour Earth Enginezones enrichiesContexte agent TEIAvues autorisées + Vertex
flux continu lot planifié requête de lecture pilotage et gouvernance boucle de retour

La pile, couche par couche

  • 01

    Capture

    Datastream PostgreSQL → BigQuery, en réplication continue

    Service managé branché sur la réplication logique, sans agent à exploiter et sans bus intermédiaire. C'est le chemin le plus court entre la production et une table interrogeable.

  • 02

    Non structuré

    Tables externes BigLake sur le bucket

    Les 4 préfixes deviennent interrogeables en SQL sans être recopiés. Le document reste dans le bucket, seul son index entre dans BigQuery.

  • 03

    Géospatial

    BigQuery GIS, type GEOGRAPHY

    C'est la réponse directe au référentiel en fichiers plats : il devient une table indexée, et la résolution région / district / commune / fokontany devient un ST_CONTAINS au lieu d'un balayage GeoPandas en mémoire à chaque appel.

  • 04

    Gouvernance de coût

    Partitionnement obligatoire, clustering, quotas par utilisateur, réservations

    Le modèle facture l'octet scanné. Une table de journaux non partitionnée et un tableau de bord qui se rafraîchit toutes les minutes suffisent à faire dérailler la facture. La discipline se met en place le premier jour, jamais après.

  • 05

    Confidentialité

    Policy tags sur les colonnes personnelles, vues autorisées, région europe-west

    Le masquage au niveau colonne est natif : un analyste voit usages sans jamais voir l'e-mail. La localisation du jeu de données est un choix de création, irréversible ensuite.

  • 06

    Transformation

    Dataform (intégré) ou dbt-bigquery

    Même discipline que les deux autres architectures : SQL versionné, assertions, lignage. Le modèle en étoile ne change pas.

Pour l'agent TEIA

Le contexte géospatial devient une requête

BigQuery GIS remplace le balayage GeoPandas en mémoire : l'agent résout une région, un district, une commune ou un fokontany par un ST_CONTAINS indexé, au lieu de relire cinq fichiers plats à chaque appel.

La boucle Earth Engine se raccourcit

Les exports de l'ImageCollection propriétaire rejoignent l'entrepôt sans transfert hors écosystème. Le délai entre la fin d'un job GEE et la disponibilité du résultat pour l'agent diminue d'autant.

L'évaluation s'outille sans brique supplémentaire

Vertex AI lit directement les jeux BigQuery : les traces de llm_call_logs servent de base d'évaluation et d'analyse de coût sans étape d'export.

Règles d'exploitation

Toute table de faits est partitionnée sur sa date d'événement

Sans partition, chaque requête scanne l'historique complet et le coût devient proportionnel à l'ancienneté du projet. C'est la règle qui protège le budget, avant toute autre optimisation.

Les données personnelles vivent derrière une vue autorisée

Le jeu de données contenant les colonnes personnelles n'est jamais accessible directement. Le recensement en dénombre onze objets : ils entrent tous par ce chemin.

La région se choisit à la création et jamais après

Un jeu de données BigQuery ne se déplace pas. Pour des données personnelles, europe-west se décide avant la première ligne écrite.

Résolu

  • RestitutionLa production n'est plus interrogée du tout : Datastream lit le WAL, pas les tables.
  • Référentiel géographiqueLe référentiel administratif devient une table GEOGRAPHY indexée. Les cinq fichiers plats relus à chaque requête disparaissent du chemin critique.
  • Coût de l'agentLes trois comptages de tokens se réconcilient dans une vue, avec une assertion Dataform qui alerte quand l'écart dépasse un seuil.
  • Earth EngineLes exports Earth Engine et les résultats d'analyse rejoignent l'entrepôt sans quitter l'écosystème qui les produit.
  • RétentionL'expiration de partition est un paramètre de table. La rétention devient une ligne de DDL.

Non résolu

  • Coût variable et difficile à prévoir sans discipline de partitionnement. Le risque n'est pas théorique : il se matérialise au premier tableau de bord mal écrit.
  • Dépendance forte à un fournisseur : le SQL est portable, la pile d'exploitation ne l'est pas.
  • Contrainte de localisation des données personnelles à arbitrer explicitement, jeu de données par jeu de données.
  • Dépendance réseau permanente : l'analytique cesse d'être exploitable hors connexion vers Google.

À retenir si

  • La plateforme est déjà déployée sur Google Cloud et Earth Engine est au cœur du produit.
  • L'équipe veut zéro infrastructure à exploiter et accepte un coût variable.
  • Le besoin géospatial analytique est prioritaire.

À écarter si

  • Si les données personnelles ne peuvent pas sortir d'une infrastructure maîtrisée.
  • Si la prévisibilité budgétaire compte plus que la vitesse de mise en œuvre.

Le chemin le plus rapide vers une restitution fiable, et le seul qui règle le référentiel géographique par construction. Il transfère la charge d'exploitation vers une charge de gouvernance financière et juridique.

A4

Trajectoire hybride

Le socle d'abord, le lakehouse quand le volume le prouve

Mise en œuvre
6 semaines pour la phase 1, puis par paliers
Infrastructure
Celui d'A1 pendant six mois, puis A1 + stockage objet
Charge humaine
0,3 ETP en phase 1, 0,6 en phase 2

Le recensement qualifie la croissance de dix objets par des mots — TRÈS FORTE, LA PLUS FORTE — mais ne donne aucun chiffre. On ne choisit pas une architecture à cinq mois de chantier sur un adjectif. Cette trajectoire installe la valeur tout de suite et fait dépendre l'ouverture de la phase suivante d'une mesure, pas d'une intuition.

Trois phases, deux portes de décision chiffrées
SOURCESCAPTURECHAUD / FROIDTRANSFORMATIONRESTITUTIONBoucle de retour — la télémétrie de l'agent (llm_call_logs, chats, checkpoints) redevient une sourcePostgreSQL prod55 tablesMongoDB11 collectionsObject storage4 préfixesRéplication logiquephase 1dlt incrémentalphase 1CDC continuphase 3, si la porte s'ouvreEntrepôt PostgreSQL13 derniers moisPalier froid Icebergau-delà de 13 mois — phase 2Contrat de donnéesun seul modèle, deux supportsdbtmêmes modèles, deux adaptateursTâche d'archivageDETACH → écriture ParquetMetabasevue unifiée chaud + froidDuckDBrequête l'archive sans serveurContexte agent TEIAvues de service dès la phase 1
flux continu lot planifié requête de lecture pilotage et gouvernance boucle de retour

La pile, couche par couche

  • 01

    Phase 1 — semaines 1 à 6

    Le socle PostgreSQL de A1, intégralement

    Metabase quitte la production, les quatre tables à forte croissance sont partitionnées, le mart de réconciliation des tokens publie son premier écart. La valeur est livrée avant le premier arbitrage.

  • 02

    Instrumentation

    Une table de mesure de la volumétrie, alimentée chaque nuit

    pg_total_relation_size par table et db.stats() par collection. En huit semaines, l'adjectif TRÈS FORTE devient une pente en gigaoctets par mois. C'est cette pente qui décide de la phase 2, pas une réunion.

  • 03

    Porte de décision 1

    La phase 2 s'ouvre si l'entrepôt dépasse 500 Go ou croît de plus de 40 Go par mois

    Un seuil écrit à l'avance évite l'arbitrage à chaud. En dessous, PostgreSQL suffit et la phase 2 ne se justifie pas.

  • 04

    Phase 2 — mois 3 à 6

    Palier froid Iceberg sur le bucket existant

    Les partitions détachées au-delà de treize mois sont écrites en Parquet / Iceberg. Aucune nouvelle infrastructure : le bucket et le format sont déjà là. Le stockage chaud cesse de croître.

  • 05

    Porte de décision 2

    La phase 3 s'ouvre si le non structuré devient un besoin analytique explicite

    Analyser les documents, les images et les métadonnées d'embeddings est le seul motif qui justifie le coût d'exploitation d'un lakehouse complet. Sans ce besoin, la phase 2 est un point d'arrivée légitime.

  • 06

    Invariant

    Un seul modèle en étoile, deux adaptateurs dbt

    C'est ce qui rend la trajectoire réversible. Les modèles écrits en phase 1 s'exécutent en phase 3 sans réécriture ; seule la cible change.

Pour l'agent TEIA

Les vues de service arrivent en phase 1

C'est le besoin le plus immédiat de l'agent, et il ne demande pas le lakehouse. Six semaines après la décision, TEIA lit son contexte ailleurs que dans la base de production.

La gouvernance du corpus attend, sciemment

Le corpus RAG reste indexé à la main pendant les six premiers mois. C'est le coût assumé de la trajectoire, et il doit être énoncé comme tel devant l'équipe.

La porte 2 se formule en termes d'agent

Le jour où l'analyse des documents de l'utilisateur devient une exigence produit, la phase 3 s'ouvre. Tant qu'elle ne l'est pas, le lakehouse est une dépense sans contrepartie pour l'agent.

Règles d'exploitation

Une phase ne s'ouvre que sur un chiffre

Chaque porte a un seuil écrit avant le début de la phase précédente. Un chantier de plusieurs mois ne se lance pas sur une impression de croissance.

Le modèle précède la plateforme

Les dimensions et les faits se conçoivent en phase 1 et ne changent plus. La plateforme est une décision d'exécution, le modèle une décision métier.

Chaque phase livre seule

Si la phase 2 n'arrive jamais, la phase 1 reste une architecture complète et défendable. Aucune phase n'est un demi-pont.

Résolu

  • RestitutionDès la semaine 6, au même titre que A1.
  • RétentionEn deux temps : partitionnement d'abord, archivage froid ensuite. La rétention n'attend pas le lakehouse.
  • Coût de l'agentLe mart de réconciliation est livré en phase 1 : c'est le premier chiffre que le comité attend.
  • RisqueLe coût d'un mauvais choix devient le coût d'une phase, pas celui d'un programme.

Non résolu

  • Deux migrations au lieu d'une. La phase 2 a un coût de bascule que A2 direct n'a pas.
  • Exige une discipline de mesure : sans la table de volumétrie, la trajectoire dégénère en A1 qui ne bouge jamais.
  • Le palier froid Iceberg est un lakehouse partiel : il n'apporte ni le catalogue versionné, ni la fédération.

À retenir si

  • La volumétrie réelle n'est pas encore mesurée.
  • Le comité veut un résultat visible ce trimestre sans fermer la porte au lakehouse.
  • Le budget se libère par paliers, pas en une fois.

À écarter si

  • Si la volumétrie est déjà connue et impose clairement le lakehouse : mieux vaut alors aller directement en A2.
  • Si l'organisation ne sait pas tenir une décision différée et rouvrira le débat chaque mois.

La réponse la plus honnête à un recensement qui décrit des croissances sans les chiffrer. Elle achète de l'information avant d'acheter de l'infrastructure.

05 — La grille

Pondérer, puis trancher

Huit critères notés de 1 à 5, avec la justification de chaque note. Réglez les poids selon la contrainte réelle de l'équipe : le classement se réordonne. La grille ne décide pas à votre place, elle rend explicite ce qui pèse.

CritèreA1A2A3A4
Coût d'infrastructure sur 12 mois
Délai avant la première restitution fiable
Tenue de la croissance volumétrique
Adéquation aux compétences de l'équipe
Souveraineté et conformité RGPD
Ouverture et absence de dépendance
Charge d'exploitation courante
Couverture du non structuré et du géospatial

Profils de décision

Aucun critère ne domine. Le point de départ de la discussion.

Poids des critères — 0 à 5

4

Dépense directe, hors temps d'ingénierie.

  • A15/5Une VM et un disque. Le poste de coût le plus bas et le plus prévisible.
  • A23/5Le stockage objet est bon marché, mais deux à trois nœuds de calcul tournent en permanence.
  • A33/5Stockage négligeable, calcul facturé à l'octet scanné : faible si discipliné, dérivant sinon.
  • A44/5Coût d'A1 pendant six mois, puis un palier de stockage objet marginal.
4

Temps entre la décision et un tableau de bord juste, branché ailleurs que sur la production.

  • A15/54 à 6 semaines, sans apprentissage préalable.
  • A22/53 à 5 mois, dont une part importante d'apprentissage.
  • A34/53 à 6 semaines, mais la gouvernance de coût doit être posée dès le premier jour.
  • A45/5Identique à A1 : la phase 1 EST A1.
3

Le recensement identifie dix objets à croissance TRÈS FORTE, tous sans rétention.

  • A12/5Scaling vertical uniquement. Plafond réel autour de quelques centaines de gigaoctets utiles.
  • A25/5Séparation stockage / calcul : la croissance devient un coût de stockage, pas un mur.
  • A35/5Pas de plafond pratique, la croissance se traduit en coût de requête.
  • A44/5Le palier froid repousse le plafond sans l'éliminer tant que la phase 3 n'est pas ouverte.
4

Trois services backend Python, PostgreSQL maîtrisé, aucune compétence data engineering déclarée.

  • A15/5PostgreSQL, SQL, dbt. Rien qui sorte du champ de compétence existant.
  • A22/5Iceberg, Trino, Debezium, un bus : quatre technologies nouvelles à exploiter simultanément.
  • A33/5SQL familier, mais un modèle de coût et une console d'administration à apprendre.
  • A44/5Phase 1 sans apprentissage, la montée en compétence est étalée et volontaire.
4

Onze objets porteurs de données personnelles, dont le journal de géolocalisation (position et adresse IP, conservées sans limite).

  • A15/5Les données restent dans l'infrastructure maîtrisée. Rien ne change au périmètre juridique.
  • A25/5Idem, y compris avec MinIO auto-hébergé : le lakehouse n'impose aucun fournisseur.
  • A32/5Localisation à arbitrer jeu de données par jeu de données, et irréversible après création.
  • A45/5Aucune sortie de périmètre à aucune phase.
3

Capacité à changer de moteur sans réécrire le modèle ni migrer les données.

  • A14/5PostgreSQL est ouvert, mais le format des données reste lié au moteur.
  • A25/5Parquet et Iceberg sont lisibles par n'importe quel moteur. C'est le seul modèle réellement réversible.
  • A31/5Le SQL est portable, la pile d'exploitation ne l'est pas. La sortie se paie en réécriture.
  • A44/5La phase 2 introduit Iceberg et fait remonter l'ouverture sans changer de moteur chaud.
3

Ce que l'architecture coûte chaque semaine une fois installée.

  • A14/5Une base de plus à sauvegarder et superviser. Connu, borné.
  • A22/5Compaction, expiration de snapshots, supervision du CDC et du bus. Un travail hebdomadaire réel.
  • A35/5Aucune infrastructure à exploiter. La charge devient de la surveillance budgétaire.
  • A43/5Celle d'A1, puis celle d'une tâche d'archivage supplémentaire.
3

4 préfixes d'object storage, 6 collections vectorielles, une ImageCollection Earth Engine, PostGIS.

  • A12/5PostGIS couvre le géospatial vectoriel. Documents, images et embeddings restent hors périmètre.
  • A25/5Le seul modèle où les 4 préfixes deviennent analysables sans recopie.
  • A34/5BigLake couvre le non structuré, BigQuery GIS règle le référentiel géographique par construction.
  • A43/5Couverture géospatiale dès la phase 1, non structuré seulement si la phase 3 s'ouvre.

Classement pondéré

1
Socle PostgreSQL dédié

L'entrepôt là où l'équipe sait déjà opérer

83%
3
Lakehouse ouvert

Le bucket qui existe déjà devient l'entrepôt

71%
4
Entrepôt managé BigQuery

Là où vivent déjà Earth Engine et les journaux

66%
2
Trajectoire hybride

Le socle d'abord, le lakehouse quand le volume le prouve

81%

Lecture

Avec cette pondération, Socle PostgreSQL dédié arrive en tête à 83 %, devant Trajectoire hybride (81 %). L'écart est dans le bruit : ces deux options sont équivalentes au regard des critères posés, et la décision se prendra sur un argument qui n'est pas dans cette grille.

06 — La suite

Ce qui s'engage quoi qu'il arrive

Six actions sont communes aux quatre options. Les lancer n'engage pas le choix : c'est le meilleur usage possible des semaines qui précèdent la décision.

#ActionDomaineEffort
01Instrumenter la volumétrie de chaque table et de chaque collection, chaque nuit.Volumétrie1 jour
02Créer la révision Alembic des quatre tables hors migration — reports, sections, artifacts, uploaded_geometries.Gouvernance de schéma2 à 3 jours
03Déclarer les index MongoDB manquants, à commencer par l'index TTL sur validation_links et l'unicité de file_fingerprints.Index et rétention1 jour
04Ajouter le paramètre d'expiration à la clé Redis zone_registration — elle vit sur l'instance qui sert aussi de broker Celery.Rétention1 ligne
05Forcer le SRID 4326 sur zones.geometry : sans géométrie homogène, aucune jointure spatiale n'est fiable.Intégrité spatiale1 migration
06Écrire la définition du grain des sept tables de faits. C'est le seul livrable qui survit à n'importe quel changement d'avis sur la plateforme.Socle commun2 jours

Quatre inconnues pèsent plus que la grille

Une grille pondérée classe des options connues. Trois de ces quatre points ne sont pas des décisions techniques : ils doivent être portés par quelqu'un d'autre que l'équipe.

La volumétrie réelle

Le recensement qualifie dix objets de croissance TRÈS FORTE sans donner un seul volume. Le critère de scalabilité repose aujourd'hui sur une impression.

À mesurerÉquipe technique, 8 semaines

La localisation acceptable des données personnelles

Onze objets portent de la donnée personnelle. Savoir si elles peuvent résider chez un fournisseur cloud, et dans quelle région, départage à elle seule A3 des trois autres.

À trancherDirection, avant tout démarrage

L'obligation de conservation

Douze mois pour activity_log, six pour geolocation_audits : ce sont des propositions du recensement, pas des décisions.

À trancherJuridique

L'ambition produit à trois ans

Si l'analyse des documents, des images et des embeddings entre au programme, le lakehouse cesse d'être un luxe. Sinon, c'est une charge d'exploitation sans contrepartie.

À trancherProduit