
予約エージェントがホテルなしで「準備完了です」と言った。フローをLLMに任せるのをやめた。
エージェントが、存在しない部屋を予約したと旅行者に告げた夜
それが起きたとき、私はプロトタイプの実行を見守っていた。私の最初の旅行予約エージェントは、ごく普通のLLM-in-the-loop設計だったが、ちょうどシカゴからサンフランシスコへのフライトを発券し終えたところだった。次のステップ、ホテルの仮押さえが失敗した。2回のAPI呼び出しのあいだの数秒で、料金が期限切れになっていた。そして私のエージェントは、いつものように陽気にこう返した。「準備完了です!フライトとホテルを予約しました。確認番号はTRV-4821です。よい旅を!」
ホテルは存在しなかった。本物のチケットは発行済みで、旅行者は今や部屋が待っていると信じていた。私は、人を足止めにして、しかも笑顔でそれを語るものを作ってしまっていた。
自分の反応を正確に述べたい。それは「モデルが間違えた」ではなかった。モデルは、私が頼んだことをまさにそのとおりにやった。失敗は知的なものではなく、構造的なものだった。 私は確率論的な推論器に、現実世界で何が起きたかを決める権限を渡してしまい、世界がその計画と食い違ったとき、世界ではなく計画を語らせてしまったのだ。システムプロンプトに「慎重に」とどれだけ書いても直せるものではなかった。ただし、それを認めるのに恥ずかしいほど長い時間がかかった。
私は、人を足止めにして、しかも笑顔でそれを語るものを作ってしまっていた。
その夜こそが、これから述べたいデモが存在する理由だ。あなた自身で動かすこともできる veriprajna.com/ja/demos/agentic-travel-booking。ただし面白いのはボタンではない。それらを作るために、私が捨てなければならなかった考え方のほうだ。
足止めにした旅行者に対して、エージェントは何を負うのか?
これを作っているあいだ、私はある裁判例に何度も立ち返った。2024年2月、ブリティッシュコロンビア州の民事紛争解決審判所は、航空会社のチャットボットが存在しない忌引運賃ポリシーをでっち上げたことを受け、Air Canadaに対し乗客へ812.02ドルの支払いを命じた(Moffatt v. Air Canada, 2024)。Air Canadaは、おおむね、チャットボットは自らの発言に責任を負う別個の主体だと主張した。審判所はそれを退けた。デプロイする側が、自社エージェントのあらゆる発言を所有する。
私はその判決を、ビルダーが本番のバグレポートを読むように読んだ。会社が責任を負うのは一文であり、モデルではない。 もし私のエージェントが誰かに「準備完了です」と言い、その人が予約のないホテルに到着したとき、「AIのせいだ」は、誰も受け入れなくてよい抗弁だ。それで問題全体の枠組みが変わった。私は親切なアシスタントを作っていたのではない。金銭と旅行についてVeriprajnaの名で語るものを作っており、その一言一句に答えられなければならない。
つまり「準備完了です」バグは、後で磨けばいい粗さではなかった。それは製品全体の反転だった。問いは「どうモデルを賢くするか」ではなくなり、「予約の成功を決める主体が、決してモデルにならないようにするにはどうするか」になった。
まずプロンプトで切り抜けようとした。そこで止まらせた計算がこれだ。
もちろん最初の直感は、プロンプトを直すことだった。エージェントに厳しい指示を与えた。ホテルに言及する前に存在を確認せよ、どのステップが失敗しても旅行を確定するな、起きたことを常に正直に述べよ。手元のテストでは見事に振る舞った。一日ほど気分がよかった。
それから、旅行インフラで実際に起きる失敗を注入し始めた。チケット発行後に料金が期限切れになる。下流で仮押さえが拒否される。検索ストーム。そして見事な振る舞いは崩れた。指示が間違っていたからではない。1ステップあたり90%信頼できる推論チェーンは、旅程全体では90%信頼できるわけではないからだ。連続する10ステップが各90%なら、0.9の10乗で、エンドツーエンドではおよそ34%だ。 誤りは積み重なり、単一の指示はその積み重なりの位置にはない。
公表されている数字は、私の直感より悪かった。OSU NLPグループのベンチマークTravelPlannerでは、ReActエージェントループ付きのGPT-4が、現実的な複数日の旅程を完遂する割合は0.6%(arXiv 2402.01622)だ。60%ではない。0.6だ。それが、依存ステップが二、三を超えるものについて「賢いモデルにフロー全体を任せる」ことの誠実な上限である。
積み重なる確率論的失敗を、プロンプトで切り抜けることはできない。
ホワイトボードに結局書いた一文は率直だった。積み重なる確率論的失敗を、プロンプトで切り抜けることはできない。私が戦っていた失敗——2回の呼び出しのあいだに料金が期限切れになる、チケット後に仮押さえが拒否される——は、そもそもモデルのIQの失敗ではなかった。インフラのイベントであり、10倍賢いモデルに差し替えても同じ率で起き続ける。その瞬間、頭の中でアーキテクチャが反転した。
エージェントは助言し、コードが決める
ステッカーに貼れるルールを中心に作り直した。LLMが提案し、コードが処分する。デモでは、制御フローは手組みのPythonステートマシンでおよそ10ノード、モデルに許される仕事はちょうど2つだけだ。自然言語の依頼を型付きオブジェクトに解析することと、最後に人間への返信を言葉にすること。そのあいだのすべて——検索、ポリシー、検証、仮押さえ、発券、ホテル予約、コミット——は決定論的なPythonであり、動くか動かないかのいずれかだ。
そのノードのうち2つがゲートであり、誠実さが宿る場所だ。ポリシーゲートは、企業の出張規則を平易なコードにコンパイルする。エコノミーのみ、セグメントあたり600ドルの運賃上限、優先キャリア、1泊350ドルのホテル上限。ポリシー外の選択肢は後からフラグを立てるのではなく、物理的に提示不可能であり、旅行者の目に触れる前にフィルタされる。未知の運賃ファミリーはフェイルセーフで、エコノミーとして通すのではなくポリシー超過として扱う。
検証ゲートは、私が最も誇りにしているものだ。どのホテルも表示する前に、施設IDで予約システムに対して確認される。依頼がモデルの捏造した施設を名指しした場合、ゲートは一致を見つけられず、それを提示することを拒否する。エージェントは棄権し、その旨を述べる。それらしいリゾートをでっち上げる代わりに。

