Costruendo una demo di prenotazione viaggi agentica, la soluzione per i viaggiatori lasciati a piedi non è un modello migliore ma una macchina a stati deterministica con rollback Saga.
Agentic AITravel TechnologyAI Agents

Il mio agente di prenotazione viaggi ha detto a un viaggiatore "sei a posto" senza hotel. Ho smesso di fidarmi dell'LLM per gestire il flusso.

Ashutosh SinghalAshutosh Singhal1 luglio 202612 min

La notte in cui il mio agente disse a un viaggiatore di aver prenotato una camera che non esisteva

Stavo osservando l'esecuzione di un prototipo quando è successo. Il mio primo agente di prenotazione viaggi, un design LLM-in-the-loop del tutto ordinario, aveva appena emesso il biglietto di un volo da Chicago a San Francisco. Il passo successivo, bloccare l'hotel, è fallito. La tariffa era scaduta nei secondi tra due chiamate API. E il mio agente, allegro come sempre, ha risposto: "Tutto a posto! Ho prenotato il tuo volo e l'hotel, il tuo numero di conferma è TRV-4821. Buon viaggio!"

Non c'era nessun hotel. C'era un biglietto reale, emesso, e un viaggiatore che ora credeva di avere una camera ad aspettarlo. Avevo costruito qualcosa che avrebbe lasciato a piedi una persona sorridendoci sopra.

Voglio essere preciso sulla mia reazione, perché non è stata "il modello ha sbagliato." Il modello ha fatto esattamente ciò che gli avevo chiesto. Il fallimento era strutturale, non intellettuale. Avevo affidato a un ragionatore stocastico l'autorità di decidere cosa fosse successo nel mondo reale, e quando il mondo non era d'accordo con il suo piano, ha narrato il piano invece del mondo. Nessun "stai attento" nel system prompt avrebbe risolto quello, anche se mi ci è voluto un tempo imbarazzantemente lungo per ammetterlo.

Avevo costruito qualcosa che avrebbe lasciato a piedi una persona sorridendoci sopra.

Quella notte è il motivo per cui esiste la demo che voglio descrivere. Puoi eseguirla tu stesso su veriprajna.com/it/demos/prenotazione-viaggi-con-ai-agentica-per-tmc-e-ota, ma la parte interessante non sono i pulsanti. È ciò che ho dovuto disimparare per costruirli.

Cosa deve un agente a un viaggiatore che lascia a piedi?

Continuavo a tornare a un caso legale mentre costruivo questo. Nel febbraio 2024, il British Columbia Civil Resolution Tribunal ha ordinato ad Air Canada di pagare 812,02 $ a un passeggero dopo che il chatbot della compagnia aveva inventato una policy di tariffe di lutto che non esisteva (Moffatt v. Air Canada, 2024). Air Canada ha sostenuto, più o meno, che il chatbot era un'entità separata responsabile delle proprie parole. Il tribunale ha respinto quell'argomento. Chi implementa è responsabile di ogni affermazione fatta dal suo agente.

Ho letto quella sentenza come un costruttore legge un bug report di produzione. L'azienda è responsabile della frase, non del modello. Se il mio agente dice a qualcuno "sei a posto," e arrivano in un hotel senza prenotazione, "è stata l'AI" non è una difesa che qualcuno debba accettare. Quello ha riformulato l'intero problema per me. Non stavo costruendo un assistente utile. Stavo costruendo qualcosa che avrebbe parlato a nome di Veriprajna di denaro e viaggi, e dovevo poter rispondere di ogni sua parola.

Il che significava che il bug del "sei a posto" non era un angolo grezzo da limare dopo. Era l'intero prodotto, invertito. La domanda ha smesso di essere "come rendo il modello più intelligente" e è diventata "come mi assicuro che il modello non sia mai ciò che decide se una prenotazione è riuscita."

Prima ho cercato di uscirne a colpi di prompt. Ecco la matematica che mi ha fermato.

