Le processus — Généralités

Vue d’ensemble du pipeline de codification COICOP

Principe

Le pipeline codif-coicop-bdf rattache chaque libellé de produit à un poste de la nomenclature COICOP en combinant plusieurs classifieurs complémentaires, puis en les arbitrant via un LLM (LLM-as-judge). Il est orchestré par Argo Workflows (argo/codif-pipeline.yaml).

Le DAG du pipeline

Schéma Excalidraw du pipeline.

                                             ┌──→ create-vector-db ─────────→ run-rag ──────────┐
   preprocessing ──→ codif-regex ──→ prune ──┤                                                  │
                          │                  └──→ create-vector-db-annotations ─→ run-rag-ann ──┤
                          │                                                                    ├──→ decide-coicop ──→ final-output ──→ report
                          ├──→ codif-lcs ────────────────────────────────────────────────────── ┤
                          └──→ run-ttc ─────────────────────────────────────────────────────────┘

Points à retenir sur cette topologie :

  • prune dépend de codif-regex (et non de preprocessing) : il a besoin du jeu à coder déjà débarrassé des lignes captées par les regex. Cette étape n’est jamais sautée.
  • Seules les deux étapes create-vector-db* sont skippables (-p skip-vector-db=true) : les collections Qdrant survivent d’un run à l’autre.
  • decide-coicop attend les quatre classifieurs ; report dépend de toutes les étapes précédentes (il en loggue les durées).

Chaque étape lit et écrit sur S3 dans un dossier propre au run : s3://projet-budget-famille/data/workflow_runs/{run_date}/{run_id}/<étape>/.

Les classifieurs

Cinq briques de codification tournent en parallèle, puis sont conciliées par decide-coicop :

Brique Approche Page
Regex Règles déterministes ancrées La codification par regex
LCS Similarité de chaînes (plus longue sous-chaîne commune) LCS
TTC Classifieur neuronal (n-grammes de caractères) TTC
RAG COICOP RAG sur les notices de la nomenclature RAG sur COICOP
RAG annotations RAG sur exemples déjà codifiés (few-shot) RAG sur annotation

Le regex est à part : il tranche en amont et retire ses lignes du flux. Les quatre autres produisent chacun une prédiction candidate sur les mêmes observations, que decide-coicop arbitre.

Modes prod / éval

Un seul workflow (argo/codif-pipeline.yaml) couvre les deux usages. Le commutateur est le paramètre input_file :

Mode production Mode évaluation
input_file non vide (CSV/parquet à codifier) vide ("")
Ce qui est codifié les observations du fichier fourni le split test des annotations manuelles
Vérité terrain absente (code à NA) présente (code annoté)
Livrable fichier d’entrée enrichi (final-output) rapport d’exactitude

Le mode se propage étape par étape :

Étape En production En évaluation
preprocessing reçoit --input-file + le mappage de colonnes, produit observations.parquet en plus des annotations produit seulement les annotations (annotations_full, raw_train, raw_test)
codif-regex lit test_set_prod = observations.parquet et train_set_prod = annotations_full.parquet lit test_set = raw_test.parquet et train_set = raw_train.parquet
run-rag-annotations --skip-eval true (prédictions seules) --skip-eval false (calcule les métriques)
decide-coicop --extra-columns-file = observations.parquet --extra-columns-file = raw_test.parquet
final-output repart de observations.parquet et restaure le nom du fichier d’entrée repart de raw_test.parquet
report détecte l’absence de vérité terrain → prediction_report.qmd report.qmd (accuracy par niveau)
Note

La détection du mode par report est automatique : il teste bool_and(code IS NULL) sur la sortie de decide-coicop. Un seul code non nul dans un fichier de production suffit donc à faire basculer le rapport en mode évaluation.

Le mappage de colonnes (mode production) se fait par paramètres Argo, le pipeline n’imposant aucun nom de colonne en entrée :

Paramètre Argo Valeur par défaut Colonne pipeline produite
text_column NAT_DEP raw_product (libellé à coder)
shop_column MAG_DEP shop (enseigne)
budget_column MONT_DEP budget (montant €)
annee_column (vide) annee
source_column (vide) source

Échantillonnage

Pour tester le pipeline sans le payer en entier, l’échantillonnage est centralisé en un point unique : codif-regex. Le jeu à coder y est échantillonné une seule fois (random_state=42), et tous les classifieurs aval héritent des mêmes lignes via raw_test_without_regex.parquet — les prédictions restent donc comparables entre elles.

Paramètre Mode Effet
sample-observations production limite le nombre d’observations à codifier
sample-annotations évaluation limite le jeu à codifier et la taille de la KB d’annotations indexée par create-vector-db-annotations
Important

En évaluation, sample-annotations fait aussi basculer run-rag-annotations sur une collection Qdrant suffixée _test, pour ne pas écraser la collection de production avec une base vectorielle partielle.

# évaluation sur 100 libellés
argo submit argo/codif-pipeline.yaml -p sample-annotations=100

# production sur 100 libellés d'un fichier réel
argo submit argo/codif-pipeline.yaml \
  -p input_file=s3://projet-budget-famille/data/workflow_inputs/mon_fichier.csv \
  -p sample-observations=100

Le fichier d’entrée et son mappage

L’exemple utilisé comme fil rouge dans cette documentation est BDF_data_tickets_appli_20260320_a_codif.csv (séparateur ;, valeurs entre guillemets) :

ID_TICK NAT_DEP (produit) MONT_DEP MAG_DEP (enseigne) COM_DEP
10203_91_01 Gasoil 30.25 Station Netto Saint-Vite
10203_91_06 Ticket CB 40.24 Station Netto Saint-Vite
11622_91_08 Bagu. Tradition U Blé Bretagne 1.00 U Liffré
10521_91_03 Moyen frite Sce Pomme Frite 4.10 Mc Donald’s Civrieux-d’Azergues
11165_91_01 Illisible 0.00

Les colonnes non mappées sont conservées telles quelles et restituées dans le fichier livré.

Où aller ensuite