Toutes les réalisations

05 — Fleet Services Group

Apprendre un secteur en 30 minutes, en faire un brief de ciblage en 5

Un outil interne où l'IA rédige des fiches sur les secteurs économiques — qui décide des achats informatiques, quels codes d'activité viser et surtout lesquels éviter — qu'un humain valide avant tout usage. Une fiche validée devient ensuite un plan de prospection en cinq minutes.

La qualité d'une campagne de téléprospection se joue avant le premier appel, dans le ciblage. Or savoir quels codes d'activité viser — et surtout lesquels éviter — vivait dans la tête de trois personnes. Un brief mal construit coûte cher longtemps : les téléopérateurs appellent hors cible, les taux s'effondrent, et le client constate que la prestation ne fonctionne pas.

Contexte
Interne — Fleet Services Group
Rôle
Conception et réalisation
Période
2026
État
Livré

Ce que fait l’application, concrètement

On ouvre un des 72 secteurs de la taxonomie — des collèges publics aux sociétés de services informatiques. On lit la fiche : résumé, codes d'activité principaux, secondaires et pièges (les faux amis, avec l'explication de pourquoi ce sont des faux amis), structure des comptes, structure de décision, besoins probables gradués par confiance, personas décideurs avec leurs mots-clés réels, signaux d'achat, règles d'inclusion et d'exclusion, pièges de données, et un score de confiance assorti de la liste des sources encore à réunir.

On la valide d'un clic pour la faire passer de brouillon à relue. Ou on corrige une section directement, ce qui crée une nouvelle version et archive la précédente — avec un écran de comparaison entre deux versions.

Puis on va sur le générateur de brief : secteur + type de client + offre vendue + exclusions. En une trentaine de secondes, on obtient un brief exploitable — codes à inclure et à exclure avec leur justification, personas avec les filtres de recherche correspondants, signaux d'achat et leur source de détection, modèle de scoring pondéré avec la façon de mesurer chaque critère, angles de message avec la preuve à citer, risques de données et leur parade. Exportable en un clic.

Le vrai problème n’était pas de générer

Générer des fiches secteur avec un modèle de langage est facile — et c'est exactement ce qui produit du contenu plausible et faux. Un brief qui a l'air sérieux et qui envoie une équipe de téléopérateurs appeler les mauvaises entreprises pendant trois semaines fait plus de dégâts qu'une absence de brief.

L'enjeu était donc de rendre la production impossible sans les garde-fous.

Décisions structurantes

01Les règles produit sont encodées à trois endroits, pas seulement dans le prompt

Quatre règles non négociables : séparer les faits sourcés des hypothèses avec un niveau de confiance affiché ; lister les codes pièges au même titre que les codes principaux ; livrer les exclusions aussi clairement que les inclusions ; employer le vocabulaire réel des décideurs, pas le jargon marketing. Elles sont écrites dans les prompts, vérifiées par une validation de schéma sur la sortie du modèle, et reflétées dans les colonnes de la table de versions. Une génération non conforme est rejetée avant d'atteindre un utilisateur. Un prompt seul est une intention ; une validation est une garantie.

02Les prompts sont versionnés dans le dépôt et relus comme du code

Chaque prompt est un fichier avec ses métadonnées — identifiant, version, modèle recommandé, format de sortie — et une convention écrite : changement de logique, nouveau fichier ; changement cosmétique, incrément de version. L'identifiant complet est journalisé avec chaque appel. Un prompt qui vit dans une interface d'administration change sans laisser de trace et personne ne sait plus quelle version a produit quelle fiche. Ici, la qualité des sorties est un sujet d'ingénierie.

03La version 3 du prompt encode sept modèles capitalistiques français

C'est ce qui fait la valeur du produit. Le prompt sait reconnaître la décentralisation territoriale (un collège relève du département, un lycée de la région), la tutelle publique, la coopérative d'adhérents indépendants, la franchise, le groupe intégré, le réseau privé sous contrat et le tissu de très petites entreprises. Pour chaque typologie il doit produire qui paie l'informatique, qui décide stratégiquement, qui décide opérationnellement, et la recommandation de ciblage. L'objectif est écrit en tête du prompt : répondre en trente secondes à « pour une campagne informatique sur les collèges publics, on cible quoi ? ».

04La taxonomie elle-même est générée, avec une matrice de couverture obligatoire

Le prompt qui produit la liste des secteurs impose une quinzaine de rubriques à couvrir — en distinguant explicitement santé publique et santé privée, enseignement public et privé, logement social et immobilier privé — avec la sanction écrite : « si tu produis une taxonomie qui oublie une ligne, ta réponse est invalide ». Le résultat est écrit dans un dossier séparé, jamais directement en base, puis promu après relecture.

05Un garde-fou budgétaire avant chaque appel

Chaque appel au modèle est journalisé avec ses jetons, sa latence, son coût estimé et son succès. Et avant chaque appel, une fonction somme le coût du mois en cours et lève une exception typée si le plafond configuré est dépassé. L'écran de paramètres affiche la consommation, le pourcentage de budget consommé et le taux d'échec. On ne découvre pas sa facture à la fin du mois.

06Le stockage en document, versionné dans une table à part

Le schéma d'une fiche change à chaque itération produit. Le figer en colonnes typées imposerait une migration à chaque idée. Le stockage documentaire absorbe cette évolution, et la table de versions séparée permet de faire coexister brouillon, relu et archivé sans jamais écraser, et de comparer deux générations successives section par section.

07L’ingestion lourde ne tourne pas là où tourne l’application

L'hébergement gratuit coupe toute exécution au-delà de dix secondes. Dix scripts Python assurent donc la partie lourde : découverte automatique de sources par recherche puis filtrage par un modèle économique avec une règle explicite (« en cas de doute, on écarte : la précision prime sur le rappel »), téléchargement avec limitation de débit par domaine et repli sur les documents PDF, résumé et vectorisation, génération des fiches, et une veille hebdomadaire de signaux d'achat — cyberattaques, levées de fonds, nominations, acquisitions — dédoublonnée par empreinte cryptographique de l'article.

Ce que je ferais évoluerDéplier
  • Le bouton de génération de l'interface utilise encore la version 1 du prompt, alors que le script utilise la version 3 avec recherche web. Les fiches produites depuis l'écran n'ont donc pas la section capitalistique — celle qui fait la valeur du produit. C'est une ligne à changer, et c'est le premier correctif.
  • La recherche sémantique n'est pas branchée. Les vecteurs sont calculés, les index existent, les deux fonctions de recherche sont écrites — mais rien ne les appelle. La recherche de l'écran est un simple filtre en mémoire.
  • Aucun appel au modèle n'est réessayé. L'échec est journalisé proprement puis remonté, mais une erreur transitoire fait perdre la génération.
  • Trois tables (sessions d'apprentissage, cartes de révision) existent avec leurs règles d'accès mais ne sont jamais écrites — un reste de périmètre qui a été coupé.

Stack

Application

  • Next.js 14 (App Router)
  • TypeScript
  • Tailwind CSS
  • Server Actions
  • Middleware d’auth

Données

  • PostgreSQL
  • pgvector
  • Row Level Security
  • JSONB
  • 6 migrations

IA

  • OpenAI
  • 12 prompts versionnés
  • Validation Zod
  • Embeddings
  • Garde-fou budgétaire

Ingestion

  • Python
  • BeautifulSoup
  • pypdf
  • API de recherche
  • Veille planifiée