feat: architecture multi-modèles LLM + quality engine + benchmark

- Multi-modèles : 4 rôles LLM (coding=gemma3:27b-cloud, cpam=gemma3:27b-cloud,
  validation=deepseek-v3.2:cloud, qc=gemma3:12b) avec get_model(role)
- Prompts externalisés : 7 templates dans src/prompts/templates.py
- Cache Ollama : modèle stocké par entrée (migration auto ancien format)
- call_ollama() : paramètre role= (priorité: model > role > global)
- Quality engine : veto_engine + decision_engine + rules_router (YAML)
- Benchmark qualité : scripts/benchmark_quality.py (A/B, métriques CIM-10)
- Fix biologie : valeurs qualitatives (troponine négative) non filtrées
- Fix CPAM : gemma3:27b-cloud au lieu de deepseek (JSON tronqué par thinking)
- CPAM max_tokens 4000→6000, viewer admin multi-modèles
- Benchmark 10 dossiers : 100% DAS valides, 10/10 CPAM, 243s/dossier

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
dom
2026-02-20 00:21:09 +01:00
parent 5c8c2817ec
commit 909e051cc9
39 changed files with 5092 additions and 574 deletions

View File

@@ -0,0 +1,62 @@
# Garde-fous de parsing des valeurs biologiques
# ------------------------------------------------
# Objectif: éviter des faux positifs dus à des artefacts PDF/OCR
# (ex: "8" au lieu de "4.8" pour le potassium).
#
# IMPORTANT:
# - Ce fichier ne définit PAS des "normes biologiques" (ça c'est reference_ranges.yaml)
# - Ici on définit des bornes *plausibles* très larges + quelques heuristiques "anti-OCR".
#
# Clés des tests: minuscules, sans accents, ex: potassium, sodium, plaquettes, hemoglobine...
version: 1
policy:
drop_out_of_range: true # écarte les valeurs hors bornes plausibles du dossier
keep_suspect: true # conserve les valeurs suspectes (audit) mais les règles privilégient les valeurs ok
tests:
potassium:
hard_min: 0.5
hard_max: 9.0
suspect:
single_digit_over: 6.0 # "8" seul est souvent une décimale perdue (4,8 -> 8)
sodium:
hard_min: 90
hard_max: 200
plaquettes:
hard_min: 5
hard_max: 2000
hemoglobine:
hard_min: 3
hard_max: 25
creatinine:
hard_min: 1
hard_max: 5000
crp:
hard_min: 0
hard_max: 1000
alat:
hard_min: 0
hard_max: 5000
asat:
hard_min: 0
hard_max: 5000
ggt:
hard_min: 0
hard_max: 5000
pal:
hard_min: 0
hard_max: 5000
bilirubine totale:
hard_min: 0
hard_max: 2000