
סוכן ההזמנות שלי אמר למטייל "הכול מוכן" בלי מלון. הפסקתי לסמוך על ה־LLM שיריץ את הזרימה.
הלילה שבו הסוכן שלי אמר למטייל שהוא הזמין חדר שלא היה קיים
צפיתי באב־טיפוס רץ כשזה קרה. סוכן הזמנות הנסיעות הראשון שלי, עיצוב רגיל לגמרי של LLM בלולאה, בדיוק כרטס טיסה משיקגו לסן פרנסיסקו. השלב הבא, החזקת המלון, נכשל. התעריף פג בשניות שבין שתי קריאות API. והסוכן שלי, עליז כתמיד, כתב בחזרה: "הכול מוכן! הזמנתי את הטיסה ואת המלון שלך, מספר האישור שלך הוא TRV-4821. נסיעה נעימה!"
לא היה מלון. היה כרטיס אמיתי, שהונפק, ומטייל שהאמין עכשיו שיש לו חדר שמחכה. בניתי משהו שיותיר אדם תקוע ויחייך על זה.
אני רוצה להיות מדויק לגבי התגובה שלי, כי זה לא היה "המודל עשה טעות." המודל עשה בדיוק מה שביקשתי. הכשלון היה מבני, לא אינטלקטואלי. מסרתי למנוע הנמקה סטוכסטי את הסמכות להחליט מה קרה בעולם האמיתי, וכשהעולם לא הסכים עם התוכנית שלו, הוא סיפר את התוכנית במקום את העולם. שום כמות של "היה זהיר" בפרומפט המערכת לא הייתה מתקנת את זה, אף שלקח לי זמן מביך ארוך מדי להודות בזה.
בניתי משהו שיותיר אדם תקוע ויחייך על זה.
הלילה ההוא הוא הסיבה שהדמו שאני רוצה לתאר קיים. אפשר להריץ אותו בעצמכם ב־veriprajna.com/he/demos/agentic-travel-booking, אבל החלק המעניין אינו הכפתורים. זה הדבר שהייתי צריך להיגמל ממנו כדי לבנות אותם.
מה סוכן חייב למטייל שהוא מותיר תקוע?
חזרתי שוב ושוב לתיק משפטי בזמן שבניתי את זה. בפברואר 2024 הורה בית הדין ליישוב סכסוכים אזרחיים של בריטיש קולומביה ל־Air Canada לשלם 812.02$ לנוסע אחרי שצ'אטבוט של חברת התעופה המציא מדיניות תעריף אבלות שלא הייתה קיימת (Moffatt v. Air Canada, 2024). Air Canada טענה, פחות או יותר, שהצ'אטבוט הוא ישות נפרדת האחראית למילים של עצמה. בית הדין דחה את זה. מי שפרס את הסוכן אחראי לכל אמירה שהוא משמיע.
קראתי את הפסיקה כמו שבונה קורא דוח באג מהייצור. החברה אחראית למשפט, לא למודל. אם הסוכן שלי אומר למישהו "הכול מוכן," והוא מגיע למלון בלי הזמנה, "זו הייתה הבינה המלאכותית" אינה הגנה שאף אחד חייב לקבל. זה ניסח מחדש את כל הבעיה בשבילי. לא בניתי עוזר מועיל. בניתי משהו שידבר בשם Veriprajna על כסף ונסיעות, והייתי צריך להיות מסוגל לענות על כל מילה שלו.
מה שאומר שבאג ה"הכול מוכן" לא היה קצה מחוספס ללטש אחר כך. זה היה כל המוצר, הפוך. השאלה הפסיקה להיות "איך אני עושה את המודל חכם יותר" והפכה ל"איך אני מוודא שהמודל לעולם אינו הדבר שמחליט שהזמנה הצליחה."
ניסיתי קודם לצאת מזה בפרומפט. הנה המתמטיקה שעצרה אותי.
האינסטינקט הראשון שלי, כמובן, היה לתקן את הפרומפט. נתתי לסוכן הוראות חמורות: אמת שהמלון קיים לפני שאתה מזכיר אותו, לעולם אל תאשר נסיעה אם שלב כלשהו נכשל, תמיד אמור את האמת על מה שקרה. בבדיקות הידניות שלי הוא התנהג להפליא. הרגשתי טוב בערך יום.
ואז התחלתי להזריק את הכשלים שבאמת קורים בתשתית נסיעות. תעריף שפוג אחרי הנפקת כרטיס. החזקה שנדחית במורד הזרם. סערת חיפושים. וההתנהגות היפה התפרקה, לא כי ההוראות היו שגויות, אלא כי שרשרת הנמקה שהיא אמינה ב־90% בכל צעד אינה אמינה ב־90% על פני נסיעה. עשרה צעדים עוקבים ב־90% כל אחד הם 0.9 בחזקת עשר, בערך 34% מקצה לקצה. השגיאות מצטברות, ושום הוראה בודדת לא יושבת על ההצטברות.
המספרים שפורסמו גרועים יותר ממה שהאינטואיציה שלי שיערה. ב־TravelPlanner, הבנצ'מרק מקבוצת ה־NLP של OSU, GPT-4 עם לולאת סוכן ReAct משלים מסלולים אמיתיים של כמה ימים בשיעור 0.6% (arXiv 2402.01622). לא שישים אחוז. אפס נקודה שש. זהו התקרה הכנה של "תנו למודל חכם להריץ את כל הזרימה" לכל דבר עם יותר מכמה צעדים תלויים.
אי אפשר לצאת בפרומפט מכשל סטוכסטי מצטבר.
המשפט שסיימתי לכתוב על לוח לבן היה חד: אי אפשר לצאת בפרומפט מכשל סטוכסטי מצטבר. הכשלים שנלחמתי בהם — תעריף שפוג בין שתי קריאות, החזקה שנדחית אחרי כרטיס — לא היו כשלי IQ של מודל בכלל. הם היו אירועי תשתית, והם היו ממשיכים לקרות באותו קצב אם הייתי מחליף במודל חכם פי עשרה. זה היה הרגע שבו הארכיטקטורה התהפכה בראש שלי.
סוכנים מייעצים, הקוד מחליט
בניתי מחדש את הדבר סביב כלל שיכולתי לשים על מדבקה: ה־LLM מציע, הקוד מחליט. בדמו, זרימת הבקרה היא מכונת מצבים ב־Python שבניתי ביד של כעשרה צמתים, ולמודל מותרות בדיוק שתי משימות. הוא מפרסר את הבקשה בשפה טבעית לאובייקט מטויף, ובסוף ממש הוא מנסח את התשובה לאדם. הכול שביניהם — חיפוש, מדיניות, אימות, החזקה, כרטוס, הזמנת מלון, commit — הוא Python דטרמיניסטי שרץ או לא רץ.
שניים מהצמתים האלה הם שערים, ושם יושבת הכנות. שער המדיניות מקמפל כללי נסיעות ארגוניים לקוד פשוט: מחלקת תיירים בלבד, תקרת תעריף של 600$ למקטע, חברות תעופה מועדפות, תקרת מלון לילית של 350$. אפשרויות מחוץ למדיניות אינן מסומנות בדיעבד, הן בלתי־ניתנות להצגה פיזית, מסוננות לפני שיוכלו בכלל להגיע למטייל. משפחת תעריפים לא ידועה נכשלת בבטיחות, מטופלת כמעל המדיניות במקום שתועבר כמחלקת תיירים.
שער האימות הוא זה שאני הכי גאה בו. לפני שמוצג מלון כלשהו, הוא מאושר מול מערכת ההזמנות לפי מזהה נכס. כשהבקשה מציינת נכס שהמודל המציא, השער לא מוצא התאמה ומסרב להציג אותו. הסוכן נמנע ואומר זאת, במקום לבדות אתר נופש שנשמע סביר.