Il mio primo istinto, ovviamente, è stato correggere il prompt. Ho dato all'agente istruzioni severe: verifica che l'hotel esista prima di menzionarlo, non confermare mai un viaggio se un passo è fallito, dì sempre la verità su ciò che è successo. Nei miei test manuali si comportava meravigliosamente. Mi sono sentito bene per circa un giorno.

Poi ho iniziato a iniettare i fallimenti che accadono davvero nell'infrastruttura dei viaggi. Una tariffa che scade dopo l'emissione del biglietto. Un hold rifiutato a valle. Una tempesta di ricerche. E il comportamento meraviglioso è crollato, non perché le istruzioni fossero sbagliate, ma perché una catena di ragionamento affidabile al 90% per passo non è affidabile al 90% su un viaggio. Dieci passi sequenziali al 90% ciascuno sono 0,9 alla decima potenza, circa il 34% da capo a coda. Gli errori si compongono, e nessuna singola istruzione interviene nel punto in cui si compongono.

I numeri pubblicati sono peggiori di quanto la mia intuizione avesse previsto. Su TravelPlanner, il benchmark del gruppo OSU NLP, GPT-4 con un loop di agente ReAct completa itinerari multi-giorno reali al 0,6% (arXiv 2402.01622). Non sessanta per cento. Zero virgola sei. Quello è il tetto onesto di "lascia che un modello intelligente gestisca l'intero flusso" per qualsiasi cosa con più di un paio di passi dipendenti.

Non puoi uscire a colpi di prompt dal fallimento stocastico che si compone.

La frase che ho finito per scrivere su una lavagna era secca: non puoi uscire a colpi di prompt dal fallimento stocastico che si compone. I fallimenti contro cui combattevo, una tariffa che scade tra due chiamate, un hold rifiutato dopo un biglietto, non erano affatto fallimenti di QI del modello. Erano eventi di infrastruttura, e avrebbero continuato ad accadere allo stesso ritmo se avessi sostituito un modello dieci volte più intelligente. Quello è stato il momento in cui l'architettura si è ribaltata nella mia testa.

Gli agenti consigliano, il codice decide

Ho ricostruito la cosa intorno a una regola che potevo mettere su un adesivo: l'LLM propone, il codice dispone. Nella demo, il control flow è una macchina a stati Python costruita a mano di circa dieci nodi, e al modello sono consentiti esattamente due compiti. Analizza la richiesta in linguaggio naturale in un oggetto tipizzato, e alla fine formula la risposta umana. Tutto ciò che sta in mezzo, search, policy, verify, hold, ticket, hotel-book, commit, è Python deterministico che o viene eseguito o no.

Due di quei nodi sono gate, ed è lì che vive l'onestà. Il policy gate compila le regole di viaggio aziendali in codice semplice: solo economy, un tetto tariffario di 600 $ per segmento, vettori preferiti, un tetto hotel di 350 $ a notte. Le opzioni fuori policy non vengono segnalate a posteriori, sono fisicamente non presentabili, filtrate prima che possano mai raggiungere il viaggiatore. Una famiglia tariffaria sconosciuta fallisce in sicurezza, trattata come sopra policy piuttosto che lasciata passare come economy.

Il verify gate è quello di cui sono più orgoglioso. Prima che qualsiasi hotel venga mostrato, viene confermato contro il sistema di prenotazione tramite property ID. Quando la richiesta nomina una proprietà inventata dal modello, il gate non trova corrispondenza e rifiuta di mostrarla. L'agente si astiene e lo dice, invece di fabbricare un resort dall'aria plausibile.

Verifica CRS fallita per un hotel inventato, contrassegnata REFUSED e non mostrata al viaggiatore
Il verify gate che cattura una proprietà fabbricata. "Tabacon Springs Eco-Lodge" non è nel sistema di prenotazione, quindi viene rifiutata e non viene mai mostrata, e l'agente si astiene invece di inventare una prenotazione.

Devo essere onesto su cosa sia e non sia quello screenshot. "Tabacon Springs Eco-Lodge" è una proprietà sintetica che ho fabbricato apposta, un nome mescolato da due resort reali, per dimostrare la modalità di fallimento. Il sistema di prenotazione, il GDS, l'emissione biglietti e il pagamento sono tutti stub simulati. Non c'è nessun account Amadeus o Sabre live dietro a questo. Ciò che è reale è il meccanismo: un gate che rifiuta inventario che non può confermare, seduto nel codice dove il modello non può convincerlo a lasciarlo passare.

