Retour aux projets

Djezzy Commercial Copilot

Assistant d'intelligence décisionnelle multi-agents pour la direction commerciale de Djezzy : des questions en langage naturel sur 13 mois de données commerciales quotidiennes, avec des réponses narratives et des graphiques en direct, via un pipeline d'agents durable et asynchrone.

InterneAucun dépôt publicAssistant BI multi-agents d'entreprise / 2026

Problème

Les équipes commerciales de Djezzy dépendent du personnel BI et technique pour extraire et interpréter les données de cinq flux (Revenue, Sales, Activation, Flexy, Active Clients), chacun avec 13 mois d'historique quotidien. Cette dépendance ralentit l'accès à l'information, engorge l'équipe BI de demandes répétitives et ouvre la porte aux erreurs d'interprétation, notamment les comparaisons chronologiques injustes, comme comparer un jour férié à un jour ordinaire un an plus tôt.

Solution

Construire un système multi-agents piloté par un orchestrateur : un orchestrateur LangGraph raisonne sur l'intention de l'utilisateur et choisit parmi une panoplie d'outils (text-to-SQL encadré, mémoire sémantique partagée, normalisation des dates et recherche web approuvée par un humain), au lieu de tout traduire directement en SQL. Le travail s'exécute de façon asynchrone via Temporal, pour que les analyses lourdes ne bloquent jamais l'utilisateur derrière un indicateur de chargement, et les résultats arrivent en temps réel par Kafka et WebSocket.

Fonctionnalités clés

Trois personas commutables (Explorer pour le descriptif, Researcher pour le diagnostic, Planner pour le prescriptif) qui changent la profondeur de raisonnement et les outils dont l'agent dispose
Génération de SQL à partir du langage naturel, validée par sqlglot avant tout contact avec l'entrepôt analytique en lecture seule
Moteur de normalisation des dates qui impose des bases de comparaison tenant compte des événements (Aïd, Ramadan, périodes d'examens, campagnes) pour que les comparaisons de périodes restent statistiquement équitables
Mémoire sémantique partagée sur pgvector qui met en cache les analyses résolues et filtre les correspondances selon la disponibilité des KPI et la validité de la période avant de les servir
Recherche web avec humain dans la boucle via un proxy MCP limité à une liste blanche de domaines, pour que l'agent n'accède jamais seul à l'internet ouvert
Outil de corrélations cachées qui croise des événements externes approuvés avec des segments internes, au lieu de se fier à une moyenne avant/après naïve
Exécution asynchrone d'abord : la soumission renvoie aussitôt un identifiant de tâche, un workflow Temporal exécute le tour de l'agent de façon durable avec des reprises bornées, et un chemin Kafka-vers-WebSocket livre le résultat dès qu'il est prêt
Contrat de sortie multimodal strict : chaque réponse est un texte conversationnel accompagné de spécifications de graphiques, jamais de la prose libre, pour que le frontend affiche des widgets cohérents
Service de LLM auto-hébergé (Qwen via vLLM) plutôt qu'une API tierce, pour garder les données commerciales dans l'infrastructure de Djezzy
Authentification par rôle (analyst/manager/admin/viewer) avec des JWT limités à un usage précis et un parcours complet d'inscription, connexion, rafraîchissement et réinitialisation

Rôle

Stagiaire data scientist au Data Science Immersion Program (DSIP 4) de Djezzy, à la tête d'une équipe de cinq personnes (ce rôle de responsable a été convenu au sein de l'équipe). J'ai pris en charge l'architecture commune : le runtime Temporal/LangGraph, le pipeline de livraison asynchrone et les contrôles de CI, sur les cinq composants déployables du monorepo.

Stack

PythonFastAPILangGraphTemporalPostgreSQLSQLAlchemy 2.0AlembicpgvectorsqlglotPydanticKafkaRedisQwen (self-hosted LLM)vLLMReactViteReact RouterTypeScriptEChartsWebSocketJWTDockerKubernetesHelmGitHub Actions

Pipeline de requêtes asynchrone

ne bloque jamais
SYNCHRONEInterface chatReact · ViteFastAPI BFFPOST /queriestask_idrenvoyé aussitôtquestionen msDURABLETemporalworkflowCache sémantiquepgvectorLangGraphroutage par personaorchestration d'outilsrelaisdéfauttext_to_sqlvalidé par sqlglotentrepôt13 mois, lecture seulerecherche webapprobation humainelectureLIVRAISONKafkaévénement de finWebSocketpush vers le clientréponsespecs graphiquesÉQUIPEÉquipe de 5 · programme DSIP de 6 sem. · architecture commune : la mienneGARANTIEaucun SQL généré n'est exécuté sans analyse
Les deux voies sont l'essentiel. Synchrone : la requête renvoie un task_id en quelques millisecondes et la connexion est libre. Durable :un workflow Temporal fait le travail lent et la réponse arrive par un socket dès qu'elle est prête. Chaque instruction SQL générée est analysée par sqlglot avant d'atteindre un entrepôt en lecture seule, et toute recherche web s'arrête pour une approbation humaine.

Captures d'écran : Djezzy Copilot

2 vues
Le chat répond à « create a comparison graph » : un résumé rédigé de l'évolution d'un mois sur l'autre et deux graphiques (valeurs quotidiennes et moyenne mobile sur 7 jours). Chaque réponse porte son identifiant de tâche, et le pied de page précise que les requêtes s'exécutent sur l'entrepôt de 13 mois avec validation SQL. Build de développement local.
Le tableau de bord : les graphiques épinglés depuis le chat deviennent des widgets déplaçables et redimensionnables, à côté des compteurs d'activité de l'utilisateur. Build de développement local avec des données de test.