Raouf Zaghouani

Je construis des systèmes d'IA, et je mesure ce qu'ils valent.

Ingénieur Data / IA diplômé de l'IMT Mines Alès. Un an et demi de R&D en machine learning, deep learning et IA générative, de la modélisation prédictive au déploiement d'agents LLM en local, sur des données qui ne sortent pas du réseau.

Recherche CDI ingénieur Data / IA Disponible novembre 2026 Paris, mobile France

Ce que j'ai construit, et ce que ça donne

Chaque chiffre vient d'un jeu de validation, pas d'une impression. Les limites de chaque mesure sont écrites dans le dépôt correspondant.

ProjetRésultat mesuréContexte
Agent RAG sur documentation industrielle 100 % retrieval, 98 % réponses 20 questions, 5 types de données
Prévision multi-cibles en atelier d'assemblage hit rate 0,82 2ᵉ place, hackathon Airbus
Prédiction de déplacements urbains accuracy 0,69 à 0,74 utilisateurs jamais vus
Évaluation comparative de pipelines RAG 4 configurations, 6 métriques témoin sans retrieval inclus
Transcription vocale et synthèse par LLM 100 % local données de santé, aucun appel externe

Projets

Agent RAG pour documentation technique industrielle

Stage de fin d'études chez Incitius Software, Montpellier

Un assistant conversationnel qui interroge en langage naturel deux bases documentaires d'un site industriel : une base structurée d'équipements et de plans, une base de procédures réglementaires. Le problème n'était pas de générer du texte, mais de retrouver le bon code équipement parmi des milliers, ce que la similarité sémantique seule rate systématiquement.

L'agent est construit sur un graphe LangGraph à trois nœuds. À chaque tour, le LLM décide seul s'il répond ou s'il relance une recherche, et fabrique lui-même les arguments de son outil : la requête, la clé de filtre parmi onze, et sa valeur. Les identifiants sont normalisés avant d'atteindre Qdrant, parce que la base écrit « 11 B 0024 » là où le technicien tape « 11B0024 ». Au bout de cinq tours, un second appel sans outil force une réponse sur ce qui a été trouvé, pour qu'aucune question ne reste sans retour.

Le module de navigation dans les procédures réglementaires utilise, lui, une recherche hybride : vecteurs denses et BM25 fusionnés par RRF dans Qdrant. J'ai comparé trois LLM avant de trancher : Qwen3 14B réussit 93 % des raisonnements agentiques contre 40 % pour Mistral 7B, un écart qu'aucune métrique de génération ne montrait.

L'ensemble tourne sur le réseau du client : LLM et embeddings sur serveur GPU interne, base vectorielle en Docker sur site. Sur de la documentation d'exploitation, c'était une contrainte non négociable, et elle a structuré toute l'architecture.

Graphe LangGraph de l'agent : le LLM analyse, un routeur envoie vers une recherche Qdrant ou vers la réponse, avec une limite de cinq tours Boucle ReAct, cinq tours au maximum Chainlit question du technicien Analyser Qwen3 14B, Ollama, température 0 Router Tool call « chercher » query, filtre parmi 11, valeur Normalisation majuscules, 11B0024 en 11 B 0024 Recherche Qdrant filtre métadonnée, cosinus Réponse forcée 2ᵉ appel sans outil Réponse directe le LLM a l'information Chainlit réponse au technicien tool call réponse cinq tours atteints résultats, tour suivant
Le LLM est dans la boucle, pas après elle : à chaque tour il choisit entre répondre et relancer une recherche, en fabriquant lui-même ses filtres. Le chemin vert est le retour des résultats. Au cinquième tour, un appel sans outil force une réponse sur ce qui a été trouvé.
Évaluation
100 % / 98 %retrieval et qualité de réponse, vérification exacte
RAGAS
0,84faithfulness
Recherche documentaire
−60 à 70 %de temps contre la recherche manuelle