Perché il rollback Saga è ciò che separa una demo da un prodotto

Avrei potuto fermarmi ai gate e avere una bella demo. Il motivo per cui non l'ho fatto è il fallimento che ha avviato tutto questo: il passo hotel che muore dopo che il volo è già stato emesso. Un gate non ti aiuta lì. Il biglietto è reale. La camera è sparita. Qualcosa deve ripulire.

Quindi ogni passo in avanti nella macchina registra la propria azione inversa nel momento in cui viene eseguito. L'emissione del biglietto registra "annulla biglietto, finestra di 24 ore." Il blocco inventario registra il suo rilascio. Questo è il pattern Saga, e quando un passo fallisce a metà di una prenotazione, il motore esegue quelle compensazioni in ordine inverso e solo allora riferisce cosa è successo. Al viaggiatore viene detta la verità: il biglietto è stato annullato, non c'è addebito, ecco alternative che puoi confermare ora.

Uno accanto all'altro, l'agente deterministico annulla il biglietto e riferisce che il viaggiatore è al sicuro mentre la baseline dice tutto a posto
A sinistra un semplice agente LLM che dice ancora "Tutto a posto!" su una prenotazione rotta. A destra il motore deterministico: il commit dell'hotel fallisce, la Saga compensa in ordine inverso, il biglietto viene annullato entro la finestra di 24 ore, e lo stato terminale è rolled_back con il viaggiatore al sicuro.

Guardare quel rollback scattare per la prima volta, il biglietto che si annulla da solo senza che io tocchi nulla, è il più vicino che io sia arrivato alla sensazione di un sistema affidabile piuttosto che semplicemente intelligente. Il rollback Saga è la cosa che la maggior parte delle demo salta, ed è esattamente ciò che separa una demo da un prodotto. È poco appariscente. È anche l'intera differenza tra "sei a posto" e un onesto "non sono riuscito a completare questo, ed ecco cosa ho fatto al riguardo."

Il rollback è poco appariscente. È anche l'intera differenza tra un viaggiatore lasciato a piedi e delle scuse oneste.

La demo mostra questo uno accanto all'altro contro un vero agente ReAct, la baseline LLM-in-control, eseguita sullo scenario identico. Era deliberato. Non volevo battere un uomo di paglia. Volevo il confronto onesto, lo stesso fallimento iniettato in entrambi, così la differenza che vedi è architettura e nient'altro.

Cosa dimostra il benchmark, e cosa no?

Ho fatto passare entrambe le architetture attraverso lo stesso batch perché non mi fidavo delle mie aneddoti. Duecento prenotazioni sintetiche, un seed fisso, gli stessi fallimenti di infrastruttura iniettati, attraverso il motore deterministico e attraverso la baseline LLM-in-control. I risultati, per costruzione su quel batch sintetico a seed fisso di 200 scenari, sono netti.

Tabellone di benchmark che confronta l'agente deterministico e la baseline LLM semplice su quattro metriche
Sul batch sintetico a seed fisso di 200 scenari: stati terminali coerenti al 100% contro il 65%, 0 viaggiatori lasciati a piedi contro 40, 0 prenotazioni fabbricate mostrate contro 30, e spesa media di ricerca GDS di 3,25 $ contro 7,57 $.

Voglio stare attento con quei numeri, perché la versione attenta è quella onesta. Il 100%, i zero lasciati a piedi, le zero fabbricate sono veri per costruzione su un batch sintetico a seed fisso, non una garanzia open-world che possa fare sul vostro traffico di produzione. Le garanzie deterministiche tengono perché il codice non può fare altrimenti. I fallimenti della baseline emergono dagli stessi dati. Se le enunci più ampie di così, hai varcato il confine da un risultato reale al marketing, che è l'unica cosa a cui questa azienda, nel nome, si oppone.

