Ajout d'un outil de benchmark des modèles d'analyse + support des modèles à raisonnement

- Nouvelle commande `inkflow benchmark` : compare la sortie d'analyse aux fichiers
  de référence (data/<slug>/reference/), met plusieurs modèles en concurrence,
  table rich + rapport JSON. Métriques : attribution de locuteur, incises, type/glued.
  Flags --models, --temperature, --reasoning, --stream, --use-cached + suivi par chapitre.
- analysis/benchmark.py : scoring pur (testable) + runner multi-modèles (un MLX à la fois).
- gemma.py : support des modèles à raisonnement (retrait de la pensée, désactivation
  via enable_thinking hors --reasoning, arrêt anticipé sur JSON complet, plafond +
  température dédiés anti-boucle), récupération du chat_template manquant (fix Mistral),
  streaming des tokens (set_token_sink).
- settings.py : gemma_reasoning, gemma_reasoning_max_tokens, gemma_reasoning_temperature.
- Tests : test_benchmark.py (scoring pur), test_gemma_reasoning.py.

Conclusion benchmark : Qwen3.6-27B-8bit non-raisonnant = meilleur modèle d'analyse.
This commit is contained in:
2026-06-21 03:25:50 +02:00
parent c1ab679686
commit 141df5f04e
6 changed files with 952 additions and 12 deletions

View File

@@ -74,7 +74,22 @@ class Settings(BaseModel):
# --- Generation Gemma ---
gemma_temperature: float = Field(0.1, ge=0.0, le=2.0)
gemma_max_tokens: int = Field(2048, ge=64, le=8192)
gemma_max_tokens: int = Field(2048, ge=64, le=16384)
# Modeles a raisonnement (Gemma 4, DeepSeek-R1, Qwen-think...) : ils emettent
# une chaine de pensee avant la reponse. Active le retrait de cette pensee
# (canaux <|channel>thought.../<channel|>, balises <think>...</think>) AVANT
# le parsing JSON, et releve le plafond de tokens (la pensee en consomme).
gemma_reasoning: bool = False
# Plafond de tokens en mode raisonnement (la pensee en consomme beaucoup).
# La generation s'arrete de toute facon des que la reponse JSON post-pensee
# est complete ; ce plafond est un garde-fou contre les boucles de pensee
# sans fin (certains modeles tournent en rond a temperature 0).
gemma_reasoning_max_tokens: int = Field(4096, ge=256, le=16384)
# Temperature en mode raisonnement. Le decodage GLOUTON (temp 0) fait boucler
# les modeles a raisonnement (repetitions sans fin) ; Qwen & co recommandent
# un echantillonnage. Si la temperature effective est 0, on bascule sur
# celle-ci. Rend le benchmark non deterministe en mode raisonnement (inevitable).
gemma_reasoning_temperature: float = Field(0.6, ge=0.0, le=2.0)
# --- Prompts systeme (analyse) ---
prompt_speakers: str = DEFAULT_PROMPT_SPEAKERS