Python · LangGraph · Qdrant · Ollama · Qwen3 14B · mxbai-embed-large · BM25 · RAGAS · Chainlit · Docker · Debian / Hyper-V

Code propriété de l'entreprise. Présentation détaillée sur demande.

Prévision multi-cibles en atelier d'assemblage

Hackathon Kaggle Airbus Helicopters, 2ᵉ place

Prédire simultanément trois indicateurs d'une ligne d'assemblage d'hélicoptères : en-cours de production, investissement et satisfaction client. La métrique du concours ne récompensait pas la précision mais le fait de tomber à moins de 0,05 de la cible, ce qui change complètement la fonction de coût à optimiser.

J'ai implémenté un FT-Transformer from scratch en PyTorch : chaque colonne du tableau devient un token, les numériques via un poids appris par colonne, les catégorielles via leur propre table d'embedding, avec un token CLS qui porte les trois prédictions. En parallèle, un LightGBM avec sélection de features par gain cumulé, ramenant 7 600 colonnes à 400.

Les poids du mélange final ont été cherchés directement sur la métrique du concours par tirage de Dirichlet, et non sur une erreur quadratique. Le mélange gagne 4,5 points sur le meilleur modèle seul : les deux modèles se trompent sur des exemples différents.

Tokenisation du FT-Transformer : chaque colonne du tableau devient un token, un token CLS porte les trois prédictions Une ligne du tableau valeur num. valeur num. catégorie catégorie Un token par colonne valeur × poids + biais valeur × poids + biais table d'embedding table d'embedding token CLS ajouté Attention multi-têtes pre-norm, ReGLU Attention multi-têtes pre-norm, ReGLU CLS seul en-cours de production investissement satisfaction client
Le principe du FT-Transformer : traiter un tableau comme une séquence de tokens. Une seule tête produit les trois cibles, donc le modèle partage ses représentations entre elles.
Mélange FT-T et LightGBM
0,820hit rate à 0,05, validation
Meilleur modèle seul
0,775LightGBM

Python · PyTorch · LightGBM · pandas · NumPy


Voir le dépôt

Évaluation comparative de pipelines RAG

Mission R&D au CEA

Un pipeline RAG « marche » toujours. La vraie question est de savoir s'il fait mieux qu'un LLM sans récupération, et quel mode de recherche choisir. J'ai construit un framework qui exécute le même jeu de questions dans quatre configurations, dont un témoin sans retrieval, qui est la partie que la plupart des évaluations oublient.

Six métriques en sortie, choisies pour se compléter : ROUGE mesure le recouvrement de surface, BERTScore le sens. Une reformulation correcte fait chuter l'un sans toucher l'autre, et c'est précisément l'écart entre les deux qui indique si le modèle reformule ou s'il dérive.

Le dépôt documente aussi les faiblesses de l'outil, parce qu'elles comptent autant que les résultats : le MRR y est un proxy par paliers de similarité, pas un vrai rang de documents récupérés.

Configurations comparées
4direct, local, global, hybride
Métriques
6ROUGE, BERTScore, MRR, similarité

Python · LightRAG · Ollama · asyncio · ROUGE · BERTScore


Voir le dépôt

Prédiction de déplacements urbains par Transformer

Stage de recherche à la Czech Technical University, Prague

À partir de trois semaines d'historique de connexions mobiles, prédire à quelle antenne-relais un utilisateur se connectera pour chacune des 24 heures du lendemain. Le corpus vient de Shanghai Telecom : 7,2 millions de connexions réelles, 3 233 antennes, 9 481 téléphones.

La décision qui compte ici n'est pas l'architecture mais le découpage : le split se fait par utilisateur, pas par date. En coupant au milieu des séquences, le modèle verrait à l'entraînement les habitudes des personnes qu'il doit prédire, et le score serait flatté de plusieurs dizaines de points.

