Démonstration pour Huwise · data.education.gouv.fr

Nous ne remplaçons pas Huwise. Nous proposons une boucle de mesure et d'optimisation sûre, au-dessus de ses outils existants.

1 · Votre architectureReconstituée depuis vos pages publiques, chaque bloc avec sa source et son statut.
2 · Deux couchesContext Optimizer (le contexte de chaque requête) et AutoContext Lab (les expériences, en preprod).
3 · La preuveMêmes questions, même modèle, trois configurations, résultats enregistrés avec leur taille d'échantillon.
Origine de l'informationVERIFIEDconfirmé par la documentation publique (lien) INFERREDreconstruction plausible, non documentée PROPOSEDnotre proposition
ExécutionLIVEexécuté maintenant RECORDEDexécution réelle enregistrée SIMULATEDentrée modifiée exprès (fixture)
Écran 1–2 · Architecture

Une seule carte, quatre lectures

Cliquez un bloc : rôle, entrées/sorties, outils réels, exemple, statut et sources. Les traits distinguent métadonnées, schéma, requêtes de données, retour d'usage et gouvernance.

Écran 3 · Trace d'une question

« Combien y a-t-il de collèges à Dijon ? »

Chaque étape réellement exécutée : entrée, outil, sortie, temps, jetons, source, statut. La configuration A suit les noms des outils Huwise MCP, mais ce n'est pas le serveur Huwise (clé API requise) : c'est notre agent, même modèle, avec des outils génériques.

Écran 4 · Observer une erreur

Une erreur reproductible, et ce qui la rattrape

Requêtes réelles sur data.education.gouv.fr, rejouables par n'importe qui. Ce ne sont pas des erreurs de Huwy : ce sont des pièges de format que tout agent rencontre.

nom_commune='DIJON' → 0 ligne ; la donnée est écrite 'Dijon' → 23.

where = nom_commune='DIJON' and type_etablissement='Collège'

code_departement='21' → 0 ligne ; le code est écrit '021' → 74 collèges.

where = code_departement='21' and type_etablissement='Collège'

Context Optimizer

Ce que fait l'Optimizer : sur un résultat vide, il demande au portail comment la valeur est écrite et le dit à l'agent ; sur la route FAST, la valeur est résolue avant la requête.

{"total_count": 0, "hint": ["nom_commune: 'DIJON' is stored as 'Dijon'"]}
{"total_count": 0, "hint": ["code_departement: codes are written with leading zeros, try '021'"]}
Écran 5 · AutoResearch en preprod

Une modification à la fois, mesurée, gardée ou annulée

Le lab ne peut modifier que les fiches (description, synonymes, modèle de requête, note). Il ne voit jamais le holdout, ne touche ni l'évaluateur, ni les réponses attendues, ni le validateur, ni le journal.

Budget par cycle

  • max_proposals = 3
  • max_llm_calls = 150
  • max_seconds = 3600
  • control_cases = 10

Quality gate (fixé avant) gate-2026-11-11.1

  • min_fixed = 1
  • max_broken_control = 0
  • max_new_wrong_confident = 0
  • max_new_query_errors = 0
  • max_tokens_increase_pct = 25

Journal (append-only, chaîné)

Aucun cycle enregistré pour l'instant.

Écran 6 · Comparer A / B / C

Mêmes questions, même modèle, trois configurations

A : outils génériques nommés comme ceux de Huwise MCP (pas le serveur Huwise). B : nos fiches compilées. C : fiches + Context Optimizer. Notation sans juge LLM : la valeur est comparée à une requête API de référence.

Le serveur Huwise MCP réel transmet des facettes que notre A n'a pas : A sous-estime probablement Huwise. Un vrai test A demande une clé API du portail.

RECORDED

Pas encore de run A/B/C complet.

Expériences internes antérieures (A contre B seulement, jeu de 30 questions vu pendant le développement) — historique, pas une preuve contre Huwy.
modelABrunsdate
openai/gpt-5.4-mini40.0 %90.0 %#10/#1110.11.2026
nvidia/nemotron-3-ultra-550b-a55b:free30.0 %80.0 %#3/#410.11.2026
Écran 7 · Sécurité et promotion

La prod ne change que par une décision humaine

PRODUCTION · context.smiro.dev

base ctxc · index cards · graphe Neo4j (écriture) · MCP public en lecture seule · aucun endpoint d'administration

PREPROD · context-preprod.smiro.dev

base ctxc_preprod · index cards_preprod · graphe partagé en lecture seule · le lab ne tourne qu'ici · budget modèle plafonné

Promotion : un humain lit le diff et les mesures, applique la modification en prod, observe (canari), et peut revenir à la version précédente de la fiche en une commande.

Écran 8 · Méthode scientifique

Ce que nous empruntons, et ce que ces travaux ne prouvent pas pour Huwise

Aucun de ces travaux ne mesure un portail Huwise : seule l'évaluation de cette page dit quelque chose ici.

AutoResearch — Andrej Karpathy

