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

35
config/rules/router.yaml Normal file
View File

@@ -0,0 +1,35 @@
version: 1
# 'strict' => si un rule_id n'est pas listé dans base.yaml, il est considéré OFF
# quand le routage runtime est actif (objectif: pro / pas de surprise).
mode: strict
defaults:
# Socle pro: toujours actif (peu coûteux, structure la contestabilité)
enabled_packs:
- vetos_core
- decisions_core
# (Optionnel) règles toujours ON même si leur pack n'est pas actif
always_on_rules: []
# Triggers : activer des packs additionnels seulement si le dossier a des signaux pertinents
triggers:
- id: TRG-ELECTROLYTES
enable_packs: ["bio_electrolytes"]
when_any:
# Codes souvent porteurs d'ionogramme (hyponatrémie/hyperkaliémie/hypokaliémie)
codes_prefix: ["E87."]
# Ou biologie présente
lab_tests: ["ionogramme", "sodium", "potassium", "na", "k"]
# Ou texte
keywords:
- "ionogramme"
- "hypokali"
- "hyperkali"
- "hyponatr"
- "hypernatr"
- "kaliémie"
- "natrémie"
- "sodium"
- "potassium"