Proxy Product Owner · Business Analyst chez Enedis, groupe EDF · Agents LLM, MLOps · Disponible janvier 2027 Proxy Product Owner · Business Analyst at Enedis, EDF Group · LLM agents, MLOps · Available January 2027


Mohamed Traoré


Je construis des systèmes qui transforment de la donnée mal rangée en quelque chose d’utilisable, et je vais jusqu’au bout : jusqu’à l’interface que quelqu’un ouvre le matin pour faire son travail. I build systems that turn badly-kept data into something usable, and I go all the way: to the interface someone opens in the morning to do their job.

Où j’en suisWhere I am

Je suis Proxy Product Owner et Business Analyst chez Enedis, dans le groupe EDF, en alternance. Les deux moitiés du poste comptent autant l’une que l’autre : je cadre le besoin avec le métier, puis je livre la chose en production.

I’m a Proxy Product Owner and Business Analyst at Enedis, part of the EDF group, on a work-study contract. Both halves of the job matter equally: I frame the need with the business, then I ship the thing to production.

Concrètement, j’ai conçu un agent IA adossé à un LLM auto-hébergé qui automatise un circuit de décision en langage naturel, avec des garde-fous contre l’hallucination et une validation systématique contre le référentiel métier. Et j’en ai porté tout le cycle de vie, du prototype au déploiement continu.

Concretely: I designed an AI agent grounded in a locally hosted LLM that automates a natural-language decision workflow, with guardrails against hallucination and systematic validation against the business repository. And I owned its whole lifecycle, from prototype to continuous deployment.

En parallèle, je pilote la migration d’une plateforme documentaire vieille de vingt ans vers le cloud. Dit comme ça, cela sonne administratif. Dans les faits, c’est un problème d’ingénierie de données assez complet : cartographier un existant que personne ne connaît entièrement, écrire les extracteurs, gérer les doublons et les collisions de noms, paralléliser l’injection pour tenir dans une fenêtre réaliste, et rendre tout cela pilotable par des gens qui n’ouvriront jamais un terminal.

Alongside that, I run the migration of a twenty-year-old document platform to the cloud. Put that way it sounds administrative. In practice it’s a fairly complete data-engineering problem: mapping a legacy nobody fully knows, writing the extractors, handling duplicates and filename collisions, parallelising the injection to fit a realistic window, and making all of it drivable by people who will never open a terminal.

D’où je viensWhere I come from

Avant Enedis, j’étais Data Analyst chez GRDF, dans le groupe Engie. Deux univers énergétiques différents, un même constat : la valeur d’une analyse dépend surtout de la qualité de la plomberie qui l’alimente. C’est ce qui m’a poussé vers l’ingénierie plutôt que vers la seule modélisation.

Before Enedis I was a Data Analyst at GRDF, part of the Engie group. Two different energy worlds, one shared lesson: the value of an analysis depends mostly on the quality of the plumbing feeding it. That’s what pushed me toward engineering rather than modelling alone.

J’ai aussi passé un semestre d’échange à la TU Dresden, qui m’a appris autant sur le travail en environnement international que sur la matière elle-même. De mi-septembre à décembre, je rejoins l’Université du Michigan à Ann Arbor pour un stage de recherche en intelligence artificielle.

I also spent an exchange semester at TU Dresden, which taught me as much about working internationally as about the subject itself. From mid-September to December I’m joining the University of Michigan at Ann Arbor for a research internship in artificial intelligence.

Trois principes, appris à mes dépensThree principles, learned the hard way

  1. 01

    Je ne fais pas confiance à un résultat que je ne peux pas vérifier par programme.

    I don’t trust a result I can’t verify programmatically.

    Sur mon application de préparation au GMAT, chaque question générée embarque un script Python qui recalcule la bonne réponse. Sur un pipeline de migration, chaque lot injecté est réconcilié avec la source. Un chiffre sans contrôle derrière lui est une hypothèse, pas un résultat.

    In my GMAT prep app, every generated question ships with a Python script that recomputes the correct answer. In a migration pipeline, every injected batch is reconciled against the source. A number with no check behind it is a hypothesis, not a result.

  2. 02

    Je vais jusqu’à l’interface.

    I go all the way to the interface.

    Un script qui marche mais que son auteur seul sait lancer n’a migré personne. Je termine mes projets par la couche qui les rend utilisables : une application de bureau, une interface web, une page de suivi. C’est souvent la moitié du travail, et rarement la moitié dont on parle.

    A script that works but only its author can run has migrated nobody. I finish my projects with the layer that makes them usable: a desktop app, a web interface, a tracking page. It’s often half the work, and rarely the half people talk about.

  3. 03

    Je commence par comprendre le métier.

    I start by understanding the business.

    Les décisions les plus coûteuses d’un projet de données se prennent avant la première ligne de code : quelles données on garde, sous quelle structure, avec quelles règles. Aucun modèle ne rattrape une mauvaise réponse à ces questions.

    The most expensive decisions in a data project are made before the first line of code: which data you keep, in what shape, under which rules. No model rescues a bad answer to those questions.