Ce que le travail montre
Un agent modifie le code d'entraînement d'un petit modèle, lance un run court à budget fixe, garde ou jette selon la métrique, et recommence (program.md).
Ce que nous en faisons
La même boucle sur des fiches de contexte : une modification, éval reproductible, garder/annuler, journal. Évaluateur et réponses attendues hors de portée.
Limite
AutoResearch porte sur l'entraînement de modèles ; « AutoContext » est notre transposition, pas une idée de Karpathy.

DSPy / MIPRO — Opsahl-Ong et al., EMNLP 2024

Ce que le travail montre
Optimiser ensemble instructions et exemples de programmes LLM à plusieurs étapes améliore les résultats sur leurs bancs d'essai.
Ce que nous en faisons
Pas de dépendance ajoutée : la proposition de modifications est un point d'extension ; un optimiseur de ce type n'est gardé que s'il gagne sur le holdout.
Limite
Non exécuté ici : budget modèle gratuit insuffisant pour une recherche d'instructions.

LLMCompiler — Kim et al., 2023

Ce que le travail montre
Planifier les appels d'outils et exécuter en parallèle ceux qui sont indépendants réduit latence et coût sur leurs tâches.
Ce que nous en faisons
Sur la route FAST, le plan est connu d'avance (résoudre la valeur → compter) : pas d'appel modèle. Les dépendances sont respectées : jamais de requête avant le schéma.
Limite
Pas de parallélisme d'outils dans l'agent pour l'instant.

RouteLLM — Ong et al., 2024

Ce que le travail montre
Router chaque requête vers un modèle fort ou faible selon la difficulté prédite réduit le coût à qualité comparable.
Ce que nous en faisons
Le routeur choisit un chemin (FAST / STANDARD / DEEP), pas un modèle ; règles déterministes, repli prudent quand la confiance manque.
Limite
Les gains de l'article ne se transposent pas : seuls les chiffres mesurés ici comptent.

Metamorphic & property-based testing

Ce que le travail montre
Des relations entre sorties (si l'entrée change ainsi, la sortie doit changer ainsi) trouvent des erreurs sans oracle complet.
Ce que nous en faisons
Publics ≤ total, même lieu, même jeu, même date ; tests de propriété sur le validateur ODSQL (identifiants inconnus, commentaires, paramètres en trop).
Limite
Complète les réponses de référence, ne les remplace pas.

OpenTelemetry · SRE (SLI/SLO)

Ce que le travail montre
Traces faites de spans avec attributs ; objectifs de service et budget d'erreurs pour décider quand ralentir les changements.
Ce que nous en faisons
Chaque réponse porte ses spans (route, requête, vérification) avec temps et statut ; jamais la clé ni le prompt.
Limite
Pas de collecteur OTel déployé : inutile à cette échelle.
Écran 9 · Détails techniques

Le code, les données, le déploiement

modulerôle / role
sources/explore.pyExplore API v2.1 scan: 314 datasets, 6 976 fields → MariaDB
ctx/compile.py · ctx/export.pycards (short ≤ 400, full ≤ 1 500 tokens), versioned · llms.txt + 314 pages
projections/es.py · graph.pyElasticsearch BM25 + usage boost (routing per portal) · Neo4j shared keys / lineage
tools/ · mcpserver.pyMCP find_dataset · explain_dataset · query (ODSQL whitelist) · /api/demo/run
optimizer/recipes · values · router · cache · evidence · pipeline · scenarios · record_traces
lab/cycle (guard, diagnose, static check, gate, budget) · log (hash chain) · policy.json
evals/golden sets (education 30, education_v2 95 with dev/val/holdout) · runner (A/B/C, no LLM judge) · improve
Python 3.12Django + DRF 5.2MCP Python SDK 2.3MariaDB 11.4Celery 5.6RabbitMQ 4.1Elasticsearch 8.15Neo4j 5.26Docker ComposeTraefik proxy + TLSNginx siteLet's Encrypt HTTPS

Limites honnêtes

  • A n'est pas le serveur Huwise MCP : il faut une clé API du portail pour mesurer le vrai (décision du propriétaire du compte).
  • Modèle gratuit (OpenRouter) : résultats variables d'un run à l'autre ; tailles d'échantillon affichées, intervalles de confiance larges.
  • Les 30 questions historiques ont été vues pendant le développement ; le holdout du jeu v2 est la mesure propre, mais il est écrit par le même auteur.
  • Les recettes couvrent une forme de question (compter des établissements par type, statut, lieu) ; tout le reste passe par l'agent.
  • Compression par question et parallélisme d'outils : décrits, non activés ; preprod partage les serveurs MariaDB/ES/Neo4j (bases et index séparés).
  • L'intérieur de Huwise (stockage, classement, orchestration, modèle de Huwy) n'est pas public : la carte ne l'affirme pas.

/data/architecture.json · /data/scenarios.json · /data/comparison.json · /data/lab.json · /llms.txt · MCP: https://context.smiro.dev/mcp