ArseneLupin – Le JEV Like d'Ibou qui décide au lieu de bavarder

Jev, je ne l’ai jamais utilisé mais Kev, en revanche, je l’ai branché dans mon outil de sélection de sujets de veille pour qu’il me dise notamment si un sujet correspond à ce qui me plaît ou pas. C’est en cours de test, donc je ne vais pas vous livrer de conclusion hâtive sur si ça fonctionne bien ou pas, mais si je vous en parle, c’est parce que Sylvain Peyronnet, le papa du moteur de recherche français
, publie à son tour 3 modèles de la même famille, baptisés ArseneLupin, conçu également pour faire du décisionnel
Pour ceux qui ne suivent pas l’actualité IA, le nouveau truc à la mode en ce moment, c’est Jev, un modèle maison de
qui est le premier de ce qu’ils appellent les modèles System One. Au lieu de générer du texte qu’il faut ensuite parser, ce reçoit un état (un texte, un ticket, un objet JSON) et des questions typées : oui ou non (noul), un choix parmi plusieurs options (choice) ou une note sur une échelle (score). Et il renvoie pour chacun de ces choix, des probabilités que votre code peut ensuite exploiter directement pour trier, faire du routage ou prendre des décisions. Par exemple, avec ça, on peut faire de la qualification de tickets de bug ou de l’anti-spam, ce genre de choses.
Alors forcément, suite à ça, des clones ouverts ont débarqué. Le premier que j’ai découvert, c’est
, de Jared Palmer, qui s’appuie sur Qwen3.5 et Qwen3.8, soit 0,8 à 27 milliards de paramètres, et
qui part d’un encodeur ModernBERT-large pour 421 millions de paramètres au total.
Perso, avec Kev dans mon outil de veille, Pour le moment, j’ai un peu de mal à voir si c’est mieux qu’une décision prise par un Qwen 3.6 classique qui génère une réponse textuelle mais Kev a été entraîné sur des textes de 384 tokens au max, et les articles qui tombent dans ma veille dépassent largement ce gabarit…
ArseneLupin, c’est donc la version d’Ibou, annoncée par Sylvain la semaine dernière. Sa v1.1 repose donc sur Qwen3.5-4B, la mini sur Qwen3.5-0.8B et ArseneLupinstral sur Ministral 8B. Les poids sont sous licence Apache 2.0 et le code pour s’en servir et l’intégrer est fourni, mais pas le code d’entraînement ni les données.
C’est encore jeune, donc il n’y a pas eu de benchmark indépendant, mais Ibou en a fait et voici ce qu’ils obtiennent avec une classification d’intentions de recherche en dix catégories. Avec la 1.1, ils obtiennent 50,7 % de bonnes réponses, contre 39,7 % pour la mini et 43,9 % pour Jev 1.13.
Bref, ce sont leurs mesures, mais si elles sont justes, ça veut dire qu’Arsène Lupin est plus efficace que Jev.
Installer ArseneLupin v1.1
Alors pour ce tuto, j’ai pris la
qui est la plus "balèze".
À la fin de cette section, vous aurez donc un serveur local qui crache du JSON accessible sur le port 8000. Il vous faut Python 3.11 ou une version plus récente et une 10aine de Go libre puisque le modèle complet pèse 9,3 Go en bfloat16.
J’exclus au téléchargement le dossier gguf, qui contient la version 8 bits de 4,5 Go destinée à llama.cpp. Pour démarrer, il faut donc créer un environnement virtuel, puis récupèrer le modèle, et installe le code de service avec la version de transformers qui va bien, c’est à dire la 5.17.0 :
python3 -m venv lupin && source lupin/bin/activate
pip install -U huggingface_hub
hf download IBOU-SEARCH/ArseneLupin-v1.1 --local-dir arsenelupin-v1.1 --exclude "gguf/*"
cd arsenelupin-v1.1
pip install ./code "transformers==5.17.0"
Par défaut, le fichier serve.yaml envoie le modèle sur une carte NVIDIA (cuda:0). Sur un Mac, il faudra donc le basculer sur le GPU d’Apple (mps), et sur une machine sans GPU, ce sera cpu. Je pense que je ne vous apprends rien, vous avez l’habitude,
Ensuite, on lance le serveur. Notez juste que sous Linux, le sed s’écrit sans les deux apostrophes après le -i. :
sed -i '' 's/cuda:0/mps/' serve.yaml
python -m arsenelupin serve --config serve.yaml --calibration calibration/default.json --port 8000