ParcoursCareer

  1. Proxy Product Owner · Business Analyst

    Proxy Product Owner · Business Analyst

    Enedis, groupe EDFEDF Group · Paris · AlternanceApprenticeship

    Agent IA sur LLM auto-hébergé avec garde-fous et validation métier. Cycle de vie complet : Docker, Ansible, GitLab CI, analyse SonarQube et tests de sécurité Checkmarx avant chaque livraison. Pipelines Python et SQL sur des centaines de milliers d’enregistrements. L’industrialisation de la chaîne ETL de migration documentaire a permis d’économiser plusieurs dizaines de milliers d’euros. Proxy Product Owner auprès de 7 Business Analysts et du Tech Office.

    AI agent on a self-hosted LLM with guardrails and business validation. Full lifecycle: Docker, Ansible, GitLab CI, SonarQube static analysis and Checkmarx security testing before every release. Python and SQL pipelines over hundreds of thousands of records. Industrialising the document-migration ETL chain saved several tens of thousands of euros. Proxy Product Owner working with 7 Business Analysts and the Tech Office.

  2. Data Analyst

    Data Analyst

    GRDF, groupe EngieEngie Group · Lyon

    Modèles de machine learning croisant données météo et historique de consommation pour améliorer la prévision d’allocation gaz. Cinq jeux de données, plus de 5 000 lignes par jour, chaîne Power Query accélérée de 30 %. Supervision SQL des outils de reporting pour une équipe nationale de 30 personnes en 24/7.

    Machine-learning models combining weather data with consumption history to improve gas allocation forecasting. Five datasets, 5,000+ rows a day, Power Query chain made 30% faster. SQL monitoring of reporting tools for a nationwide 24/7 team of 30.

  3. Data Analyst

    Data Analyst

    Business France · Paris

    Recueil du besoin métier et traduction en spécifications fonctionnelles. Tableaux de bord Power BI automatisés et intégrés à SharePoint et Salesforce : temps de génération des rapports divisé par deux.

    Gathering business requirements and translating them into functional specifications. Automated Power BI dashboards integrated with SharePoint and Salesforce: report generation time cut in half.

  4. FormationEducation

    Master Innovation, Business & Society · CMI Data Science

    MSc Innovation, Business & Society · CMI Data Science

    Université Paris NanterreUniversité Paris Nanterre, France

    Précédé d’un semestre Erasmus en économie et gestion à la TU Dresden, et d’une licence Économie & Gestion dans le même cursus CMI Data Science for Social Sciences.

    Preceded by an Erasmus semester in economics and management at TU Dresden, and a BSc in Economics & Management within the same CMI Data Science for Social Sciences track.

ProjetsSelected work

01

Agent IA de décision en langage naturel

Natural-language decision agent

Un LLM qui tourne sur nos propres serveurs, qui appelle des outils, et à qui on n’a pas le droit de faire confiance sur parole.

An LLM running on our own servers, calling tools, and never taken at its word.

Le cœur du poste chez Enedis. Un agent adossé à un LLM auto-hébergé automatise un circuit de décision jusque-là traité à la main, en langage naturel, avec appel d’outils.

The core of the Enedis role. An agent grounded in a self-hosted LLM automates a decision workflow previously handled by hand, in natural language, with tool-calling.

La partie intéressante n’est pas le modèle, c’est ce qu’il y a autour. Chaque sortie passe par des garde-fous contre l’hallucination et une validation contre le référentiel métier : l’agent ne peut pas inventer une réponse qui n’existe pas dans les données de l’entreprise. Auto-héberger le modèle n’est pas un choix esthétique : les données ne sortent pas.

The interesting part isn’t the model, it’s what surrounds it. Every output passes through guardrails against hallucination and validation against the business repository: the agent cannot invent an answer that doesn’t exist in company data. Self-hosting the model isn’t an aesthetic choice: the data never leaves.

