J'ai expédié un classificateur en production en janvier. L'invite demandait du JSON avec un seulcatégoriechamp. Pendant trois semaines, cela a bien fonctionné. Puis le modèle a commencé à revenir{"category": "bug", "explication": "cela ressemble à un crash"}et le consommateur a généré une erreur d'exécution car il n'attendait qu'une seule clé. Pas de changement de schéma, pas de déploiement. Le modèle a simplement décidé d’être utile.
Zod et un peu de discipline autour de l'étape d'analyse comblent cet écart. Ce didacticiel explique la définition des schémas pour les formes de sortie LLM, leur utilisation avec le SDK Vercel AI et le SDK Anthropic brut, et la création d'une boucle de nouvelle tentative qui gère les cas où le modèle se trompe toujours.
| Étape | Quoi | Pourquoi |
|---|---|---|
| Définir le schéma Zod | Décrivez la forme souhaitée | Source unique de vérité pour vos types |
| Utilisez generateText avec Output.object | Chemin du SDK Vercel AI | Appliqué par le schéma, indépendant du fournisseur |
| Utiliser l'outil avec tool_choice | Chemin du SDK anthropique | Force la sortie structurée sans wrappers supplémentaires |
| Analyser et réessayer en cas d'échec | ZodError détecte la dérive | Récupère sans planter les appelants |
La plupart des tutoriels LLM montrentJSON.parse (réponse)et appelle ça un jour. Le problème est que le modèle n'a jamais accepté votre schéma. Demandez-lui de revenir{"catégorie": "bug"}et cela pourrait revenir:
{"catégorie": "bug"}(correct){"Catégorie": "Bogue"}(mauvais boîtier){"category": "bug", "confidence": 0.9}(champ supplémentaire){"error": "Je ne peux pas classer ceci"}(utile, mais pas votre schéma)Sans une étape d’analyse qui valide réellement la forme, chacun de ces chemins corrompt silencieusement les données en aval.
Le correctif est trois lignes de Zod plus une.safeParse()appel. Chaque technique présentée dans cet article s'appuie sur ce modèle, que vous utilisiez le SDK Vercel AI, le SDK Anthropic brut ou les deux.
importer { z } depuis "zod" ; const ClassifyResult = z.object({category: z.enum(["bug", "feature", "question"]), }); tapez ClassifyResult = z.infer; // Au moment de l'exécution : const parsed = ClassifyResult.safeParse(JSON.parse(rawOutput)); if (!parsed.success) { // parsed.error est une ZodError avec des détails au niveau du champ console.error("Shape violation:", parsed.error.issues); } Installez Zod 4 (actuellement la version stable) :
npm installer zod@^4.0.0Les API principales (z.objet,z.string,z.enum,z.discriminate...
[Courte citation de 8% de l'article original]