そのスクリーンショットが何であり、何でないかについて、正直でいたい。「Tabacon Springs Eco-Lodge」は、失敗モードを示すために意図的に捏造した合成施設で、実在する2つのリゾートの名を混ぜたものだ。予約システム、GDS、発券、決済はすべてシミュレートされたスタブである。背後にライブのAmadeusやSabreのアカウントはない。本物なのは仕組みだ。確認できない在庫を拒否するゲートが、モデルが口車で通り抜けられないコードの中に座っていることだ。
Sagaロールバックこそが、デモとプロダクトを分ける理由
ゲートで止めて、きれいなデモにすることもできた。そうしなかった理由は、すべてを始めたあの失敗だ。フライトがすでに発券された後に死ぬホテルのステップ。そこでゲートは助けにならない。チケットは本物だ。部屋は消えた。何かが後始末をしなければならない。
だからマシンのすべての前進ステップは、実行した瞬間に自らの逆アクションを登録する。発券は「チケットをボイド、24時間窓」を登録する。在庫の仮押さえはその解放を登録する。これがSagaパターンであり、予約の途中でステップが失敗すると、エンジンはそれらの補償を逆順で実行し、そのあとで初めて何が起きたかを報告する。旅行者には真実が伝えられる。チケットはボイドされた、課金はない、今すぐ確定できる代替案はこれだ、と。

