Ce qui se passe
Privatemode, service d'inférence hébergé en Europe sur de l'informatique confidentielle, publie une méthode pour faire d'un LLM ordinaire un « modèle de décision » : on lui soumet un état et des options nommées, il renvoie l'option choisie et une probabilité pour chacune. C'est ce que font des modèles entraînés pour cela, comme Jev de TypeSafe ou Kev, sa version ouverte présentée ici le 22 septembre. La différence : aucun réentraînement, le modèle est pris tel qu'il est livré.
Le mécanisme
Un LLM n'écrit pas de texte : à chaque pas, il produit une distribution de probabilités sur tout son vocabulaire. Quand la forme de la réponse est connue d'avance, lui faire écrire un objet JSON entier est du temps perdu.
- Numéroter les options dans le prompt, en JSON, et demander une réponse de
la forme
choice_index:suivi d'un numéro. - Préremplir la réponse : le message de l'assistant commence déjà par
choice_index:, donc le premier jeton produit est forcément un numéro. - Lire les probabilités de tous les numéros à cette seule position, les renormaliser sur les options, garder la plus probable.
{"state": "Le colis est arrivé ouvert et vide.",
"question": "Quelle équipe ?",
"options": [{"index": 0, "name": "livraison"},
{"index": 1, "name": "remboursement"},
{"index": 2, "name": "technique"}]}Un jeton, température 0, et une distribution complète. Elle sert aussi à décider quand faire intervenir un humain.
Sur vLLM
/chat/completionsaveccontinue_final_messageetadd_generation_prompt: false, pour que le modèle poursuive le message d'assistant prérempli. Cela permet aussi de joindre des images.allowed_token_idsmasque tout le vocabulaire sauf les numéros : un garde-fou, pas une nécessité.logprob_token_idsrenvoie la probabilité exacte des jetons demandés.top_logprobsne convient pas : il décrit la distribution avant le masque, des jetons de mise en forme occupent le haut du classement et des options paraissent à zéro.- Les identifiants de jetons dépendent du tokenizer (GLM-5.3-Flash a un jeton
unique pour
12) : la bibliothèque les demande au serveur, via/completionsavececho.
Les mesures
Sur 29 jeux de données publics étiquetés, de 2 à 151 options, en anglais et en allemand, GLM-5.3-Flash fait jeu égal avec Jev sur les 28 jeux textuels : chacun l'emporte sur 10, les 8 autres sont à moins d'un point, écart médian de 0,7 point en faveur de Jev, non significatif (p = 0,64). Laya, 421 millions de paramètres, reste 13 à 15 points derrière.
- Latence, une requête à la fois : 180 ms depuis l'Allemagne contre 264 ms pour Jev ; 299 ms contre 164 ms depuis les États-Unis.
- Coût : environ 62 € le million de décisions, contre 16 € pour Jev. Laisser le modèle raisonner d'abord gagne quelques points, pour environ 350 €.
- Images : 70,2 % sur RVL-CDIP (1 600 documents scannés, 16 classes), que Jev et Laya ne peuvent pas lire ; environ 270 € le million.
- Au-delà de 128 options, limite de
logprob_token_idschez Privatemode, la bibliothèque envoie la même requête deux fois et fusionne les résultats.
Même à température 0, jusqu'à 3,5 % des réponses changent d'une exécution à l'autre : le traitement par lots et l'arithmétique flottante rendent une passe non reproductible au bit près sur un serveur chargé.
Les réserves
Ce sont les mesures de l'éditeur, qui vend l'hébergement ; le banc d'essai est
publié pour les refaire. Le nom des options pèse : sur boolq, remplacer true
et false par correct et wrong coûte 20 points à GLM-5.3-Flash, contre
moins de trois aux deux autres.
Comment s'y prendre
La bibliothèque Python fonctionne avec tout point d'accès servi par vLLM, le vôtre compris :
edgelesssys/privatemode-decisions: oracle de jetons, prompt, masque, renormalisation ;edgelesssys/privatemode-decisions-benchmark: méthode, jeux de données, exécutions brutes.
Source : Turn GLM-5.3-Flash into a Jev-like System One model, Privatemode, 24 septembre 2026.