>_ DevTrendsit

Lingua

Home

Linguaggi

Sezioni

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embedded Sicurezza
Python

Come Far Produrre JSON Valido a una Rete Neurale Senza Workaround e Richieste di Retry

Chiunque abbia provato a connettere un modello linguistico a un backend reale ha incontrato questo problema. Scrivi un prompt dettagliato, chiedi al modello di restituire rigorosamente JSON con la struttura richiesta, lo testi su dieci esempi: tutto funziona perfettamente. Ma alla centesima richiesta, la rete neurale improvvisamente dimentica di chiudere una virgoletta, aggiunge la frase "Ecco la tua risposta!" all'inizio della risposta, o inventa un campo inesistente. Di conseguenza, Pydantic lancia un errore di validazione e il tuo servizio va in crash.

Di solito gli sviluppatori risolvono questo problema con richieste di retry all'API, espressioni regolari complesse o tentativi di "correggere" la risposta corrotta dopo che è stata generata. Gli sviluppatori del team .txt hanno adottato un approccio diverso e hanno creato Outlines — una libreria che guida il processo di generazione del testo a livello del singolo token.

Come Funziona la Generazione Controllata

La maggior parte dei framework lavora con gli LLM come una scatola nera: inviano testo e aspettano una stringa pronta. Outlines intercetta il controllo durante il campionamento. A ogni passaggio di generazione, la libreria verifica quali token dal vocabolario del modello corrispondono allo schema specificato e quali violano le regole.

Se hai richiesto un numero, la libreria azzera semplicemente la probabilità di campionamento per tutti i token contenenti lettere o punteggiatura. Il modello fisicamente non può selezionare un simbolo non valido. Il risultato non è una speranza di JSON valido, ma una struttura garantita corretta dal primo tentativo.

Questo approccio risparmia token e tempo. Non devi più chiedere al modello nel prompt di "non aggiungere testo extra" o eseguire rigenerazioni quando il parsing fallisce.

Cosa Può Fare la Libreria

L'interfaccia di Outlines cerca di imitare la sintassi familiare dei tipi Python. Passi semplicemente il tipo di dati desiderato insieme al prompt.

Fissare le Opzioni di Risposta

Se hai bisogno di una scelta da un insieme limitato di valori, definiscila tramite Literal o Enum. Il modello non scriverà ragionamenti lunghi: emetterà immediatamente uno dei valori specificati.

import outlines
from typing import Literal
from transformers import AutoTokenizer, AutoModelForCausalLM

model_name = "microsoft/Phi-3-mini-4k-instruct"
model = outlines.from_transformers(
    AutoModelForCausalLM.from_pretrained(model_name, device_map="auto"),
    AutoTokenizer.from_pretrained(model_name)
)

# Модель вернет строго одно из трех слов
sentiment = model(
    "Оцени тональность ответа: 'Сервис работает отлично, спасибо!'",
    Literal["Positive", "Negative", "Neutral"]
)
print(sentiment)  # Positive

Generazione da Schemi Pydantic

Per oggetti complessi, puoi usare i modelli Pydantic standard. Outlines costruisce una grammatica basata sullo schema e garantisce che la struttura della risposta sia completamente conforme.

from pydantic import BaseModel
from enum import Enum

class TicketPriority(str, Enum):
    low = "low"
    medium = "medium"
    high = "high"
    urgent = "urgent"

class ServiceTicket(BaseModel):
    priority: TicketPriority
    category: str
    requires_manager: bool
    summary: str

prompt = """
Проанализируй обращение:
Срочно! Не могу войти в личный кабинет после оплаты. Через час презентация клиенту!
"""

# Модель сгенерирует JSON, который точно совпадает со структурой ServiceTicket
ticket_json = model(prompt, ServiceTicket, max_new_tokens=200)
ticket = ServiceTicket.model_validate_json(ticket_json)

print(ticket.priority)          # TicketPriority.urgent
print(ticket.requires_manager)  # True

Espressioni Regolari e Grammatiche

Se i modelli Pydantic sono troppo ingombranti per il tuo compito, puoi definire un'espressione regolare rigorosa. Questo è comodo per estrarre numeri di telefono, date, codici postali o creare DSL interni.

Con Quali Modelli Funziona

Outlines si adatta al tuo stack. La libreria supporta diverse modalità:

  • Inferenza locale tramite transformers e llama.cpp
  • Soluzioni server basate su vLLM e Ollama
  • API esterne come OpenAI e Gemini

Il beneficio maggiore dalla libreria si ottiene lavorando con i tuoi modelli locali o server di inferenza on-premise. È lì che il controllo diretto del masking dei token fornisce una garanzia del 100% della struttura e accelera il funzionamento.

Casi d'Uso in Produzione

In pratica, la libreria affronta diversi compiti di sviluppo comuni contemporaneamente:

  1. Smistamento automatico dei ticket. Estrazione di categoria, urgenza e tag dalle email dei clienti in entrata senza il rischio di ottenere un oggetto corrotto.
  2. Estrazione di entità con gestione di dati incompleti. Attraverso i tipi Union, puoi permettere al modello di restituire un oggetto compilato o una stringa esplicita con un messaggio sui dati mancanti.
  3. Chiamata di funzioni. Puoi passare una normale funzione Python al modello, e Outlines estrae automaticamente i tipi dai suoi argomenti per formare parametri di chiamata corretti.
  4. Categorizzazione del catalogo prodotti. Parsing rapido delle descrizioni dei prodotti in categorie, marchi e caratteristiche chiave.

Limitazioni e Sfumature

Con tutti i benefici, è importante capire le specifiche della tecnologia. Il calcolo delle maschere per i token richiede risorse aggiuntive. Se il tuo schema Pydantic è composto da decine di oggetti nidificati ed espressioni regolari complesse, la preparazione della grammatica prima dell'inizio della generazione potrebbe richiedere del tempo.

Inoltre, se lavori esclusivamente tramite l'API OpenAI, la libreria utilizzerà i meccanismi interni del provider (Structured Outputs / JSON Mode). In questo caso, Outlines agisce come un'interfaccia unificata comoda, ma il processo di campionamento stesso è controllato dal server OpenAI.

Outlines risolve un problema di ingegneria reale che ogni team affronta quando porta gli LLM in produzione. Il progetto rimuove l'instabilità dalla generazione e permette di lavorare con le reti neurali come normali funzioni tipizzate. Se stai costruendo servizi backend o agenti autonomi basati su modelli open, questo strumento merita sicuramente un posto nel tuo toolkit.

Progetti correlati