Downloads · 30 days
0
antoinecoulon/veille-ml
veille-ml is a text classification model from antoinecoulon. Use it when you need a label for a piece of text. It is set up for transformers. The card lists the license as mit.
son en-tête Space sont conservés pour un déploiement ultérieur, cf. Hébergement). Les poids du modèle fine-tuné ne sont pas versionnés (gitignorés, reproductibles via le seed 42). --
Downloads · 30 days
0
Access
Public
Updated Jul 24, 2026
Repo size
—
Likes
0
Public
Click a slice to open those files.
.py26 KB · 46%
From the Hugging Face model README
Classe un article de veille tech (titre + résumé) dans 7 thèmes. Deux approches cohabitent dans ce dépôt :
MoritzLaurer/mDeBERTa-v3-base-mnli-xnli),
composant ML du projet veille-analytics
(Étape 13). Le contenu étant en français, on utilise un modèle multilingue avec des
hypothèses NLI descriptives en français plutôt que le modèle anglophone initialement prévu.camembert-base, Étape 17) — entraîné sur les labels faibles Mistral
pour tenter de rattraper l'écart avec la baseline LLM. Voir section dédiée plus bas.Multi-étiquette : un article peut relever de plusieurs thèmes (scores sigmoïdes indépendants).
Thèmes : IA/ML · DevOps/Infrastructure · Architecture · Sécurité · Développement · Pratiques/Qualité · Productivité/Outils.
classifier.py — cœur partagé zero-shot (thèmes, hypothèses FR, pipeline zero-shot, classify()).app.py — UI Gradio + API auto-exposée (point d'entrée du Space).evaluate.py — évaluation locale (zero-shot vs Mistral, + fine-tuné via --model-dir).train.py — fine-tuning multi-label de camembert-base (Étape 17).finetuned.py — pendant de classifier.py pour le modèle fine-tuné (classify_finetuned()).model-finetuned/ — poids du modèle fine-tuné (généré par train.py, gitignoré).eval_results.json — artefact produit par evaluate.py : métriques micro/macro par système
(zero-shot, fine-tuné, Mistral) et par thème, réutilisé tel quel dans le M3.2.train_results.json — artefact produit par train.py : courbe de validation par epoch et
best.threshold, relu ensuite par evaluate.py pour le report « au seuil de validation ».requirements.txt — dépendances (torch CPU). Inchangé par l'Étape 17 : la boucle
d'entraînement est écrite en PyTorch pur (pas de Trainer HF), pour éviter la dépendance
accelerate et les changements d'API transformers v5.ruff.toml — configuration du lint Python (qualité de code, C19), voir ci-dessous.Versionnement. Ce dépôt n'a pas de remote GitHub : il vit sur le Space Hugging Face (
hf, déploiement différé — cf. Hébergement) et est versionné localement. La qualité de code n'est donc pas portée par une action CI + SonarCloud comme sur veille-analytics, mais parruffen local.
uv venv --python 3.12
uv pip install torch --index-url https://download.pytorch.org/whl/cpu
uv pip install transformers sentencepiece protobuf gradio
.venv/bin/python app.py # UI locale sur http://127.0.0.1:7860
.venv/bin/python evaluate.py # précision vs ../veille-analytics/data/annotations.csv
uv pip install ruff # qualité de code (C19)
.venv/bin/ruff check . # lint local — doit sortir « All checks passed! »
# Étape 17 — fine-tuning + éval à 3 (zero-shot / fine-tuné / Mistral)
.venv/bin/python train.py --data-dir ../veille-analytics/data
.venv/bin/python evaluate.py --data-dir ../veille-analytics/data --model-dir ./model-finetuned
# Orchestration des deux étapes ci-dessus (pendant de run-spark-batch.sh côté veille-analytics)
./run-eval.sh # pipeline complet (fine-tuning ~25 min + éval)
./run-eval.sh --skip-train # rejoue l'éval sur le modèle existant
Précision / rappel / F1 (micro) sur l'espace des 7 thèmes, jeu de validation indépendant.
Depuis l'Étape 17, evaluate.py --model-dir ./model-finetuned ajoute une troisième colonne
(le fine-tuné, cf. section suivante) et régénère train_results.json / eval_results.json.
| Approche | Point opérant | Précision | Rappel | F1 (micro) |
|---|---|---|---|---|
| ML zero-shot (mDeBERTa) | seuil 0,7 | 0,49 | 0,57 | 0,525 |
Baseline Mistral (themes_mistral) | — | 0,57 | 0,81 | 0,667 |
Le zero-shot prêt-à-l'emploi fournit une base honnête mais reste sous la classification
Mistral (LLM plus grand + prompt dédié). Fort sur Sécurité (F1 0,75), IA/ML (0,62) et
DevOps (0,62) ; faible sur Pratiques/Qualité (0,22). Détail complet dans eval_results.json
(généré par evaluate.py). Le fine-tuning (Étape 17, ci-dessous) est le levier testé pour
combler l'écart — avec un résultat en demi-teinte.
Peut-on rattraper Mistral en entraînant un petit modèle local sur ses propres étiquettes ?
train.py fine-tune camembert-base (110M
paramètres) en multi-label sur les 7 thèmes, à partir des labels faibles themes_mistral
(pas des annotations manuelles, réservées au test).
camembert-base, tête de classification multi-label (BCEWithLogitsLoss),
boucle d'entraînement PyTorch manuelle — pas de Trainer Hugging Face, pour éviter la
dépendance accelerate et les changements d'API transformers v5. Aucune dépendance
ajoutée : requirements.txt est inchangé par cette étape.themes_mistral canonique, il reste 426 candidats, séparés en train 383 /
val 43 (seed 42, VAL_FRACTION = 0.10).prf() que evaluate.py.model-finetuned/ (~445 Mo,
gitignoré — reproductible via le seed 42 ; un push vers le Hub HF est possible mais pas
requis pour ce projet)..venv/bin/python train.py --data-dir ../veille-analytics/data
.venv/bin/python evaluate.py --data-dir ../veille-analytics/data --model-dir ./model-finetuned
train_results.json)Micro-F1 val (43 articles, labels Mistral) au fil des epochs :
0,495 (ep. 1) → 0,565 (ep. 4) → 0,685 (ep. 8, meilleur, seuil 0,4) → early stopping ep. 10.
eval_results.json)| Système | Précision | Rappel | F1 (micro) |
|---|---|---|---|
| Zero-shot mDeBERTa (seuil 0,7) | 0,490 | 0,565 | 0,525 |
| Fine-tuné CamemBERT (seuil 0,5, optimisé sur le test*) | 0,742 | 0,548 | 0,630 |
| Fine-tuné CamemBERT (seuil 0,4, retenu sur la validation) | 0,465 | 0,702 | 0,559 |
Baseline Mistral (themes_mistral) | 0,567 | 0,810 | 0,667 |
* Le seuil 0,5 est choisi en balayant directement les 100 articles annotés : il surajuste, exactement comme le seuil 0,7 du zero-shot ci-dessus. Le chiffre méthodologiquement propre est celui au seuil 0,4, fixé sur la validation (383/43, jamais sur le test).
F1 par thème (au meilleur seuil test de chaque système) :
| Thème | Zero-shot | Fine-tuné | Mistral |
|---|---|---|---|
| IA/ML | 0,618 | 0,737 | 0,839 |
| DevOps/Infrastructure | 0,615 | 0,650 | 0,610 |
| Architecture | 0,531 | 0,630 | 0,676 |
| Sécurité | 0,754 | 0,824 | 0,885 |
| Développement | 0,424 | 0,702 | 0,615 |
| Pratiques/Qualité | 0,222 | 0,000 | 0,407 |
| Productivité/Outils | 0,316 | 0,000 | 0,556 |
pos_weight par thème dans la BCE pour compenser
le déséquilibre, plus de données, seuils par thème plutôt qu'un seuil global.Statut : local pour l'instant. Le déploiement sur Hugging Face Spaces est différé :
depuis juillet 2026, HF gate CPU basic ET ZeroGPU derrière un compte PRO (le build ZeroGPU
refuse par ailleurs torch==2.13.0+cpu). Le code Gradio (app.py, en-tête YAML du Space,
requirements.txt) reste prêt si un compte PRO est pris plus tard.
Pour l'exécution : .venv/bin/python app.py (UI locale). Pour un endpoint cloud appelable
depuis le Worker (Étape 14), on visera l'Inference API serverless de HF (appel du modèle
hébergé via token, sans Space à héberger) — dispo à vérifier à ce moment-là.
Mise à jour juillet 2026 (Étape 14). Piste confirmée : le modèle est servi par
l'Inference API serverless de Hugging Face, provider hf-inference, endpoint
https://router.huggingface.co/hf-inference/models/MoritzLaurer/mDeBERTa-v3-base-mnli-xnli
(token avec permission « Inference Providers », free tier avec rate limits). C'est ce
qu'utilise désormais le Worker veille-analytics : module src/lib/classifyMl.ts, qui porte
le contrat de classifier.py (mêmes hypothèses FR, même template, seuil 0,7). Le Space Gradio
ci-dessus reste optionnel/différé — il n'est plus sur le chemin critique de la prod.
hf auth login # token HF (write)
# Créer le Space sur https://huggingface.co/new-space (SDK: Gradio, hardware CPU basic), puis :
git init && git add . && git commit -m "Étape 13 — classifieur zero-shot"
git remote add hf https://huggingface.co/spaces/<user>/<space>
git push hf main
Le build lit l'en-tête YAML (sdk: gradio, app_file: app.py) et installe requirements.txt.