Cosa fa sì che l’output di un LLM locale non rispetti uno schema JSON valido?

Eva Wong è la Technical Writer e smanettatrice residente di ZimaSpace. Una geek da sempre con una passione per homelab e software open-source, si specializza nel tradurre concetti tecnici complessi in guide accessibili e pratiche. Eva crede che l'auto-ospitare debba essere divertente, non intimidatorio. Attraverso i suoi tutorial, dà potere alla comunità di demistificare le configurazioni hardware, dalla costruzione del loro primo NAS al dominio dei container Docker.

L’output di un LLM locale non rispetta uno schema JSON valido quando generazione, gestione dei vincoli, regole di arresto e validazione non applicano lo stesso contratto.

Un flusso self-hosted può fornire uno schema conforme agli standard per i metadati dei file, le azioni della smart home, l’estrazione di documenti o gli argomenti degli strumenti e ricevere comunque un output malformato o rifiutato. “Schema valido” descrive il documento dello schema, non l’intero percorso di esecuzione. Il modello deve comprendere l’attività, il decoder deve supportare le funzionalità pertinenti dello schema, la generazione deve terminare prima che una condizione di arresto la interrompa, il parser deve recuperare un valore JSON completo e il validatore dell’applicazione deve applicare le regole di coercizione e la bozza prevista.

JSON valido e JSON conforme allo schema sono risultati diversi

Un oggetto può essere analizzato correttamente pur violando campi obbligatori, tipi, enumerazioni, limiti degli array o rami condizionali. Può anche contenere nomi di campo corretti, ma aggiungere proprietà vietate dallo schema.

Il modulo JSON di Python definisce il livello sintattico per decodificare un documento JSON, ma l’analisi non applica un contratto JSON Schema separato.

Questa causa è riconoscibile quando l’output viene caricato senza errori di sintassi, ma fallisce solo dopo la validazione dello schema. Una parentesi graffa mancante o una spiegazione finale sono problemi di serializzazione; una stringa al posto di un intero richiesto è una violazione del contratto.

La composizione dello schema può creare rami difficili da soddisfare

Parole chiave come allOf, anyOf, oneOf e not combinano i vincoli. Un ramo può essere valido singolarmente, mentre l’oggetto combinato non soddisfa nessuna delle alternative consentite oppure ne soddisfa diverse.

La guida JSON Schema spiega come le parole chiave di composizione dello schema modifichino il requisito che una o più sotto-strutture debbano corrispondere.

Un modello locale gestisce spesso un elenco semplice di proprietà in modo più affidabile rispetto a una logica condizionale annidata. Se gli errori si concentrano su unioni o forme di oggetti mutuamente esclusive, la difficoltà principale riguarda la selezione del ramo, non la punteggiatura JSON di base.

Il decoder vincolato potrebbe supportare solo una parte dello schema

I motori per l’output strutturato traducono gli schemi in vincoli sui token, grammatiche, espressioni regolari o regole specifiche del backend. Non tutti implementano ogni bozza o parola chiave JSON Schema.

vLLM espone diversi backend per l’output strutturato, mostrando che i vincoli basati su schema JSON, grammatica, espressioni regolari e scelte predefinite sono modalità di esecuzione separate.

Questa causa si manifesta quando lo stesso schema viene validato correttamente da un validatore conforme agli standard, ma fallisce solo con un determinato backend di inferenza. Ricorsioni, riferimenti, pattern o parole chiave condizionali non supportati possono essere semplificati, ignorati o rifiutati prima che il modello generi qualsiasi contenuto.

Le istruzioni del prompt possono entrare in conflitto con lo schema

Il prompt dell’utente può richiedere commenti, citazioni, spiegazioni, omissioni facoltative o un’incertezza espressa in linguaggio naturale, mentre lo schema richiede un singolo oggetto con campi fissi.

Il modello si trova quindi davanti a due criteri di successo in competizione: rispondere all’utente in modo discorsivo ed emettere solo token consentiti dal contratto della macchina. Un modello locale più piccolo può seguire l’istruzione più recente o più evidente invece di conciliarle entrambe.