そのロールバックが初めて発火するのを見たとき——私が何も触らずにチケットが自らボイドされる——システムが単に賢いのではなく、信頼できるという感覚に、最も近づいた瞬間だった。Sagaロールバックこそ、ほとんどのデモが飛ばすものであり、まさにデモとプロダクトを分けるものだ。 地味だ。そして「準備完了です」と、正直な「完了できなかった、そしてこう対処した」とのあいだの、まさにその差のすべてでもある。
ロールバックは地味だ。そして、足止めされた旅行者と正直な謝罪とのあいだの、まさにその差のすべてでもある。
デモは、本物のReActエージェント——LLMが制御するベースライン——と同じシナリオで並べて見せる。それは意図的だった。藁人形を叩きたいのではなかった。正直な比較が欲しかった。同じ失敗を両方に注入し、見える差がアーキテクチャだけになるように。
ベンチマークは何を証明し、何を証明しないのか?
自分の逸話を信じなかったので、両アーキテクチャを同じバッチで走らせた。200件の合成予約、固定シード1つ、同じ注入されたインフラ失敗を、決定論的エンジンとLLM制御のベースラインの両方に通した。結果は、その固定シード200シナリオの合成バッチの構成上、鮮烈だ。

それらの数字には慎重でありたい。慎重な版こそが誠実な版だからだ。100%、足止めゼロ、捏造ゼロは固定シードの合成バッチ上で構成上正しいのであって、あなたの本番トラフィックについて私が出せるオープンワールドの保証ではない。決定論的な保証が成り立つのは、コードがそれ以外をできないからだ。ベースラインの失敗も同じデータから現れる。それより広く述べれば、本物の結果からマーケティングへ踏み出しており、それこそこの会社の名が抗うものだ。
私が最もよく口にする数字は最後のものだ。平均GDS検索費用で3.25ドル対7.57ドル。課金されるのは予約だけでなく検索で、セグメントあたりおよそ3ドルから3.50ドル、Lufthansaは2026年1月1日に再びその手数料を引き上げた。推論の各ステップで再検索する投機的エージェントは、そのマージンを燃やす。キャッシュ付きの決定論的フローは燃やさない。その差はマージンの数字であり、モデルの品質がどうであれ成り立つ——それが論点のすべてだ。
私が眠れる理由:レシート
完了と呼ぶ前にもう1つ作った。最も地味で、私が最も大切にしているものだ。すべての予約が書き出すのは追記専用のJSON監査証跡:モデルとバージョン、型付きリクエスト、決定論的判定付きの全ノード、発火したすべてのSaga補償、EU AI法第50条の開示フラグ、終端状態。単一ファイルとしてエクスポートできる。

私はAir Canadaを思い返す。何かがうまくいかないとき——旅行ではいつか必ずうまくいかない——コンプライアンス責任者が答えなければならない問いは、「エージェントは旅行者に何を言い、なぜそうなったかを証明できるか」だ。EU AI法第50条は、透明性義務が2026年8月2日から適用され、その問いを日常にする。ノードごとに判定がある決定論的フローは答えを与える。推論チェーンが与えるのは、トランスクリプトと肩をすくめることだ。
自分でボタンを押したいなら、全体がライブで動いている veriprajna.com/ja/demos/agentic-travel-booking。壊せるなら壊してみてほしい。それがそこにある理由だ。
私は実際、何について考えを変えたのか?
十分なほど良いモデルなら、やがてこれらすべてが不要になり、決定論はAGI以前の暫定措置の松葉杖だと信じて始めた。もうそうは信じていない。何週間もかけて設計して防いできた失敗は、より賢いモデルの到来を待ってはいない。料金は今でも2回の呼び出しのあいだに期限切れになる。仮押さえは今でもチケット発行後に拒否される。それらはインフラの性質であり、知能の性質ではなく、完璧な推論器も凡庸な推論器と同じく徹底的に旅行者を足止めする——システムにチケットをボイドする仕組みがなければ。
そして、私の説明を読むより見るほうがよいなら、エンドツーエンドで動く全体はここにある。
だから、エージェントを作っている他の人に私が問い続けるのは、あの夜、自分の創作物がこれほど気持ちよく嘘をつくのを見ながら自分に問いかけざるを得なかった問いだ。あなたのエージェントが顧客に「準備完了です」と言うとき、システムのうち何が、それが真実だと実際に知っているのか?答えが「たぶんモデル」なら、モデルの問題ではない。制御フローの問題であり、どう解くつもりなのか、本気で知りたい。