אני צריך להיות כנה לגבי מה צילום המסך הזה הוא ומה הוא אינו. "Tabacon Springs Eco-Lodge" הוא נכס סינתטי שבדיתי במכוון, שם שמוזג משני אתרים אמיתיים, כדי להדגים את מצב הכשל. מערכת ההזמנות, ה־GDS, הכרטוס והתשלום הם כולם stubs מדומים. אין חשבון Amadeus או Sabre חי מאחורי זה. מה שכן אמיתי הוא המנגנון: שער שמסרב למלאי שאינו יכול לאשר, יושב בקוד במקום שהמודל לא יכול לדבר את דרכו מעבר אליו.
למה ה־Saga rollback הוא מה שמפריד דמו ממוצר
יכולתי לעצור בשערים ולהישאר עם דמו נחמד. הסיבה שלא עשיתי זאת היא הכשל שהתחיל את הכול: שלב המלון שמת אחרי שכבר הונפק כרטיס לטיסה. שער לא עוזר שם. הכרטיס אמיתי. החדר נעלם. משהו צריך לנקות.
אז כל צעד קדימה במכונה רושם את פעולת ההיפוך שלו ברגע שהוא רץ. כרטוס רושם "בטל כרטיס, חלון 24 שעות." החזקת מלאי רושמת את השחרור שלה. זהו תבנית ה־Saga, וכשצעד נכשל באמצע הזמנה, המנוע מריץ את הפיצויים האלה בסדר הפוך ורק אחר כך מדווח מה קרה. למטייל נאמרת האמת: הכרטיס בוטל, אין חיוב, הנה חלופות שתוכלו לאשר עכשיו.

