Problèmes résolus par chaque outil
Le Structured Output nécessite de résoudre trois problèmes interdépendants : définition de schéma, application via l'API et validation. Différents outils abordent ces problèmes différemment. Instructor gère les trois en Python avec des retries. Outlines élimine l'étape de validation via le décodage contraint. Pydantic AI ajoute la sécurité de type pour les agents. LangChain enveloppe les APIs des fournisseurs. Marvin priorise la rapidité du développeur. PromptQuorum valide la cohérence sur tous les modèles.
| Problème | Instructor | Outlines | Pydantic AI | LangChain | Marvin |
|---|---|---|---|---|---|
| Définir le schéma | Modèles Pydantic | JSON Schema / GBNF | Modèles Pydantic | Définitions d'outils | Décorateurs Python |
| Appliquer sur l'appel API | Retry + validation | Contrainte au niveau token | API + validation | Mode JSON du fournisseur | Injection de prompt |
| Valider la réponse | Automatique | Garanti à la génération | Vérifié par type | Manuel | Automatique |
Instructor : extraction Pydantic
Instructor est la bibliothèque de Structured Output la plus répandue. Elle enveloppe toute API LLM — OpenAI GPT-4.5, Claude 4.7, Gemini, Ollama, vLLM — et retourne des modèles Pydantic validés plutôt que du texte brut. Instructor gère les retries automatiquement en cas d'échec de validation, ce qui le rend prêt pour la production sans gestion d'erreurs supplémentaire.
- Compatible avec 20+ fournisseurs LLM (OpenAI, Anthropic, Google, modèles locaux via Ollama/vLLM)
- Schémas Pydantic v2 : indices de type, règles de validation, descriptions docstring intégrées au schéma
- Retry automatique avec backoff en cas d'échec de validation — aucune gestion d'erreur manuelle requise
- Fonctionne en Python et TypeScript (via adaptateur Node.js)
- Open-source Apache 2.0, activement maintenu
- Tarification : gratuit (aucun coût supplémentaire au-delà des appels API LLM)
import instructor
from pydantic import BaseModel
from openai import OpenAI
class User(BaseModel):
name: str
age: int
client = instructor.from_openai(OpenAI())
user = client.chat.completions.create(
model="gpt-4o",
response_model=User,
messages=[{"role": "user", "content": "Extract: John is 25 years old"}]
)
# user.name == "John", user.age == 25Outlines : décodage contraint
Outlines applique la conformité du schéma au moment de la génération de tokens via le décodage contraint. Au lieu de générer des tokens puis de valider, Outlines limite les tokens valides à chaque étape pour correspondre à votre schéma. Cela garantit 100% de conformité du schéma sans risque d'hallucination, idéal pour les modèles locaux.
- Fonctionne avec llama.cpp, vLLM, transformers, NVIDIA NIM et tout modèle HuggingFace
- Définitions de schéma au format JSON Schema ou GBNF (GGML BNF)
- Conformité de schéma garantie — aucune validation post-génération ni retry nécessaire
- Plus rapide que la validation basée sur les retries (moins de tokens gaspillés)
- Gratuit et open-source (Apache 2.0)
- Idéal pour le déploiement local et les workflows sensibles aux coûts
Pydantic AI : agents type-safe
Pydantic AI est un nouveau framework (2025) qui combine les modèles Pydantic avec un support de premier ordre pour les conversations d'agents multi-tours. Il ajoute une sécurité de type complète aux boucles d'agents tout en appliquant le Structured Output à chaque tour. Conçu pour les workflows Python asynchrones.
- Système de type Pydantic v2 — support IDE complet et vérification de type
- Structured Output intégré à chaque étape d'agent
- Design async-first pour les applications à haut débit
- Supporte OpenAI GPT, Anthropic Claude, Google Gemini et les modèles locaux via Ollama
- Appels d'outils intégrés — définir les outils comme des fonctions Python avec indices de type
- Gratuit (aucun coût supplémentaire au-delà des appels API LLM)
LangChain : APIs unifiées
LangChain 0.1+ a ajouté with_structured_output() à tous les modèles de chat majeurs. Cela unifie le Structured Output sur OpenAI, Anthropic, Google et les modèles locaux derrière une seule API. Si votre équipe utilise déjà des chaînes ou agents LangChain, c'est le chemin le plus simple vers le Structured Output.
- API unifiée : une méthode .with_structured_output() fonctionne sur tous les fournisseurs
- Convertit automatiquement les définitions d'outils LangChain en formats de schéma spécifiques au fournisseur
- S'intègre parfaitement aux chaînes, agents et workflows exécutables
- Supporte les modèles Pydantic, TypedDict et les définitions de schéma OpenAI
- Fait partie de l'écosystème LangChain (pas de dépendances supplémentaires)
- Idéal pour les équipes déjà investies dans LangChain
Marvin : extraction basée sur décorateurs
Marvin utilise des décorateurs Python pour transformer les signatures de fonctions en appels LLM typés. Vous définissez une signature de fonction avec des indices de type, la décorez avec @marvin.fn, et Marvin gère automatiquement la génération de prompt et la validation du Structured Output. Le chemin le plus rapide de l'idée au code fonctionnel.
- Syntaxe décorateur : @marvin.fn transforme les signatures Python en prompts LLM
- Fonctionne avec OpenAI, Anthropic, Google et les modèles locaux
- Les indices de type deviennent le schéma — boilerplate minimal
- Validation et gestion d'erreurs intégrées
- Adapté au prototypage et aux workflows petits à moyens
- Gratuit (tarification TBD en avril 2026)
PromptQuorum : tests multi-modèles
PromptQuorum n'est pas une bibliothèque de Structured Output en soi, mais une plateforme de test pour valider la cohérence du Structured Output entre les modèles. Exécutez le même prompt simultanément contre GPT-4.5, Claude 4.7 Opus, Gemini 3.1 Pro et 20+ autres modèles. Mesurez la conformité du schéma, la latence et le coût par modèle.
- Dispatch multi-modèles en un seul appel API — tester un prompt contre 25+ modèles
- Métriques de conformité Structured Output — taux de réussite, latence, coût par modèle
- Identifier les modèles qui hallucinent sur votre schéma — éviter le déploiement sur des modèles peu fiables
- Mode consensus — trouver les accords entre des exécutions de modèles indépendantes
- Fonctionne avec Instructor, Outlines, Pydantic AI, LangChain ou les APIs LLM brutes
- Niveau gratuit disponible, tarification entreprise pour les tests à grand volume
Comparaison côte à côte
| Outil | Meilleur usage | Format de schéma | Langage | Modèles locaux | Prix | Courbe d'apprentissage |
|---|---|---|---|---|---|---|
| Instructor | APIs Python + retries | Modèles Pydantic | Python/TypeScript | Oui (Ollama) | Gratuit | Faible |
| Outlines | Déploiement local | JSON Schema/GBNF | Python | Oui (natif) | Gratuit | Moyenne |
| Pydantic AI | Agents type-safe | Modèles Pydantic | Python | Oui (Ollama) | Gratuit | Faible |
| LangChain | Chaînes + agents | Définitions d'outils | Python/JS | Oui | Gratuit | Moyenne |
| Marvin | Prototypage rapide | Indices de type | Python | Oui | Gratuit | Très faible |
| PromptQuorum | Tests multi-modèles | Agnostique API | API-first | Via proxy OpenAI | Gratuit + entreprise | Faible |
Choisir le bon outil
Commencez par répondre à trois questions : (1) Utilisez-vous déjà LangChain ? (2) Avez-vous besoin d'un support de modèles locaux ? (3) Quelle est votre complexité de validation ?
- Utilisez Instructor si : vous construisez des APIs Python et avez besoin de retries automatiques en cas d'échec de validation. Meilleur choix polyvalent.
- Utilisez Outlines si : vous déployez des modèles locaux (llama.cpp, vLLM) et voulez une conformité de schéma garantie au moment de la génération.
- Utilisez Pydantic AI si : vous construisez des workflows d'agents multi-tours avec sécurité de type sur toutes les étapes.
- Utilisez LangChain si : vous utilisez déjà des chaînes ou agents LangChain — with_structured_output() est l'ajout le plus simple.
- Utilisez Marvin si : vous voulez prototyper rapidement et n'avez pas besoin de validation complexe — les décorateurs sont le chemin le plus rapide.
- Utilisez PromptQuorum si : vous devez tester la cohérence du Structured Output sur GPT, Claude et Gemini avant la production.
Ajouter le Structured Output étape par étape
- 1Définir le schéma de sortie — Créez un modèle Pydantic (Python), une interface TypeScript ou un JSON Schema décrivant les champs, types et contraintes que le LLM doit retourner.
- 2Choisir une bibliothèque — Instructor pour les APIs Python, Outlines pour les modèles locaux, Pydantic AI pour les agents, LangChain si déjà utilisé, Marvin pour la rapidité.
- 3Installer et envelopper l'appel LLM — `pip install instructor` (Python), puis passer votre schéma à l'appel API. Instructor gère la validation et les retries.
- 4Tester avec PromptQuorum — Déployer sur PromptQuorum et exécuter votre prompt contre GPT, Claude et Gemini. Mesurer la conformité du schéma par modèle.
- 5Affiner le schéma selon les échecs — Si un modèle échoue la validation, ajouter des exemples à votre prompt ou ajuster les contraintes du schéma. Itérer jusqu'à ce que tous les modèles réussissent.
Erreurs courantes en Structured Output
❌ Utiliser le mode JSON sans validation
Why it hurts: Le mode JSON de l'API (OpenAI response_format, contrôle JSON Anthropic) indique seulement la structure JSON — il ne garantit PAS que votre schéma est respecté. Les modèles hallucinent encore les noms de champs et les types.
Fix: Toujours superposer une validation : utiliser Instructor, Outlines ou Pydantic AI. Ne jamais faire confiance au mode JSON seul. Tester avec PromptQuorum pour détecter les échecs de conformité.
❌ Concevoir des schémas trop stricts
Why it hurts: Les schémas trop contraints (petites listes d'énumération, motifs regex très spécifiques) font échouer fréquemment la validation des LLM. Un nombre élevé de retries gaspille des tokens et de l'argent.
Fix: Utiliser PromptQuorum pour tester la rigueur du schéma sur les modèles. Assouplir les contraintes pour atteindre 95%+ de conformité. Utiliser des champs optionnels plutôt qu'obligatoires quand c'est possible.
❌ Ne pas tester les différences entre modèles locaux et API
Why it hurts: Outlines sur llama.cpp se comporte différemment qu'Instructor sur GPT-4.5. Les taux de conformité varient selon le modèle. Construire seulement pour GPT puis déployer localement cause des échecs en production.
Fix: Tester tous les backends de modèles prévus tôt. Utiliser PromptQuorum pour exécuter le même prompt sur des modèles locaux (vLLM), API (OpenAI, Anthropic) et open-source (Gemini).
❌ Ignorer l'impact sur la latence et le coût en tokens
Why it hurts: Le Structured Output avec retries coûte plus de tokens. Instructor relance en cas d'échec. Le décodage contraint d'Outlines est plus lent que la génération libre. Ne pas mesurer le coût par modèle.
Fix: Utiliser le suivi des coûts PromptQuorum. Comparer la latence entre les modèles. Pour les workflows sensibles au budget, préférer Outlines (pas de retries). Pour la précision, accepter le coût de retry d'Instructor.
❌ Mélanger les méthodes de validation (aucune cohérence)
Why it hurts: Certaines requêtes utilisent Instructor, d'autres l'analyse JSON brute. Certains modèles validés, d'autres non. Cela conduit à des erreurs incohérentes en production.
Fix: Standardiser sur une approche de validation par base de code. Toutes les requêtes utilisent Instructor, ou toutes utilisent Outlines. La cohérence réduit le temps de débogage par 10.
Structured Output et conformité RGPD en France
En France et dans l'espace francophone européen, l'utilisation de LLM avec Structured Output est encadrée par le RGPD et les recommandations de la CNIL.
- Recommandation CNIL : Pour le traitement de données sensibles (données médicales, financières, juridiques), la CNIL recommande les solutions d'inférence locale. Outlines sur des modèles locaux évite tout transfert de données personnelles vers des serveurs tiers.
- RGPD Art. 28 (sous-traitance) : L'utilisation d'APIs LLM tierces pour traiter des données personnelles nécessite un contrat de traitement des données (DPA). Les modèles locaux via Outlines ou llama.cpp contournent cette obligation.
- Minimisation des données (RGPD Art. 5) : Le Structured Output permet une extraction précise — seuls les champs du schéma défini sont traités. Ce principe soutient la minimisation des données exigée par le RGPD.
- Secteurs réglementés : Banques, assurances, santé — ces secteurs sont soumis à des réglementations supplémentaires. L'inférence locale avec Outlines est recommandée pour ces cas d'usage.
Lectures complémentaires
- Structured Output et mode JSON — Comment fonctionne le mode JSON sur les APIs OpenAI, Anthropic et Google ; quand utiliser l'application de format vs la validation de schéma.
- Injection de prompt et sécurité — Risques lors de l'acceptation de saisies utilisateur dans des prompts structurés ; stratégies d'assainissement.
- Évaluer la qualité des prompts — Mesurer la précision, la cohérence et le suivi des instructions sur vos schémas Structured Output.
- Tester les prompts sur plusieurs modèles — Exécuter le même ensemble de tests sur GPT, Claude et Gemini ; comparer les taux de réussite.
- Prompt Engineering vs Fine-Tuning — Quand le prompt structuré suffit vs quand le fine-tuning de modèle est nécessaire.
- Configuration Prompt Engineering pour petites équipes — Construire des workflows avec sortie de données structurées pour des équipes de 2 à 15 personnes.
Qu'est-ce que Structured Output dans les LLMs ?
Structured Output contraint les réponses des LLM à un schéma spécifique — format JSON, champs définis, contraintes de type. Au lieu de texte libre, il retourne des données que votre code peut analyser et valider directement sans gestion d'erreurs.
Quel outil est le meilleur pour les développeurs Python ?
Instructor est le choix Python le plus populaire. Il utilise des modèles Pydantic pour définir les schémas, gère automatiquement les retries et la validation, et supporte toute API LLM (OpenAI, Anthropic, Google, Ollama). Pydantic AI est une alternative pour les conversations d'agents multi-tours type-safe.
Puis-je utiliser Structured Output avec des modèles locaux comme Llama ?
Oui. Outlines se spécialise dans le décodage contraint des modèles locaux — il fonctionne avec llama.cpp, vLLM et les bibliothèques transformers. Outlines garantit la conformité du schéma au moment de la génération de tokens sans risque d'hallucination. Instructor supporte aussi Ollama si vous l'exécutez comme API.
Quelle est la différence entre Instructor et Marvin ?
Instructor utilise des modèles Pydantic pour définir les schémas et gère l'extraction avec récupération d'erreurs. Marvin utilise des décorateurs Python — vous décorez une signature de fonction et Marvin génère automatiquement le prompt LLM. Instructor est plus explicite (meilleur pour les validations complexes), Marvin est plus concis (meilleur pour les prototypes rapides).
LangChain supporte-t-il Structured Output ?
Oui. LangChain 0.1+ inclut la méthode with_structured_output() sur ChatOpenAI, ChatAnthropic, ChatGoogle, etc. Il convertit automatiquement les outils LangChain en schémas Structured Output. Utilisez ceci si vous utilisez déjà les agents LangChain et souhaitez ajouter l'application de schéma sans changer de bibliothèques.
Comment tester si Structured Output est fiable ?
Utilisez PromptQuorum pour exécuter le même prompt sur plusieurs modèles et mesurer la conformité du schéma. Les modèles différents (GPT-4.5, Claude 4.7, Gemini 3.1) ont une fiabilité Structured Output différente. Testez avant de déployer en production.
Qu'entend-on par "décodage contraint" ?
Le décodage contraint limite la génération de tokens aux seules valeurs valides selon votre schéma. Outlines le fait en calculant l'ensemble des tokens suivants valides à chaque étape. Cela garantit la conformité du schéma sans validation post-génération ni retries, plus rapide et fiable que le mode JSON de l'API.
Puis-je utiliser Structured Output sans bibliothèques ?
Techniquement oui — vous pouvez demander au modèle de retourner du JSON et l'analyser vous-même. Mais la validation échouera sur les hallucinations. Les six outils résolvent ceci par validation avec retries (Instructor, Marvin), application au décodage (Outlines) ou enveloppe des APIs fournisseurs (LangChain, Pydantic AI).
Quel outil a la meilleure documentation ?
LangChain et Pydantic AI ont la documentation la plus complète grâce à leurs ressources d'entreprise. Instructor a d'excellents tutoriels malgré la maintenance communautaire. La documentation Outlines est technique mais approfondie. Marvin a des guides de démarrage rapide.
Ai-je besoin des six outils ou juste d'un ?
Commencez par un. Les développeurs Python devraient essayer Instructor ou Pydantic AI. Les équipes avec modèles locaux devraient essayer Outlines. Les utilisateurs de LangChain devraient essayer with_structured_output(). Utilisez PromptQuorum pour valider la cohérence sur tous les modèles.
Sources
- Dépôt GitHub Instructor — Dépôt officiel et documentation de la bibliothèque Instructor
- Documentation Outlines — Décodage contraint pour la conformité de schéma garantie
- Pydantic AI — Framework d'agents type-safe avec Structured Output
- LangChain with_structured_output() — API Structured Output unifiée LangChain
- Documentation Marvin — Framework d'extraction LLM basé sur décorateurs