À proposProjetsServicesContact
Retour aux projets

BizComp Intelligence

Agent conversationnel IA pour l'analyse des entreprises belges

Présentation

BizComp Intelligence est la couche IA construite au-dessus de la plateforme de données Bizcomp. Elle introduit un agent conversationnel qui permet aux utilisateurs d'explorer les données d'entreprises belges en langage naturel. Au lieu de naviguer manuellement dans des tableaux de bord, l'utilisateur pose des questions comme « Montre-moi les finances de Colruyt » ou « Compare Delhaize et Carrefour » et le système classifie automatiquement l'intention, résout les entités, orchestre les appels d'outils et compose une réponse sous forme de tableau de bord — le tout en temps réel via streaming.

Architecture de l'agent

L'agent suit un pipeline multi-étapes : un classificateur d'intentions alimenté par LLM détermine ce que l'utilisateur souhaite, un résolveur d'entités associe les noms d'entreprises aux numéros officiels, un planificateur de requêtes sélectionne les outils à invoquer, et une boucle de repli exécute les appels d'outils avec logique de retry. Enfin, un compositeur de mise en page assemble la réponse en un tableau de bord structuré avec texte de synthèse, widgets et suggestions d'actions. L'ensemble du pipeline supporte la propagation d'abandon, les budgets de requête et la concurrence optimiste des sessions.

1
Requête utilisateur
Entrée en langage naturel
2
Classificateur d'intentions
Alimenté par LLM, 12 types d'intentions
3
Résolveur d'entités
Recherche BCE, résolution spéculative parallèle
4
Planificateur de requêtes
Sélection et orchestration d'outils
5
Exécuteur d'outils
Appels parallèles avec retry et abandon
6
Compositeur de mise en page
Assemblage du tableau de bord + suggestions
7
Réponse en streaming
SSE vers le client
Chaque étape supporte la propagation d'abandon et le contrôle de budget de requête

Fonctionnalités principales

  • Requêtes en langage naturel avec classification d'intentions sur 12 types : financières, analyse de risque, fiche entreprise, analyse sectorielle, comparaison multi-entreprises, etc.
  • Orchestration multi-outils avec exécution parallèle — l'agent peut invoquer get_company_card, get_financials, get_risk_flags, search_companies et plus en un seul tour
  • Réponses en streaming temps réel via Server-Sent Events, livrant des résultats partiels au fur et à mesure de chaque étape du pipeline
  • Composition déterministe de tableaux de bord pour les intentions standard, contournant le compositeur LLM pour plus de rapidité quand l'intention est univoque
  • Persistance de session avec concurrence optimiste sur PostgreSQL — les requêtes concurrentes sur la même session sont fusionnées sans écrasement
  • Protections d'accès anonyme : limitation par IP, plafonds de concurrence par client, quotas de messages et délestage basé sur la profondeur de la file LLM
  • Support multilingue (français, néerlandais, anglais) avec actions suggérées adaptées à la langue et contenu de tableau de bord localisé
  • Widgets interactifs : graphiques de tendances financières avec légendes cliquables, tableaux de bord de comparaison, panneaux de risques, vues cartographiques et visualisations chronologiques

Stack technique

Next.js 16TypeScriptFastifyGoogle Gemini AIPostgreSQLGoogle Cloud SQLDockerTailwind CSSServer-Sent EventsRecharts

Défis techniques & solutions

Classification d'intentions & résolution d'entités fiables

Les requêtes utilisateur sont ambiguës — « finances Colruyt » peut signifier un tableau de bord financier ou une analyse approfondie. J'ai construit un classificateur qui associe les requêtes à l'un des 12 types d'intentions structurés, avec une normalisation de suivi qui propage le contexte des tours précédents. La résolution d'entités gère les noms partiels d'entreprises, les résout via la Banque-Carrefour des Entreprises, et supporte la résolution spéculative en parallèle de la classification pour réduire la latence.

Pipeline de streaming avec sécurité d'abandon

Chaque requête traverse plus de 5 étapes asynchrones (classifier, résoudre, planifier, exécuter les outils, composer). J'ai implémenté des budgets de requête avec propagation d'abandon : si l'utilisateur quitte la page ou que la requête expire, chaque appel LLM et requête base de données en cours est proprement annulé. Les tours échoués sont retirés de la session pour éviter de corrompre l'état de la conversation.

Concurrence optimiste des sessions

Plusieurs onglets ou des requêtes rapides successives peuvent toucher la même session simultanément. J'ai ajouté une colonne de version à l'état de session avec contrôle de concurrence optimiste — en cas de conflit, le système recharge la session la plus récente, réapplique les tours de la requête en cours et réessaie jusqu'à 3 fois, évitant le problème classique du dernier écrit qui gagne.

Limitation de débit LLM & gestion de file d'attente

Avec plusieurs appels LLM par requête (classificateur, compositeur, boucle de repli), atteindre les limites de l'API Gemini est inévitable. J'ai construit une file d'attente LLM partagée avec des délais minimaux configurables, un routage par modèle et un délestage basé sur la profondeur de file qui rejette les nouvelles requêtes avant même qu'elles n'atteignent le LLM lorsque le système est saturé.

Amar Fettis | Développeur Web Full Stack basé à Liège