Dix configurations testées, tous les journaux d'entraînement conservés. Ce qu'ils montrent : les hyperparamètres ne changent presque rien, et pousser l'entraînement ne fait que creuser l'écart entre apprentissage et généralisation.

Courbes d'accuracy sur 50 époques : l'entraînement monte à 0,78 pendant que la validation plafonne puis redescend 0,60 0,65 0,70 0,75 époque 1 époque 50 meilleure validation, époque 8 entraînement 0,78 validation 0,65 Le modèle continue d'apprendre. Il n'apprend plus rien d'utile.
Configuration à 50 époques, 8 têtes, embedding 64. Données extraites du journal d'entraînement conservé dans le dépôt. La validation atteint son maximum dès la huitième époque puis décroît : les 42 époques suivantes ne font que mémoriser le jeu d'entraînement.
Sous-groupe régulier
0,737accuracy validation
Jeu complet
0,689accuracy validation
Configurations
10journaux conservés

Python · TensorFlow / Keras · pandas · scikit-learn · Parquet


Voir le dépôt

Transcription vocale et synthèse pour le suivi médico-social

Projet d'école pour l'association Les Genêts

Dans un établissement qui accompagne des personnes en situation de handicap, chaque professionnel consigne par écrit ce qui s'est passé pendant son service. En pratique la rédaction arrive en fin de poste, de mémoire, plusieurs heures après les faits, et les détails se perdent.

L'application permet de dicter la note au moment où ça se passe : Whisper transcrit, PostgreSQL range avec ses métadonnées, et Qwen3 produit à la demande une synthèse structurée par personne et par période.

Ce sont des données de santé sur des personnes vulnérables. Passer par une API de transcription aurait été plus simple, et c'était le mauvais choix : tout tourne en local, aucune requête ne quitte le réseau de l'établissement.

Traitement
100 % localWhisper et LLM sur site
Base
JSONB + GINrecherche indexée par personne

Python · Flask · PostgreSQL · Whisper · Ollama · ffmpeg · JavaScript


Voir le dépôt

Parcours

Sept. à nov. 2026

Formation Data Engineering, Kuikops (Paris)

ETL Python orienté objet, SQL et PL/SQL analytique, Spark, dbt, Snowflake, AWS, MLOps avec MLflow et CI/CD.

Mars à sept. 2026

Stage de fin d'études, Incitius Software

Agent IA et système RAG souverain pour documentation technique industrielle en secteur réglementé.

Mai à août 2025

Stage recherche machine learning, Czech Technical University (Prague)

Prédiction de trajectoires à partir de données spatio-temporelles mobiles.

Janv. à mai 2025

Mission R&D machine learning, CEA

Framework d'évaluation automatique de pipelines RAG sur documents scientifiques et techniques.

2023 à 2026

Ingénieur Informatique et Intelligence Artificielle, IMT Mines Alès

Machine learning et deep learning, NLP, science des données, modélisation numérique. Trésorier du gala de l'école : budget de 140 000 € et bureau de 50 personnes.

2020 à 2023

Classes préparatoires MP, Esprit Prépa (Tunis)

Admission à l'IMT Mines Alès sur concours national.

Compétences

Machine learning

scikit-learn, XGBoost, LightGBM, feature engineering, statistiques bayésiennes

Deep learning

PyTorch, TensorFlow / Keras, Transformers, CNN, RNN, Hugging Face

IA générative et LLM

Pipelines RAG, agents ReAct, LangGraph, LlamaIndex, Ollama, Qdrant, embeddings, fine-tuning LoRA et QLoRA, prompt engineering

Data engineering

Python, SQL / PL/SQL, Spark, dbt, Snowflake, Parquet, pipelines ETL, API REST avec FastAPI et Flask

Infrastructure

Docker, AWS, Git, Mercurial, Hyper-V, MLflow, CI/CD

Langues

Français et arabe natifs, anglais C1, espagnol B2