打造 agentic 旅遊訂位 demo 時,我發現困住旅客的解法不是更好的模型,而是帶 Saga 回滾的確定性狀態機。
Agentic AITravel TechnologyAI Agents

我的訂位 agent 在沒有飯店的情況下告訴旅客「都搞定了」。我不再信任 LLM 去跑流程。

Ashutosh SinghalAshutosh Singhal2026年7月1日12 min

那個晚上,我的 agent 告訴旅客它已訂好一間根本不存在的房間

事情發生時,我正在看著原型運行。我的第一個旅遊訂位 agent——一套再普通不過的 LLM-in-the-loop 設計——剛出好一張從芝加哥到舊金山的機票。下一步,佔住飯店,失敗了。房價在兩次 API 呼叫之間的幾秒內過期了。而我的 agent,一如既往地開朗,回覆道:「都搞定了!我已為您訂好機票與飯店,確認編號是 TRV-4821。祝旅途愉快!」

根本沒有飯店。有的是一張真實、已出的機票,以及一位現在相信自己有房間等著的旅客。我造出了一個會把人困住、還笑著說沒事的東西。

我想精確地說清楚我的反應,因為那不是「模型搞錯了」。模型做的正是我要求它做的。失敗是結構性的,不是智力上的。 我把裁定真實世界發生了什麼的權威,交給了一個隨機推理器;當世界與它的計畫不一致時,它敘述的是計畫,而不是世界。系統提示裡再多「要小心」也修不好這個問題,儘管我花了令人尷尬的漫長時間才承認這一點

我造出了一個會把人困住、還笑著說沒事的東西。

那個晚上,正是我想描述的這份 demo 存在的原因。你可以自己在 veriprajna.com/zh-Hant/demos/agentic-travel-booking 執行,但有趣的並不是那些按鈕。有趣的是我為了做出它們而不得不忘掉的那些事。

一個把旅客困住的 agent,對那位旅客欠下什麼?

我在打造這一切時,反覆想起一則法律判例。2024 年 2 月,卑詩省民事解決法庭命令加拿大航空向一名乘客支付 $812.02,因為該航空公司的聊天機器人捏造了一項並不存在的喪親票價政策(Moffatt v. Air Canada, 2024)。加拿大航空大致辯稱,聊天機器人是獨立實體,須為自己的言論負責。法庭駁回了這一點。部署方擁有其 agent 所說的每一句話。

我讀那份裁決的方式,就像一個打造者讀一份來自生產環境的錯誤報告。公司要為那句話負責,而不是為模型負責。 若我的 agent 告訴某人「都搞定了」,而對方抵達飯店卻沒有訂房,「那是 AI」並不是任何人必須接受的辯護。這徹底重構了我眼中的問題。我不是在打造一個有用的助理。我是在打造一個會代表 Veriprajna 就金錢與旅遊發聲的東西,而我必須能為其中每一個字負責。

這意味著那個「都搞定了」的臭蟲,不是之後再打磨的粗糙邊緣。它是整個產品,被顛倒過來。問題不再是「我要如何讓模型更聰明」,而是「我要如何確保模型永遠不是那個裁定訂位成功的東西」。

我先試著用提示詞脫困。以下是讓我停下來的那筆帳。

當然,我的第一直覺是修好提示詞。我給 agent 下了嚴厲指示:提到飯店前先確認它存在、任何一步失敗就絕不確認行程、永遠說實話說出發生了什麼。在我手動測試時,它表現完美。我開心了大概一天。

然後我開始注入旅遊基礎設施裡實際會發生的失敗。出票後房價過期。下游拒絕佔位。搜尋風暴。那完美的行為崩潰了——不是因為指示錯了,而是因為每一步 90% 可靠的推理鏈,並不能在整趟行程上維持 90% 可靠。十個連續步驟、每步 90%,就是 0.9 的十次方,端到端大約 34%。 錯誤會複利,沒有任何單一指示能坐落在那個複利發生的節點上。

公開數字比我原本的直覺更糟。在 TravelPlanner——俄亥俄州立大學 NLP 組的基準測試——上,GPT-4 搭配 ReAct agent 迴圈完成真實多日行程的成功率為 0.6% (arXiv 2402.01622)。不是百分之六十。是零點六。那就是「讓一個聰明模型跑完整個流程」對於任何超過兩三個相依步驟的事情,誠實的天花板。

