Quel est le dernier moyen (2026) pour obtenir une sortie JSON structurée fiable depuis des LLMs locaux dans n8n ?

Quelle est la meilleure façon (2026) d’obtenir une sortie JSON structurée fiable des LLM locaux dans n8n ?

J’utilise des modèles locaux (via Ollama) dans n8n et j’ai besoin d’une sortie JSON cohérente pour des choses comme le routage et la génération SQL.

Quelle est la meilleure pratique actuelle utilisée par les gens en 2026 ?

Les gens comptent-ils toujours sur :

  • Structured Output Parser + JSON Schema
  • L’ingénierie des invites
  • Les nœuds de code pour nettoyer la sortie

Ou y a-t-il une approche plus nouvelle et plus fiable ?

1 « J'aime »

Je ne traiterais pas cela comme un problème à une seule couche.

Pour les workflows liés au routage ou à SQL, je traiterais JSON comme un contrat d’interface :

  • invitez le modèle avec le schéma et un petit exemple valide
  • analysez la sortie
  • validez les clés requises, les types, les énumérations et les valeurs vides
  • réparez une fois en donnant au modèle l’erreur de validation
  • s’il échoue à nouveau, arrêtez ou routez vers un examen au lieu de deviner

Pour SQL en particulier, j’éviterais de laisser le modèle produire du SQL brut qui s’exécute directement. Un schéma plus sûr consiste à faire produire au modèle une intention structurée, des filtres, des choix de table/champ à partir d’une liste autorisée, puis à mapper cela à un modèle de requête que vous contrôlez.

La partie fiable n’est donc pas seulement « le modèle peut-il émettre du JSON ? » C’est « que se passe-t-il quand le JSON est manquant, mal formé, valide mais incorrect, ou non sécurisé ? »

1 « J'aime »

Bonne question — j’ai travaillé pas mal sur cela avec Ollama + n8n. Voici ce qui fonctionne vraiment de façon fiable en 2026 :

**1. Utilise le paramètre natif `format: json` d’Ollama (couche la plus fiable)**

Quand tu configures le nœud Ollama Chat Model, ajoute `format: json` dans les champs supplémentaires / paramètres du modèle. Cela force Ollama à limiter l’échantillonnage des tokens aux seuls tokens JSON valides — ce n’est pas de l’ingénierie d’invite, c’est imposé au niveau du modèle. Des modèles comme `llama3`, `mistral` et `qwen2.5` le supportent bien. Cela seul élimine ~80 % des résultats malformés.

**2. Associe-le au Structured Output Parser de n8n**

Combine format:json d’Ollama + le Structured Output Parser (avec un JSON Schema). Le schéma indique au modèle quels champs tu attends ; l’analyseur valide et extrait. Si tu fais du routage, ton schéma peut être aussi simple que `{ “route”: { “type”: “string”, “enum”: [“billing”, “support”, “sales”] } }`.

**3. Code node comme filet de sécurité**

Après l’analyseur, ajoute un nœud Code qui fait :

```js

const out = $input.first().json;

if (!out.route || ![‘billing’,‘support’,‘sales’].includes(out.route)) {

throw new Error('Invalid route: ’ + JSON.stringify(out));

}

return [{ json: out }];

```

Cela bloque les nœuds en aval pour que tu ne routes jamais mal en silence.

**4. Pour l’intention SQL spécifiquement**

Ne demande pas au modèle de produire du SQL. Demande-lui de produire une intention structurée : `{ “table”: “orders”, “filters”: [{“field”: “status”, “op”: “eq”, “value”: “pending”}], “limit”: 10 }`. Ensuite, ton nœud Code mappe cela à une requête paramétrée. Beaucoup plus sûr et plus fiable que du SQL libre.

**5. Boucle de réparation unique si nécessaire**

Pour les schémas complexes où le modèle échoue toujours occasionnellement, câble un nœud IF qui vérifie les erreurs d’analyse → renvoie à Ollama avec le message d’erreur ajouté à l’invite. Une réessai attrape la plupart des traînards. S’il échoue deux fois, route vers un fallback / révision humaine plutôt que de deviner.

La combinaison format:json + schema + validation Code est ce que j’utilise dans des workflows de style production. Fonctionne sans aucun nœud payant.

1 « J'aime »

Bienvenue @osman1!

Une chose qui vaut la peine d’ajouter à la pile : n8n dispose d’un nœud « Auto-fixing Output Parser » qui encapsule le Structured Output Parser. Si le modèle retourne du JSON mal formé, il envoie automatiquement l’erreur au LLM pour une seule tentative d’auto-réparation - aucune logique IF/retry manuelle nécessaire. Pour Ollama spécifiquement, passez aussi format: "json" dans les options du corps du nœud Ollama Chat Model pour contraindre l’échantillonnage des tokens au niveau du modèle, puis laissez l’Auto-fixing Parser appliquer votre schéma par-dessus. Cette configuration à deux niveaux (contrainte de format au niveau du modèle + réparation au niveau du parser) est l’approche la plus fiable que j’ai utilisée avec des modèles locaux.

1 « J'aime »

Les réponses ci-dessus couvrent bien la couche structurelle. Une couche supplémentaire à ajouter est la validation sémantique – détecter le JSON qui s’analyse correctement mais contient des valeurs qui n’ont pas de sens.

Quelques exemples : un champ de date qui s’analyse en tant que chaîne de caractères mais n’est pas une date valide. Un champ de statut avec le bon type mais une valeur en dehors de l’énumération autorisée. Un champ de prix ou de quantité avec un format plausible mais une plage implausible (0,0001 ou 99999999). L’analyseur d’auto-correction gère le cas où le modèle retourne du JSON malformé et réessaie une fois. Mais si la nouvelle tentative réussit sur le plan structurel, la sortie continue en aval même si les valeurs sont du charabia. La couche structurelle ne sait pas que shipping_cost ne devrait jamais être négatif.

La solution est un nœud Code après l’analyseur qui exécute des vérifications explicites : présence des champs obligatoires, assertions de type, appartenance à l’énumération et garde de plage. Si une vérification échoue, arrêtez l’élément ou acheminez-le vers une file de révision plutôt que de laisser les mauvaises données circuler.

La partie qui paie à long terme est de consigner chaque défaillance avec la sortie brute du LLM, le champ qui a échoué et un horodatage. Deux choses deviennent visibles dans ce journal qui ne sont pas visibles autrement : quels champs échouent 30 pour cent du temps (un problème d’invite à corriger) par rapport à ceux qui échouent 1 pour cent du temps (un cas limite à gérer dans l’acheminement). Et quand vous mettez à niveau le modèle local, vous pouvez comparer les taux de défaillance avant et après.

Les vérifications structurelles que Tony et pirateprentice ont décrites sont la bonne première couche. La couche sémantique est ce qui transforme « cela s’analyse » en « c’est assez fiable pour agir dessus ».

1 « J'aime »