Le serveur ArseneLupin v1.1 à l’écoute sur le port 8000, poids chargés
Au bout de quelques secondes, le serveur écoutera sur 127.0.0.1:8000. Quant à la version GGUF, vous pouvez, si vous voulez, le faire tourner dans un llama.cpp ou équivalent à condition d’en avoir un assez récent qui connait l’archi de Qwen3.5.
Poser vos premières questions
Pour tester, je me suis inspiré de mon outil de veille. On donne au modèle le titre et le résumé d’un sujet et on lui demande si ça parle d’un outil qu’on peut installer, dans quelle rubrique il faut le ranger et à quel point ça pourrait intéresser des gens comme vous, c’est à dire des lecteurs technophiles / bidouilleurs.
Placez donc ça dans un fichier nommé veille.json, dans le dossier du modèle :
{
"state": {
"titre": "ArseneLupin, trois modèles de décision publiés par Ibou",
"resume": "Le moteur de recherche français Ibou publie sur Hugging Face trois modèles qui répondent par oui ou non, par un choix ou par une note, avec des probabilités. Les poids sont sous licence Apache 2.0 et le code de service est fourni."
},
"questions": {
"installable": {"type": "noul",
"instructions": "Le texte présente-t-il un outil que le lecteur peut installer lui-même ?"},
"rubrique": {"type": "choice",
"instructions": "Dans quelle rubrique ranger ce sujet ?",
"criteria": {"ia": "Intelligence artificielle et modèles de langage",
"dev": "Outils pour développeurs et infrastructure",
"securite": "Sécurité informatique, failles et vie privée",
"materiel": "Matériel, gadgets et bricolage électronique"}},
"interet": {"type": "score",
"instructions": "Ce sujet intéressera-t-il un lecteur technophile qui aime tester des outils ?",
"criteria": ["Pas du tout", "Un peu", "Beaucoup"]}
}
}
Puis dans un second terminal ouvert dans le même dossier, tapez la ligne de commande curl suivante pour lancer l’évaluation avec ArseneLupin.
curl -s http://127.0.0.1:8000/v1/systemone -H 'Content-Type: application/json' -d @veille.json | python3 -m json.tool

La réponse à la requête de veille : « ia » à 0,72, un oui/non hésitant à 0,53 et un score de 1,47
Comme vous pouvez le voir, pas une ligne de texte généré, chaque question revient avec ses probabilités. On voit donc que la rubrique « ia » l’emporte à 0,72, loin devant « dev » à 0,19, et le niveau « Beaucoup » ressort à 0,59 pour l’intérêt, ce qui donne un score moyen de 1,47 sur une échelle qui va de 0 à 2. Par contre, pour savoir si c’est un outil installable, le modèle hésite quand même un peu avec un timide 0,53 de probabilité pour le oui.
Il renvoie quand même une indication qui est plutôt importante à savoir là décision : "decision": true, car aucun seuil n’est appliqué côté serveur (c’est ce que dit le "decision_status": "unthresholded"). C’est donc à votre code de décider qu’en dessous de 0,7, par exemple, la décision revient à un humain plutôt que de partir dans la base de données automatiquement. Sur mon Mac Studio M4 Max, la requête a pris entre 2,4 et 2,8 secondes pour ces huit options.
J’ai fait un 2ème essai avec un commentaire de spam bien grossier : « Super article !!! Pour gagner 500 € par jour depuis chez vous, cliquez vite sur mon profil, places limitées. » La v1.1 le classe en spam à 0,86 et lui colle un ton positif à 0,78, ce qui est vrai au premier degré. Et la version mini du modèle répond deux fois plus vite, en 0,8 seconde, mais descend à 0,76 sur le spam et hésite sur le ton… À voir donc si ça suffit pour vous d’utiliser le modèle mini ou pas, selon vos besoins.
Comment ArseneLupin prend ses décisions
Le code livré avec le modèle se lit facilement et la mécanique est plutôt simple à capter. En fait chaque option devient une question oui/non posée au Qwen affiné, du genre « ce candidat décrit-il la bonne réponse ?« .
Ainsi, 4 catégories pour classer un contenu se résume en 4 questions sur le même texte accompagnée d’une petite tête de lecture (2 561 paramètres sur la v1.1) qui transforme le dernier état caché du modèle en score. Un softmax répartit ensuite ces scores en probabilités, et la confidence n’est rien d’autre que la plus forte d’entre elles…
Pour que ça reste rapide malgré toutes ces passes, le serveur lit une seule fois le texte commun aux options, puis calcule toutes les options simultanément.
En fait avec ArseneLupin, on reproduit le principe de Jev mais avec un LLM ouvert (Qwen) en ne lui faisant produire qu’un seul token, limité aux choix proposés. Ce qu’apporte Ibou, c’est donc un modèle LLM ultra affiné (Autant qu’un bon Saint Nectaire) pour ce type d’exercice de prise de décision.
Reste ensuite la confiance à accorder à ces probabilités. Dans le dossier calibration, vous verrez des températures ajustées selon les trois workflows d’exemple fournis par Ibou, et il y a également, dans le fichier default.json, une calibration par défaut. C’est celle-là qu’on a utilisée dans notre exemple, mais vous pouvez aussi régler vous-même votre propre température ajustée selon vos usages.
Maintenant, avant de lui confier quoi que ce soit, posez-vous un peu et donnez-lui une cinquantaine d’exemples que vous avez déjà classés à la main. Comme ça, vous pourrez comparer ArsèneLupin et le LLM que vous utilisez d’habitude pour savoir qui est le plus fiable. N’hésitez pas à y mettre aussi des textes plus ou moins longs parce que le serveur accepte jusqu’à 32 768 tokens par option. Ça tombe bien parce que ça me gênait un peu dans mon intégration avec Kev sur mon outil de veille. Donc je pense que je vais rapidement basculer sur ArsèneLupin pour ma veille en remplacement de Kev.
Et si vous venez de Jev, attention, la requête a la même forme mais pas la réponse !! Pour une question oui/non, Jev renvoie un champ noul là où ArseneLupin renvoie un p_yes, et pour une note, ArseneLupin range ses probabilités dans une liste quand Jev utilise un dictionnaire.
Cela veut dire qu’un client écrit pour l’API de TypeSafe ne lira pas du tout le résultat de ArseneLupin tel quel, donc prévoyez une petite couche de conversion avant de mettre les deux en concurrence sur vos data.
Source : korben.info