Le pipeline de réparation et validation JSON en trois étapes — jsonrepair, enforcement du schéma Zod, et boucle de retry auto-correctrice.

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 :

  1. Suppression des balises markdown — retire ```json, ```, et variantes similaires
  2. Suppression du texte précédent — retire tout texte avant le premier { ou [
  3. Suppression du texte suivant — retire tout texte après le dernier } ou ]
  4. 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%+