Retour a l'accueil

Etude de cas - Mission freelance

Map Align - Pipeline de reconciliation IA-assistee

Un pipeline en 5 etapes qui reconcilie des sources externes (sites web, cartes, PDF) avec une base interne de milliers d'espaces physiques. Le moteur deterministe decide, le LLM relit et peut annuler - jamais l'inverse.

Etapes de pipeline
5
Lignes de code core
~3300
Types de proposition
4
Seuil de match
0.72

Le brief

Le client edite une plateforme conversationnelle B2B pour les lieux physiques (aeroports, centres commerciaux) avec une base interne de milliers d'espaces - boutiques, restaurants, services. Les sources externes (sites officiels, cartes interactives, exports PDF) divergent en permanence de cette base.

Il fallait un outil qui aligne les deux mondes sans que l'operateur compare des listes a la main - et sans que l'IA invente ou supprime des espaces de maniere silencieuse.

Le defi

Un LLM laisse seul sur cette tache propose des suppressions massives sur la moindre source incomplete et hallucinate des creations sur du bruit de parsing. Il faut aussi gerer la lignee : de quelle source vient cette proposition, quel run l'a produite, contre quelle version du snapshot interne.

Chaque source a ses propres permissions (certaines peuvent creer, pas d'autres), et l'admin doit garder un controle total avant qu'une proposition ne modifie la base reelle.

La solution

Un pipeline en 5 etapes : extract, unify, compare, apply (plus un db-extract interne). Chaque etape produit des artefacts types conserves pour l'audit. Le moteur deterministe tranche en premier ; le LLM n'est qu'un relecteur qui peut degrader une action a noop ou retirer un changement de champ - jamais introduire une suppression ou une creation.

Toute decision est tracee (decisionSource: rule | ai), les runs forment un arbre parent-enfant, et l'admin valide proposition par proposition avant l'apply final.

Le pipeline

Chaque etape ecrit ses artefacts et son run dans Postgres. L'UI expose l'avancement, les erreurs de pre-conditions (NoIsmSourcesConfiguredError, NoIsmCompareInputsError, etc.) et la revue des propositions.

  1. 01Extract

    Etape 1

    Snapshot de la base interne, plus un run enfant par source configuree (scraping web, parsing de cartes, PDF). Fallback bootstrap si l'extraction complete echoue.

  2. 02Unify

    Etape 2

    Clustering des candidats via similarite Jaccard sur les noms plus indices ponderes (terminal, niveau, zone, surface, position). Seuil fixe a 0.72, marge d'ambiguite a 0.06.

  3. 03Compare

    Etape 3

    Arbre de decision deterministe produit des propositions (create/update/delete/noop) enrichies d'une shortlist top-5 pour les creates. Un LLM relit et ne peut que degrader.

  4. 04Apply

    Etape 4

    Les propositions acceptees sont materialisees en transaction : creation d'espaces, resolution hierarchique des parents, creation lazy de taxonomies inconnues, upserts de labels, marques, audiences.

  5. 05Review

    Transverse

    Chaque proposition a un reviewStatus (pending / accepted / rejected / applied). L'operateur accepte, rejette ou ignore avant que l'apply ne touche la base de production.

Patterns de conception

  • Regles d'abord, IA en relecture : le LLM ne peut que degrader une decision, jamais l'escalader
  • Sanitisation avant diff : nettoyage des placeholders ('n/a', 'unknown'), extraction des URLs noyees dans le texte libre, suppression des mots-cles de position
  • Actions gates par permission : chaque source peut independamment interdire create/update/delete
  • Lignee de runs : arbre parent-enfant avec knowledge_resource_id (null = source DB interne)
  • Creation lazy de taxonomies : l'apply cree les nouveaux types d'espace a la volee si un draft reference un code inconnu
  • Artefacts immuables : candidats, unifies et propositions sont preserves pour l'audit

Stack technique

  • TanStack Router (file-based, routes imbriquees)
  • TanStack Query
  • Drizzle ORM + PostgreSQL
  • OpenAI GPT (structured outputs, schemas Zod)
  • Zod pour la validation de bout en bout
  • Turborepo + Bun workspaces

Resultats

Pipeline en production chez le client. Les operateurs sont passes d'une reconciliation manuelle a une revue de propositions deja pre-tranchees.

Zero hallucination de suppression grace au garde-fou deterministe, et chaque decision reste auditable par le couple (run_id, decisionSource).