你無法用提示詞逃離複利式的隨機失敗。

我最後寫在白板上的那句話很直白:你無法用提示詞逃離複利式的隨機失敗。我對抗的那些失敗——兩次呼叫之間房價過期、出票後佔位被拒——根本不是模型智商的失敗。它們是基礎設施事件,就算我換成聰明十倍的模型,發生頻率也不會變。那一刻,架構在我腦中翻轉了。

Agent 給建議,程式碼做決定

我圍繞一條能印在貼紙上的規則重建了這套東西:LLM 提案,程式碼定奪。在 demo 裡,控制流是一套手寫的 Python 狀態機,大約十個節點,而模型被允許恰好兩份工作。它把自然語言請求解析成型別化物件,並在最末端措辭人類回覆。中間的一切——搜尋、政策、驗證、佔位、出票、訂飯店、提交——都是確定性的 Python,要麼執行,要麼不執行。

其中兩個節點是閘門,誠實就住在那裡。政策閘把企業差旅規則編譯成普通程式碼:僅限經濟艙、每航段 $600 票價上限、偏好航空公司、每晚 $350 飯店上限。不合政策的選項不是事後被標記,而是在物理上無法呈現,在抵達旅客之前就被過濾掉。未知的票價家族會安全失敗,被視為超出政策,而不是當成經濟艙放行。

驗證閘是我最自豪的那一個。任何飯店在展示之前,都要依物業 ID 對照訂房系統確認。當請求點名一個模型捏造的物業時,閘門找不到匹配,並拒絕把它呈現出來。Agent 會棄權並明說如此,而不是捏造一家聽起來合理的度假村。

CRS 驗證對一間捏造的飯店失敗,標記為 REFUSED,且未呈現給旅客
驗證閘攔下一處捏造的物業。「Tabacon Springs Eco-Lodge」不在訂房系統中,因此被拒絕且從不顯示,agent 選擇棄權,而不是發明一筆訂位。

我必須誠實說明那張截圖是什麼、不是什麼。「Tabacon Springs Eco-Lodge」是我刻意捏造的合成物業,一個從兩家真實度假村混出的名字,用來示範這種失敗模式。訂房系統、GDS、出票與付款全都是模擬的 stub。背後沒有真實的 Amadeus 或 Sabre 帳戶。真實的是機制:一道拒絕無法確認之庫存的閘門,寫在模型無法靠說話繞過去的程式碼裡。

為什麼 Saga 回滾才是區分 demo 與產品的關鍵

我大可以停在閘門,就有一份不錯的 demo。我沒停的原因,正是開啟這一切的那個失敗:機票已出票後飯店步驟掛掉。閘門在那裡幫不了你。機票是真的。房間沒了。必須有東西來收拾殘局。

於是機器裡的每一步向前動作,在執行的當下就註冊自己的反向動作。出票註冊「作廢機票,24 小時窗口」。佔住庫存註冊其釋放。這就是Saga 模式,當訂位中途某一步失敗時,引擎會依反向順序執行那些補償,然後才回報發生了什麼。旅客聽到的是真相:機票已作廢、沒有扣款、這裡有你現在可以確認的替代方案。

並排對照:確定性 agent 作廢機票並回報旅客安全,而基線仍說都搞定了
左邊是一個普通的 LLM agent,仍在一筆壞掉的訂位上說「都搞定了!」。右邊是確定性引擎:飯店提交失敗,Saga 反向補償,機票在 24 小時窗口內作廢,終態為 rolled_back,旅客安全。

第一次看著那次回滾觸發——機票在我沒碰任何東西的情況下自行作廢——是我最接近感覺一個系統可信、而不僅僅是聰明的時刻。Saga 回滾正是大多數 demo 跳過的東西,也恰好是區分 demo 與產品的關鍵。 它不起眼。它也是「都搞定了」與誠實的「我無法完成這筆訂位,而這是我為此做了什麼」之間的全部差別。

回滾不起眼。它也是困住旅客與誠實道歉之間的全部差別。

Demo 把這件事與一個真實的 ReAct agent——以 LLM 為控制的基線——並排展示,跑在完全相同的情境上。那是刻意的。我不想打倒一個稻草人。我想要誠實的比較:同樣的失敗注入兩邊,你看到的差異就只是架構,別無其他。

基準測試證明了什麼,又沒證明什麼?

