TMCおよびOTA向けエージェンティックAI旅行予約
私たちは、制御フローが決定論的Pythonである自律型旅行予約エージェントを構築しました。モデルは旅程リクエストの解析と返信の文言だけを担います。予約の各ステップは補償アクションを登録するため、フライト発券後にホテル料金が失効しても、エージェントは24時間ウィンドウ内でチケットを無効化し、旅行者を取り残す代わりに正直な代替案を手渡します。
100%
一貫した終端状態、設計上
固定シード200シナリオの合成バッチ。LLM制御ベースラインは65%
0 / 0
取り残された旅行者、提示された捏造予約
同一バッチ。ベースラインは40件と30件
$3.25
予約あたりの平均GDS検索費用
ベースラインは$7.57。GDSは検索ごとに課金。Lufthansaは2026年1月1日に手数料を引き上げ
すべてのシナリオは模擬GDSおよびCRS上の合成です。空港コードとホテル名は実在風のフィクスチャであり、ライブ在庫や実予約ではありません。
どちらもモデルの知能不足ではありません。どちらもすでに2026年のバグクラスです。
エージェントがフライトを発券し、ホテルのステップが失敗し、補償ロジックがなければ、それでも「準備完了です」と言います。誰かがフライトだけを抱え、部屋はありません。完璧なモデルでも、チケットを無効化する仕組みがなければ旅行者を取り残します。
それらしいホテルを捏造して予約します。その物件はCRSに一度も存在しません。旅行者に届く前に何も検査されません。推論ループでは、モデルが提案者であると同時に審判だからです。
より良いモデルでも直らない理由は、失敗がインフラと利用の事象であり、モデル品質とは独立だからです。料金が二つのAPI呼び出しの間に失効します。チケット発行後にホールドが拒否されます。検索の嵐がマージンを燃やします。確率的推論はこれらに対して複合します。90パーセントの信頼性のステップが十段あれば、端から端ではおよそ34パーセントになり、GPT-4とReActは実在の複数日旅程を0.6パーセントで完了します(TravelPlanner、OSU NLP、arXiv 2402.01622)。複合する確率的失敗から、プロンプトでは抜け出せません。
そしてデプロイヤーは、エージェントが述べるすべての発言を所有します。Moffatt v. Air Canada(BC Civil Resolution Tribunal、2024年2月14日)では、チャットボットが忌引き運賃ポリシーを捏造したあと航空会社は$812.02の支払いを命じられ、AIが別個の主体であるという主張は退けられました。
制御フローは、およそ十ノードの手作りPythonステートマシンです。LLMは二つのリーフ仕事に閉じ込められます。その間のすべては決定論的です。
input → extract (LLM leaf) → search → policy gate → verify gate → hold → ticket → hotel-book → commit
モデルは自然言語の意図をPydantic型付きの TripRequest (origin、destination、date、passengers、cabin、hotel)に解析します。この型付きオブジェクトが、LLMが生成する唯一の構造化成果物です。Pydantic AI経由でプロバイダーを差し替え可能で、キーが無い場合は決定論的スタブで完全オフライン動作します。
コーポレートポリシーは純粋なPython述語として存在します。エコノミーのみ、区間あたり$600の運賃上限、優先キャリア(United、American、Delta)、一泊$350のホテル上限。ポリシー外の選択肢は、表示後にフラグするのではなく、表示前にフィルタされるため、物理的に提示できません。未知の運賃ファミリーはフェイルセーフで、黙ってエコノミー扱いせずポリシー超過として扱います。ポリシー内フライトが無い場合、エージェントは虚勢を張らず人間キューへエスカレートします。
すべてのホテルはCRSに対して property_idで照合されます。モデルが捏造した物件はCRSに存在しないため拒否され、提示されることはなく、予約は終端状態に達します abstained。ゲートは未確認在庫を拒否します。モデルに自身の出力を採点させることはしません。
各前進ステップは実行時に逆アクションを登録します。たとえば発券は「チケット無効化、24時間ウィンドウ」を登録します。ステップNで失敗すると、N-1から1までの補償が逆順で走り、その後ではじめてエージェントが報告します。これがデモとプロダクトを分けるものです。部分失敗が取り残された顧客になるのを防ぐのがこれだからです。
ライブカウンターがセグメントあたり$3.25でGDS検索費用を追跡します。検索は予約だけでなく課金されるからです。L2Bキャッシュと遅延検索が費用を平坦に保ち、投機的エージェントが再検索してマージンを燃やすのとは対照的です。すべての予約は追記専用JSONイベントログを書き、次としてエクスポートできます audit-<pnr>.json。モデルとバージョン、型付き旅程リクエスト、すべてのノード判定、すべてのSaga補償、EU AI Act Article 50の開示フラグ、終端状態を載せます。
四つのボタン。同じシナリオ上で、実際のLLM制御ベースラインと並べます。以下のスクリーンショットはすべて実行中のアプリから撮影しています。
「ORDからSFO、来週火曜、都心一泊、会社ポリシー。」ステートマシンが各ノードを実行し、Hyatt Regency SFをproperty_idでCRSに対して確認し、検索メーターはキャッシュされた1回の検索で$3.25に留まります。終端状態:confirmed、PNR付き。
リクエストは捏造物件「Tabacon Springs Eco-Lodge」を指名しました。二つの実在リゾートを混ぜた名前で、設計上property_idがありません。ゲートはCRS一致を見つけられず、提示を拒否します。エージェントはホテルを捏造せず、「その物件を確認できませんでした」と正直に棄権します。
フライトがすでに発券されたあとにホテル料金が失効します。こちら側ではSagaが発火します。24時間ウィンドウ内でチケットを無効化し、ホールドを解放し、無料でチケットを無効化したことと代替案を添付して正直に返信します。終端状態:rolled back、旅行者は安全。同じシナリオのベースラインはチケットを発行したまま補償せず、偽の「準備完了です」を出し、まさに起こりうるAir Canada先例です。
ワンクリックでエクスポートします audit-<pnr>.json。モデルとバージョン、型付き旅程リクエスト、すべてのノードとその決定論的判定、すべてのSaga補償、EU AI Act Article 50の開示フラグ(透明性義務は2026年8月2日から適用)、終端状態です。
同じ200件の合成予約、一つの固定シード(42)、同じ注入インフラ失敗を両アーキテクチャに通します。シナリオ構成は正常系50パーセント、チケット後ホテル失敗20パーセント、幻覚エンティティ15パーセント、検索嵐15パーセントです。私たちの保証は設計上成り立ち、ベースラインの失敗は同じデータから現れます。
ベースラインは同じシナリオで動かす本物のReAct型LLM制御エージェントであり、藁人形ではなく誠実な基準点です。以下の数字は固定シード200シナリオの合成バッチ(benchmark.py、seed 42、n=200)に対するものです。
| 指標 | 決定論的エージェント(当社) | ベースライン(LLM制御) |
|---|---|---|
| 一貫した終端状態 | 100.0% | 65.0% |
| 取り残された旅行者 | 0 | 40 |
| 提示された捏造予約 | 0 | 30 |
| 予約あたりの平均GDS検索費用 | $3.25 | $7.57 |
100パーセント、0、0は、この固定シード合成バッチ上で設計上成り立つものであり、オープンワールドの本番保証ではありません。主張は狭く耐久的です。部分予約がconfirmedとして示されることはなく、旅行者が取り残されることもありません。$3.25対$7.57の差は、どのモデル品質でも成り立つマージンの数字です。
保証はモデルを信頼することから生まれません。このデモでは制御フローは決定論的Pythonであり、各前進ステップは走った瞬間に補償アクションを登録します。チケット発行後にステップが失敗すると、エンジンはそれらの補償を逆順で実行し(Saga)、24時間ウィンドウ内でチケットを無効化し、正直に報告します。モデルが清掃を決めることに何も依存しないため、旅行者がフライトだけを抱え部屋なしで残されることはありません。
いいえ。GDS、CRS、チケット発行、決済はすべてこのデモでスタブされ模擬されています。フィクスチャアダプタがV1統合であり、背後にライブのAmadeus、Sabre、Duffelアカウントはありません。デモが証明するのは制御フローアーキテクチャと補償ロジックであり、本番予約パイプラインではありません。
それこそSagaが作られた正確なケースです。発券は走った瞬間に自身の逆アクション(24時間ウィンドウ内でチケットを無効化)を登録します。コミット前にホテル料金が失効すると、エンジンは補償を逆順で発火し、チケットを無料で無効化し、ホールドを解放し、正直な代替案を旅行者に手渡します。終端状態はrolled backであり、confirmedでもstrandedでもありません。
検証ゲートが、提示前にすべての物件をproperty_idでCRSに対して確認します。デモでリクエストが捏造物件を指名したとき、ゲートはCRS一致を見つけられず提示を拒否し、エージェントは予約せず正直に棄権しました。ゲートは事後に架空ホテルをフラグしません。物理的に提示不能にします。
ReAct型エージェントは取引の指揮をLLMに任せるため、いつ検索し予約し発券するかを決め、ゲートも補償ロジックもありません。同じ固定シード200シナリオ合成バッチで、そのベースラインは捏造在庫を提示し、ロールバックなしでチケットを発行したままにし、偽の「準備完了です」を出しました。ここではLLMは意図を解析し返信を書くだけの型付きリーフノードです。決定論的コードがフローを所有し、各ステップが自身の取り消しを持ちます。
デプロイヤーは、エージェントが述べるすべての発言を所有します。Moffatt v. Air Canada(BC Civil Resolution Tribunal、2024年2月14日)では、チャットボットが忌引き運賃ポリシーを捏造したあと航空会社は$812.02の支払いを命じられ、AIのせいだという抗弁は退けられました。デモは予約ごとのJSON監査証跡をエクスポートし、モデルとバージョン、すべてのノード判定、すべてのSaga補償、EU AI Act Article 50の開示フラグを載せ、エージェントがしたことを事後に検査できるようにします。
このデモの背後にある研究 — アーキテクチャ、検証設計、エンタープライズ青写真。
完全なソリューション
エージェンティックAI旅行予約ソリューションを見る →旅行者を取り残しホテルを捏造する失敗は、インフラ事象であり、モデル知能の問題ではありません。
高リスクの予約エージェントでLLMをどこに置くべきか、部分失敗をAir Canada型の法的責任にしない方法をチームが検討しているなら、率直に意見を交換したいです。問題は業界全体であり、答えもそうなります。