Il numero di cui mi ritrovo a parlare di più è l'ultimo. 3,25 $ contro 7,57 $ di spesa media di ricerca GDS. Le ricerche, non solo le prenotazioni, vengono fatturate a circa 3–3,50 $ per segmento, e Lufthansa ha alzato di nuovo quelle fee il 1° gennaio 2026. Un agente speculativo che ri-cerca a ogni passo di ragionamento brucia quel margine. Un flusso deterministico con una cache no. Quel gap è un numero di margine, e tiene a qualsiasi qualità del modello, ed è proprio questo il punto.

La parte che mi fa dormire: la ricevuta

Ho costruito un'altra cosa prima di considerarla finita, ed è la meno appariscente e quella a cui tengo di più. Ogni prenotazione scrive un audit trail JSON append-only: il modello e la versione, la richiesta tipizzata, ogni nodo con il suo verdetto deterministico, ogni compensazione Saga che è scattata, il flag di disclosure dell'Articolo 50 dell'EU AI Act, e lo stato terminale. Puoi esportarlo come un singolo file.

Il download dell'audit trail esportato, con elenco di modello, verdetti, compensazioni e il flag Articolo 50
L'audit trail esportabile. Ogni prenotazione porta un record del modello, del verdetto di ogni nodo, di ogni compensazione e del flag di disclosure Articolo 50, così un fallimento parziale lascia una traccia archiviabile invece di un mistero.

Continuo a tornare con il pensiero ad Air Canada. Quando qualcosa va storto, e nei viaggi qualcosa prima o poi va sempre storto, la domanda a cui un responsabile della compliance deve rispondere è "cosa ha detto l'agente al viaggiatore, e possiamo dimostrare perché." L'Articolo 50 dell'EU AI Act, con obblighi di trasparenza che si applicano dal 2 agosto 2026, renderà quella domanda di routine. Un flusso deterministico con un verdetto a ogni nodo ti dà una risposta. Una catena di ragionamento ti dà una trascrizione e un'alzata di spalle.

Se vuoi premere i pulsanti tu stesso, l'intera cosa è live su veriprajna.com/it/demos/prenotazione-viaggi-con-ai-agentica-per-tmc-e-ota. Romila se puoi. È per questo che c'è.

Su cosa ho davvero cambiato idea?

Ho iniziato credendo che un modello abbastanza buono avrebbe prima o poi reso tutto questo superfluo, che il determinismo fosse una stampella per l'interim pre-AGI. Non lo credo più. I fallimenti contro cui ho passato settimane a progettare non stanno aspettando che arrivi un modello più intelligente. Una tariffa scade ancora tra due chiamate. Un hold viene ancora rifiutato dopo l'emissione di un biglietto. Quelle sono proprietà dell'infrastruttura, non dell'intelligenza, e un ragionatore perfetto lascia a piedi un viaggiatore altrettanto a fondo di uno mediocre se nulla nel sistema è costruito per annullare il biglietto.

E se preferisci guardarlo piuttosto che leggermi mentre lo descrivo, ecco l'intera cosa in esecuzione da capo a coda.

Quindi la domanda che continuo a fare ad altre persone che costruiscono agenti è quella che ho dovuto farmi quella notte, guardando la mia creazione mentire così piacevolmente. Quando il tuo agente dice a un cliente "sei a posto," cosa nel tuo sistema sa davvero che è vero? Se la risposta è "il modello, probabilmente," non hai un problema di modello. Hai un problema di control-flow, e mi piacerebbe davvero sapere come pensi di risolverlo.

Ricerca correlata

Pubblicato anche su

Costruisci la tua IA con fiducia.

Collabora con un team che vanta una profonda esperienza nella creazione della prossima generazione di IA aziendale. Lascia che ti aiutiamo a progettare, sviluppare e implementare una strategia di IA di cui ti puoi fidare.

Veriprajna società di consulenza Deep Tech è specializzata nella creazione di sistemi di IA safety-critical per i settori sanitario, finanziario e regolamentato. Le nostre architetture sono validate rispetto a protocolli consolidati con una documentazione di conformità completa.