לראות את ה־rollback הזה נורה בפעם הראשונה, הכרטיס מבטל את עצמו בלי שנגעתי בכלום, הוא הדבר הכי קרוב שהגעתי אליו לתחושה של מערכת אמינה ולא רק חכמה. ה־Saga rollback הוא הדבר שרוב ה־demos מדלגים עליו, והוא בדיוק מה שמפריד דמו ממוצר. הוא לא זוהר. הוא גם כל ההבדל בין "הכול מוכן" לבין אמירה כנה: "לא הצלחתי להשלים את זה, והנה מה שעשיתי בנידון."
ה־rollback אינו זוהר. הוא גם כל ההבדל בין מטייל תקוע לבין התנצלות כנה.
הדמו מראה את זה זה לצד זה מול סוכן ReAct אמיתי, הבסיס שבו ה־LLM בשליטה, שרץ על אותו תרחיש בדיוק. זה היה מכוון. לא רציתי לנצח בובת קש. רציתי את ההשוואה הכנה, אותו כשל מוזרק לשניהם, כך שההבדל שאתם רואים הוא ארכיטקטורה ולא שום דבר אחר.
מה הבנצ'מרק מוכיח, ומה לא?
הרצתי את שתי הארכיטקטורות דרך אותה אצווה כי לא סמכתי על האנקדוטות שלי עצמי. מאתיים הזמנות סינתטיות, seed אחד קבוע, אותם כשלי תשתית מוזרקים, דרך המנוע הדטרמיניסטי ודרך בסיס ה־LLM־בשליטה. התוצאות, לפי בנייה על האצווה הסינתטית של 200 תרחישים עם seed קבוע, הן חדות.

