Validation JSON
Pourquoi les LLMs produisent du JSON cassé
Les LLMs sont des générateurs de texte probabilistes. Même quand on leur demande de produire du JSON, ils génèrent occasionnellement :
- Du JSON enveloppé dans des balises markdown (
```json ... ```) - Du texte explicatif avant ou après le JSON
- Des virgules en trop dans les objets ou tableaux
- Des accolades ou crochets fermants manquants
- Des guillemets simples au lieu de doubles
- Des réponses tronquées en milieu d'objet
Sans couche de réparation, n'importe lequel de ces échecs fait planter votre pipeline.
Le pipeline en trois étapes
Étape 1 — Réparation structurelle
Avant la validation, la sortie brute du LLM passe par un pipeline de réparation :
- Suppression des balises markdown — retire
```json,```, et variantes similaires - Suppression du texte précédent — retire tout texte avant le premier
{ou[ - Suppression du texte suivant — retire tout texte après le dernier
}ou] jsonrepair— corrige les virgules en trop, crochets manquants, guillemets simples, caractères non échappés, et plus de 100 autres patterns courants
Étape 2 — Validation Zod
La chaîne réparée est parsée et validée contre le schéma Zod JSON Resume v1. Si elle passe, le résultat est retourné immédiatement.
Étape 3 — Retry auto-correcteur
Si la validation échoue, l'erreur Zod spécifique est formatée en prompt de correction et renvoyée au LLM :
CORRECTION REQUISE (Tentative 1) :
Validation échouée :
- "work.0.startDate" : Chaîne attendue, nombre reçu
- "basics.email" : Email invalide
Retournez UNIQUEMENT le JSON corrigé. Arrêtez immédiatement après l'accolade fermante.
Le LLM est invité à corriger exactement les champs qui ont échoué. Cette boucle s'exécute jusqu'à maxRetries fois (défaut : 3).
Utiliser le schéma Zod directement
import { JsonResumeSchema } from '@edwinfom/resume-intel'
// Valider vos propres données
const result = JsonResumeSchema.safeParse(myData)
if (!result.success) {
console.error(result.error.issues)
}Déduplication
Après l'extraction, les champs tableau sont dédupliqués par clé composite pour supprimer les entrées qui apparaissent plusieurs fois :
| Champ | Clé de déduplication |
|---|---|
work |
name + position + startDate |
education |
institution + studyType + startDate |
skills |
name |
languages |
language (insensible à la casse) |
projects |
name |
Fiabilité
En tests de production sur des CVs natifs et scannés :
- Étape 1 seule résout ~70% des sorties malformées
- Étapes 1 + 2 résout ~85%
- Étapes 1 + 2 + 3 (1 retry) résout ~97%
- Étapes 1 + 2 + 3 (3 retries) résout ~99%+