Manuel des sorties structurées pour les LLM
(nanonets.com)- Guide pratique pour les développeurs visant à résoudre l’instabilité qui survient lorsque les grands modèles de langage (LLM) génèrent des formats structurés comme JSON, XML ou du code
- En raison de leur nature probabiliste, les sorties peuvent se dégrader de manière non déterministe ; le guide traite donc des techniques de structuration déterministe pour y remédier
- Il couvre l’ensemble du processus, notamment le fonctionnement interne, le choix des outils et des techniques, le déploiement, la montée en charge et l’optimisation des coûts, ainsi que l’amélioration de la qualité des sorties
- Il rassemble les informations les plus récentes sur un domaine de la génération structurée qui évolue rapidement, sous la forme d’un document continuellement mis à jour
- Une ressource de référence indispensable pour les développeurs qui utilisent les LLM de manière programmatique pour l’extraction de données, la génération de code et l’appel d’outils
Pourquoi des sorties LLM structurées sont nécessaires
- Les LLM produisent la plupart du temps des sorties syntaxiquement valides en JSON, XML, code, etc., mais leur nature probabiliste peut entraîner des erreurs de format ou des résultats incomplets
- Cela pose problème dans les processus automatisés comme l’extraction de données, la génération de code ou l’appel d’outils
- Pour résoudre ces problèmes, une méthode de sortie structurée déterministe est nécessaire
- Le manuel couvre l’ensemble des outils et techniques afin d’aider les développeurs à mettre en œuvre des sorties structurées de façon fiable
Principaux contenus du manuel
- Il inclut des sujets orientés pratique comme le fonctionnement interne, les meilleurs outils et techniques, les critères de choix des outils, les méthodes de construction, déploiement et montée en charge d’un système, l’optimisation de la latence et des coûts, ainsi que l’amélioration de la qualité des sorties
- Chaque section est structurée selon une approche pas à pas directement applicable par les développeurs
- Les recherches récentes et les outils open source liés aux sorties structurées sont rassemblés et organisés dans un seul document
Actualité et mises à jour
- Les technologies de génération structurée évoluent très rapidement, ce qui rend les ressources existantes vite dépassées
- Ce manuel est maintenu comme un document vivant (living document) régulièrement mis à jour
- Les développeurs peuvent accéder aux informations les plus récentes en un seul endroit, sans avoir à parcourir de multiples articles de recherche, blogs et dépôts GitHub
Comment l’utiliser
- Il peut être lu intégralement dans l’ordre ou utilisé comme ouvrage de référence permettant d’aller directement au sujet nécessaire
- Conçu avant tout pour les développeurs en production, il permet une consultation rapide pour résoudre un problème précis
Créateurs et communauté
- Le manuel a été créé par l’équipe Nanonets
- Elle maintient le modèle Nanonets-OCR et la bibliothèque open source de traitement documentaire docstrange
- Une newsletter pour la communauté des développeurs LLM fournit toutes les deux semaines les dernières analyses, avancées, ainsi que des outils et techniques utiles
1 commentaires
Avis Hacker News
C’est vraiment un guide magnifique. J’ai particulièrement aimé les animations de transition entre onglets sur plusieurs pages
Je pensais déjà assez bien comprendre la generation contrainte par grammaire (j’ai même contribué à l’implémentation des grammaires dans llama.cpp), mais j’ai quand même tiré de nouveaux enseignements de ce guide
Je pense que les sorties structurées sont l’une des fonctionnalités les plus sous-estimées des moteurs LLM. Grâce aux contraintes grammaticales, on peut utiliser un LLM de façon fiable comme composant d’un pipeline plus large, par exemple un agent avec tool-calling
La sortie peut être sémantiquement fausse, mais elle est toujours correcte du point de vue grammatical. C’est particulièrement important quand on utilise des modèles locaux
Par exemple, comme dans l’exemple de filtre anti-spam sur Raspberry Pi de Jart, si on applique une grammaire au modèle TinyLlama pour qu’il ne produise que
"yes"ou"no", cela fonctionne de manière fiable même sur du petit matérielC’est vraiment un excellent guide. J’ai travaillé sur la génération structurée pendant mon doctorat, donc je partage quelques ressources pour les personnes intéressées
Côté bibliothèques, il y a Outlines, Guidance, XGrammar
Côté articles, je recommande Efficient Guided Generation for Large Language Models, Automata-based constraints for language model decoding, Pitfalls, Subtleties, and Techniques in Automata-Based Subword-Level Constrained Generation
Et côté billets de blog, LLM Decoding with Regex Constraints et Coalescence: making LLM inference 5x faster
Guide très bien organisé. Si vous voulez en savoir plus sur les optimisations de Guidance & llguidance, vous pouvez consulter notre court article
Ce guide couvre bien les deux approches que les gens utilisent le plus souvent. Cela dit, la génération contrainte peut s’écarter de la distribution native du LLM
Par exemple, quand un LLM génère un long objet structuré, il peut préférer des motifs comme « … », et la génération contrainte va le corriger de force avec un guillemet fermant ou autre, ce qui peut au final produire un mauvais résultat
À l’inverse, le resampling est plus robuste, puisqu’il recommence jusqu’à obtenir un résultat valide
Je pense aussi qu’au lieu d’allonger le contexte en y ajoutant des erreurs de schéma, il vaut mieux simplement réessayer, à la fois pour la qualité et pour le coût
Je me demande si les modèles SoTA (Opus, Gemini, etc.) ont encore besoin d’une enforcement du schéma de sortie
Aujourd’hui, les modèles font presque plus d’erreurs de syntaxe en JSON ou en génération de code, donc j’aimerais savoir s’ils continuent malgré tout à faire une validation de schéma en interne
Je comprends qu’on ait besoin de génération structurée pour les petits modèles
json\n, donc il reste plus sûr de spécifier un schéma de réponse JSONForcer des sorties structurées entraîne une baisse de performances. Dans certains cas, cela peut être 2 à 3 fois plus lent. Il faut juger selon le contexte si ce coût est acceptable
C’est un guide vraiment impressionnant. J’aurais aimé avoir ce genre de ressource il y a un an. Je vais absolument le partager autour de moi
Bon guide. J’ai particulièrement aimé le diagramme de masked decoding
Je me demande s’il existe un format de sortie plus fiable et plus facile à parser que JSON. YAML et TOML ont chacun leurs défauts, mais ils pourraient être meilleurs en nombre de tokens ou en coût
Je suis curieux de connaître la stack technique de la page de documentation / cookbook. Ça ne ressemble ni à MkDocs ni à GitBook ; j’aimerais savoir ce qui a été utilisé