J’ai porté le cycle de vie complet : conteneurisation Docker, déploiement Ansible sur serveur dédié, intégration continue GitLab, analyse statique SonarQube et tests de sécurité Checkmarx avant chaque livraison.

I owned the full lifecycle: Docker containerisation, Ansible deployment to a dedicated server, GitLab CI, SonarQube static analysis and Checkmarx security testing before every release.

Stack
Stack
PythonOllamatool-callingFastAPIPyQt6DockerAnsibleGitLab CISonarQubeCheckmarx
Démonstration
Demo
agent.mohamedtraore.dev Version publique reconstruite : référentiel fictif, aucune donnée d’entreprise. Le modèle n’est pas hébergé sur ce serveur, les réponses suivent des parcours pré-écrits, mais les neuf outils s’exécutent réellement. Identifiants affichés sur la page. A rebuilt public version: fictional repository, no company data. The model isn’t hosted on this server, so the replies follow pre-written paths, but the nine tools genuinely execute. Credentials shown on the page.
02

Pipeline ETL de migration documentaire

Document-migration ETL pipeline

Extraire, fiabiliser et réinjecter une GED d’entreprise vers le cloud, sans perdre un document.

Extract, clean and re-inject a corporate document store into the cloud, without losing a single file.

Migration d’une plateforme documentaire historique (vingt ans d’héritage, des dizaines d’applications partenaires) vers une plateforme collaborative cloud. J’ai conçu et industrialisé la chaîne ETL complète.

Migrating a legacy document platform (twenty years of history, dozens of partner applications) to a cloud collaboration platform. I designed and industrialised the whole ETL chain.

Des scripts Python interrogent l’API source pour inventorier l’arborescence, récupérer les métadonnées et télécharger les fichiers avec leurs pièces jointes. Le pipeline gère la déduplication, le filtrage des extensions et la résolution des collisions de noms via un suffixe dérivé de l’identifiant du document. Côté injection, PowerShell prend le relais, avec parallélisation des envois et passage en REST binaire brut pour les pièces jointes que les bibliothèques standard refusaient de traiter.

Python scripts query the source API to inventory the tree, pull metadata and download files with their attachments. The pipeline handles deduplication, extension filtering and filename-collision resolution via a suffix derived from the document identifier. On injection, PowerShell takes over, with parallelised uploads and a drop to raw binary REST for the attachments that standard libraries refused to handle.

Le tout est piloté depuis une application de bureau PyQt6 que je maintiens, avec ses environnements de préproduction et de recette, pour que la migration ne dépende pas d’une ligne de commande dans un coin.

All of it is driven from a PyQt6 desktop application I maintain, with its staging and acceptance environments, so the migration doesn’t hang on a command line in someone’s corner.

Stack
Stack
PythonpandasPowerShellPyQt6FastAPIRESTMSAL
Démonstration
Demo
etl.mohamedtraore.dev Version publique reconstruite : référentiel fictif, aucune donnée d’entreprise. La configuration, la validation et la reprise par étape sont réelles ; l’exécution est simulée, aucun système n’est contacté. Identifiants affichés sur la page. A rebuilt public version: fictional repository, no company data. Configuration, validation and step-level resume are real; execution is simulated and no system is ever contacted. Credentials shown on the page.
03

Agent Data Lake en langage naturel

Natural-language data-lake agent

Poser une question en français, obtenir du PySpark qui s’exécute vraiment sur le lac.

Ask a question in plain language, get PySpark that actually runs on the lake.

Un agent LLM, bâti sur Mistral AI, qui traduit une question en langage naturel en code PySpark exécuté sur un data lake. La sortie est contrainte en JSON et passe par des garde-fous : le modèle propose, le contrat de sortie dispose.

An LLM agent built on Mistral AI that turns a natural-language question into PySpark code executed against a data lake. Output is JSON-constrained and passes through guardrails: the model proposes, the output contract decides.

C’est le projet où j’ai compris que le sujet, avec les LLM, n’est presque jamais le prompt : c’est la surface de contact entre du texte libre et un système qui, lui, n’a pas le droit de se tromper.

This is the project where I understood that with LLMs the subject is almost never the prompt: it’s the contact surface between free text and a system that isn’t allowed to be wrong.

Stack
Stack
Mistral AIPySparkPythonJSON schema
Code
Code
github.com/YoroHiro/graph_vote_project
04

Prévision des prix J+1 de l’électricité

Day-ahead electricity price forecasting

Un lac de données en trois couches, un modèle dessus, et surtout : pourquoi le prix bouge.

A three-layer data lake, a model on top, and above all: why the price moves.