אני רוצה להיות זהיר עם המספרים האלה, כי הגרסה הזהירה היא הכנה. ה־100%, האפס תקועים, האפס מפוברקים הם נכונים לפי בנייה על אצווה סינתטית עם seed קבוע, לא ערבות עולם־פתוח שאני יכול לתת על תעבורת הייצור שלכם. הערבויות הדטרמיניסטיות מחזיקות כי הקוד לא יכול אחרת. כשלי הבסיס עולים מאותם נתונים. לנסח את זה רחב יותר מזה זה לעבור מתוצאה אמיתית לשיווק, וזה הדבר האחד שהשם של החברה הזו עומד נגדו.
המספר שאני מוצא את עצמי מדבר עליו הכי הרבה הוא האחרון. 3.25$ מול 7.57$ בהוצאת חיפוש GDS ממוצעת. חיפושים, לא רק הזמנות, מחויבים בערך ב־3$ עד 3.50$ למקטע, ו־Lufthansa העלתה שוב את העמלות האלה ב־1 בינואר 2026. סוכן ספקולטיבי שחוזר ומחפש בכל צעד הנמקה שורף את המרווח הזה. זרימה דטרמיניסטית עם מטמון — לא. הפער הזה הוא מספר מרווח, והוא מחזיק בכל איכות מודל, וזה כל העניין.
החלק שנותן לי לישון: הקבלה
בניתי עוד דבר אחד לפני שהכרזתי שסיימתי, והוא הכי פחות זוהר והדבר שאכפת לי ממנו הכי הרבה. כל הזמנה כותבת נתיב ביקורת JSON מסוג append-only: המודל והגרסה, הבקשה המטויפת, כל צומת עם הפסק הדטרמיניסטי שלו, כל פיצוי Saga שנורה, דגל הגילוי לפי סעיף 50 של חוק הבינה המלאכותית של האיחוד האירופי, והמצב הסופי. אפשר לייצא אותו כקובץ יחיד.

אני חוזר שוב ושוב ל־Air Canada. כשמשהו משתבש, ובנסיעות משהו תמיד משתבש בסוף, השאלה שבעל ציות צריך לענות עליה היא "מה הסוכן אמר למטייל, והאם אנחנו יכולים להוכיח למה." סעיף 50 של חוק הבינה המלאכותית של האיחוד האירופי, עם חובות שקיפות שחלות מ־2 באוגוסט 2026, הולך להפוך את השאלה הזו לשגרתית. זרימה דטרמיניסטית עם פסק בכל צומת נותנת לכם תשובה. שרשרת הנמקה נותנת לכם תמליל וכתף מורמת.
אם אתם רוצים ללחוץ על הכפתורים בעצמכם, הכול חי ב־veriprajna.com/he/demos/agentic-travel-booking. שברו אותו אם אתם יכולים. בשביל זה הוא שם.
על מה באמת שיניתי את דעתי?
התחלתי את זה באמונה שמודל מספיק טוב יעשה בסוף את כל זה למיותר, שדטרמיניזם הוא קביים לתקופת הביניים שלפני AGI. אני כבר לא מאמין בזה. הכשלים שבניתי נגדם במשך שבועות אינם מחכים למודל חכם יותר שיגיע. תעריף עדיין פג בין שתי קריאות. החזקה עדיין נדחית אחרי הנפקת כרטיס. אלה תכונות של התשתית, לא של האינטליגנציה, ומנוע הנמקה מושלם תוקע מטייל באותה מידה כמו מנוע הנמקה בינוני אם שום דבר במערכת לא בנוי לבטל את הכרטיס.
ואם תעדיפו לצפות בזה מאשר לקרוא אותי מתאר, הנה הכול רץ מקצה לקצה.
אז השאלה שאני ממשיך לשאול אנשים אחרים שבונים סוכנים היא זו שהייתי צריך לשאול את עצמי באותו לילה, כשצפיתי ביצירה שלי משקרת כל כך בנימוס. כשהסוכן שלכם אומר ללקוח "הכול מוכן," מה במערכת שלכם באמת יודע שזה נכון? אם התשובה היא "המודל, כנראה," אין לכם בעיית מודל. יש לכם בעיית זרימת בקרה, ואני באמת רוצה לדעת איך אתם מתכננים לפתור אותה.