Questi errori aggiungono spesso un’introduzione, un blocco Markdown, una spiegazione dopo l’oggetto o un valore che soddisfa la richiesta in prosa, ma viola l’enumerazione dichiarata. Lo schema è valido; la gerarchia delle istruzioni è incoerente.

Il troncamento può trasformare un piano corretto in un output non valido

Gli array e gli oggetti annidati richiedono un numero sufficiente di token generati per chiudere ogni struttura. Un limite di token, una stringa di arresto, una richiesta annullata o uno stream interrotto possono terminare la risposta prima che arrivino i delimitatori finali.

Transformers espone controlli sulla quantità massima di token e sull’arresto che determinano quando termina la generazione.

Questa causa si distingue per la presenza di prefissi validi che terminano bruscamente, soprattutto con array più grandi o campi stringa lunghi. Violazioni ripetute dei tipi all’inizio indicano un problema diverso; parentesi quadre o graffe mancanti vicino al limite dell’output indicano una generazione incompleta.

La semantica del validatore può rifiutare valori che il modello considera equivalenti

Un modello può emettere "3" per un intero, null per un campo omesso, un’enumerazione in minuscolo o una data ISO in un formato diverso da quello previsto dall’applicazione.

Pydantic documenta distinte categorie di errori di validazione per valori mancanti, JSON non valido, discrepanze nelle enumerazioni, campi extra vietati e tipi incompatibili.

Se ogni errore riguarda lo stesso campo e contiene un valore analizzabile ma rifiutato, la causa non è una rottura casuale dello schema. È un disaccordo su coercizione, rigore, possibilità di usare valori nulli, maiuscole e minuscole o formati a livello applicativo.

I vincoli grammaticali possono preservare la sintassi, ma non il significato operativo

Una grammatica può bloccare parentesi graffe e chiavi non valide, consentendo comunque combinazioni semanticamente impossibili, come una data di fine precedente a quella di inizio o un percorso di file inesistente.

llama-cpp-python fornisce la generazione vincolata da grammatica come controllo dell’inferenza, ma la grammatica governa la struttura dei token consentiti, non la verità esterna.

Un errore dello schema causato da regole tra più campi può comparire solo in un secondo livello di validazione. L’output può essere sintatticamente e strutturalmente valido, ma rimanere inutilizzabile per il flusso di lavoro del server domestico.

La post-elaborazione può corrompere un output del modello altrimenti valido

Le applicazioni a volte rimuovono Markdown, estraggono il primo blocco delimitato da parentesi graffe, uniscono i frammenti di uno stream, correggono le virgole o convertono i valori prima della validazione.

Una risposta valida del modello può diventare non valida quando un frammento dello stream viene duplicato, Unicode viene decodificato in modo errato, una sequenza di escape viene rimossa o una funzione di correzione modifica contenuti annidati. Al contrario, una fase di correzione può nascondere il fatto che l’output grezzo del modello non fosse valido.

La spiegazione di ZimaSpace sul motivo per cui i modelli locali di piccole dimensioni producono allucinazioni durante l’output JSON offre un contesto correlato: la validità dello schema e la correttezza fattuale devono essere misurate separatamente, conservando la risposta grezza prima delle trasformazioni dell’applicazione.

Domande frequenti

Il JSON valido dimostra che l’output corrisponde allo schema?

No. L’analisi JSON verifica la sintassi. La validazione dello schema controlla separatamente proprietà obbligatorie, tipi, enumerazioni, rami, limiti e altri vincoli dichiarati.

La temperatura zero impedisce gli errori dello schema?

No. Può rendere più ripetibile un percorso di decodifica, ma non aggiunge funzionalità dello schema non supportate, non impedisce il troncamento e non risolve istruzioni in conflitto.

La decodifica vincolata garantisce un record utilizzabile per l’automazione?

No. Può garantire vincoli strutturali supportati, ma regole operative, ancoraggio alle fonti, esistenza dei file, autorizzazioni e coerenza tra i campi richiedono comunque una validazione dell’applicazione.

Hub Tecnologico e AI

Altro da leggere

Get More Builds Like This

Stay in the Loop

Get updates from Zima - new products, exclusive deals, and real builds from the community.

Stay in the Loop preferences

We respect your inbox. Unsubscribe anytime.