Architecture médaillon Bronze / Argent / Or en PySpark, avec des contrôles qualité à chaque couche, parce qu’une prévision fausse en bout de chaîne est presque toujours une donnée sale en début de chaîne.

A Bronze / Silver / Gold medallion architecture in PySpark, with quality checks at every layer, because a wrong forecast at the end of the chain is almost always dirty data at the start of it.

Par-dessus, un XGBoost entraîné sur plus de 600 000 lignes et 23 variables, R² de 0,88, suivi d’une analyse des facteurs explicatifs. Le modèle qui prédit m’intéresse moins que le modèle qui explique : sur un marché spot, savoir que le prix va monter vaut beaucoup moins que savoir pourquoi.

On top, an XGBoost trained on 600,000+ rows and 23 features, R² of 0.88, followed by an analysis of the underlying drivers. The model that predicts interests me less than the model that explains: on a spot market, knowing that the price will rise is worth far less than knowing why.

Stack
Stack
PySparkXGBoostscikit-learnBronze/Argent/Or
Code
Code
github.com/YoroHiro/energie_datalake_project
05

Application de préparation au GMAT

GMAT preparation app

Une banque de questions générée par un modèle, puis vérifiée par un programme. Jamais l’inverse.

A question bank generated by a model, then verified by a program. Never the other way round.

Je l’ai construite parce que les outils existants ne me donnaient ni le niveau de difficulté réel de l’examen, ni le contrôle sur le contenu. L’application couvre tous les modules, avec suivi de progression, mode révision, flashcards, test blanc chronométré et une gamification légère.

I built it because existing tools gave me neither the real difficulty of the exam nor control over the content. It covers every module, with progress tracking, a revision mode, flashcards, a timed mock test and light gamification.

La partie qui m’intéresse est en dessous. Chaque famille de question a son gabarit de génération, qui décrit les pièges à instancier, la distribution cible des réponses et le contrat de sortie en JSON. Aucune clé d’API n’est embarquée : l’application ne génère jamais une question elle-même, elles entrent uniquement par un module d’import qui valide la forme, déduplique et refuse toute question sans provenance tracée.

The part I care about sits underneath. Each question family has its own generation template describing the traps to instantiate, the target answer distribution and the JSON output contract. No API key is embedded: the app never generates a question itself, they only enter through an import module that validates the shape, deduplicates and rejects any question without traced provenance.

Le moteur adaptatif repose sur un modèle de Rasch : le niveau estimé est recalculé après chaque réponse par maximum de vraisemblance sur toute la session, et pilote le choix de la question suivante. En dessous de trente questions disponibles, il cède la place à un tirage aléatoire sans remise, parce qu’un adaptatif sur un échantillon trop mince estime surtout du bruit.

The adaptive engine is a Rasch model: the estimated ability is recomputed after every answer by maximum likelihood over the whole session, and drives the choice of the next question. Below thirty available questions it gives way to random draw without replacement, because an adaptive engine on too thin a sample mostly estimates noise.

Stack
Stack
ReactTypeScriptFastifyPostgreSQLDrizzleZodDockerCaddyPythonJSON schema
En ligne
Live
gmat.mohamedtraore.dev

Certifications & languesCertifications & languages

Certifications

Certifications

  • Data Science Methodology IBM
  • Python for Data Science, AI & Development IBM
  • Python Project for Data Science IBM
  • Tools for Data Science IBM
  • Fundamentals of AI Agents Hugging Face
  • Databases and SQL with Python IBM · en coursin progress
  • AWS Cloud Practitioner Essentials Move2Cloud · en coursin progress

Langues

Languages

  • FrançaisFrench C2
  • AnglaisEnglish TOEIC 960
  • ChinoisChinese notionsbasics

Hors clavierOff the keyboard

Je cours (athlétisme et route), je cuisine, et je suis de bien trop près bien trop de sports à la fois. J’ai aussi travaillé comme mannequin, ce qui apprend deux ou trois choses sur la lumière, le cadrage et le fait d’être jugé sur un détail qu’on n’avait pas vu.

I run (track and road), I cook, and I follow far too many sports far too closely. I also worked as a model, which teaches you a thing or two about light, framing, and being judged on a detail you hadn’t noticed.

Si vous voulez lancer une conversation qui dure, demandez-moi ce que je pense d’un match récent ou de la bonne façon de rater un plat.

If you want to start a conversation that lasts, ask me what I made of a recent match, or about the right way to ruin a dish.

Un projet, une question, une opportunité : écrivez-moi. A project, a question, an opportunity: write to me.