我讓兩套架構跑同一批,因為我不信任自己的軼事。兩百筆合成訂位、一個固定種子、相同的注入式基礎設施失敗,分別通過確定性引擎與以 LLM 為控制的基線。依建構、在那固定種子的 200 情境合成批次上,結果極為鮮明。

基準計分板:比較確定性 agent 與普通 LLM 基線在四項指標上的表現
在固定種子的 200 情境合成批次上:100% 一致的終態對上 65%、0 位被困旅客對上 40、0 筆被呈現的捏造訂位對上 30,以及平均 GDS 搜尋花費 $3.25 對上 $7.57。

我想謹慎對待那些數字,因為謹慎的版本才是誠實的版本。那 100%、零被困、零捏造,是依建構、在固定種子合成批次上為真,而不是我能對你的生產流量做出的開放世界保證。確定性保證之所以成立,是因為程式碼無法另作他為。基線的失敗從相同資料中浮現。把陳述擴得比這更寬,你就從真實結果跨進了行銷——而那正是這家公司取名所反對的事。

我發現自己談得最多的是最後那個數字。平均 GDS 搜尋花費 $3.25 對上 $7.57。搜尋——不只是訂位——大約按每航段 $3 到 $3.50 計費,而漢莎航空於 2026 年 1 月 1 日再次調漲了那些費用。一個在每一步推理都重新搜尋的投機式 agent 會燒光那個利潤。帶快取的確定性流程則不會。那個差距是一個利潤數字,而且在任何模型品質下都成立,而這正是重點所在。

讓我睡得著的那部分:收據

在我宣告完成之前,我又做了一件事,它最不起眼,卻是我最在乎的。每筆訂位都會寫下一條只能追加的 JSON 稽核軌跡:模型與版本、型別化請求、每個節點及其確定性裁決、每一個觸發的 Saga 補償、歐盟 AI 法案第 50 條揭露旗標,以及終態。你可以把它匯出成單一檔案。

匯出的稽核軌跡下載,列出模型、裁決、補償與第 50 條旗標
可匯出的稽核軌跡。每筆訂位都帶有模型、各節點裁決、每一次補償,以及第 50 條揭露旗標的紀錄,因此部分失敗留下的是可歸檔的痕跡,而不是一場謎團。

我不斷想起加拿大航空。當事情出錯時——而在旅遊業,事情終究總會出錯——合規負責人必須回答的問題是「agent 對旅客說了什麼,我們能否證明為什麼」。歐盟 AI 法案第 50 條,透明度義務自 2026 年 8 月 2 日起適用,將讓這個問題變成例行公事。帶有每個節點裁決的確定性流程給你一個答案。一條推理鏈給你的是一份逐字稿與一攤手。

若你想自己按按鈕,整套東西已上線於 veriprajna.com/zh-Hant/demos/agentic-travel-booking。儘管去弄壞它。它就是為此存在的。

我真正改變想法的是什麼?

一開始我相信,夠好的模型終將讓這一切變得不必要,確定性只是 AGI 到來前過渡期的拐杖。我不再這麼相信了。我花數週設計去對抗的那些失敗,並不在等更聰明的模型到來。房價仍會在兩次呼叫之間過期。佔位仍會在出票後被拒。那些是基礎設施的屬性,不是智能的屬性,而一個完美的推理器困住旅客的徹底程度,與一個平庸的推理器完全一樣,若系統裡沒有任何東西被建來作廢那張機票。

而若你寧願看它跑,也不想讀我描述,這裡是整套東西從頭到尾運行的樣子。

所以我持續問其他打造 agent 的人的那個問題,正是那個晚上我看著自己的創作如此愉快地說謊時,必須問自己的問題。當你的 agent 告訴客戶「都搞定了」,你的系統裡到底什麼東西真正知道那是真的?若答案是「大概是模型吧」,你沒有模型問題。你有的是控制流問題,而我真心想知道你打算怎麼解決它。

相關研究

同步發佈於

自信打造您的 AI。

與一支在打造新世代企業級 AI 方面擁有深厚經驗的團隊攜手合作。讓我們協助您設計、建置並部署值得信賴的 AI 策略。

Veriprajna 深度科技顧問公司 專精於為醫療、金融及法規監管領域打造攸關安全的 AI 系統。我們的架構均依循既定規範進行驗證,並備有完整的合規文件。