תארו לעצמכם: אפליקציית המובייל שלכם מטפלת במאות פניות ביום. כל אחת מהן חייבת להיות מנותבת מיידית למחלקה הנכונה — תמיכה טכנית, חשבונאות, ניהול חשבונות. ללא ניתוב חכם, נציגים טובעים בכאוס ומשתמשים ממתינים שעות. אנו מתכננים ומיישמים פתרונות AI מוכחים שמנתחים מטא-דאטה של פניות ומשייכים את הנציג הטוב ביותר בשבריר שנייה, ומבטיחים דיוק ניתוב של 99.5%.
סיווג אומר "מה זה", ניתוב מחליט "מי מקבל את זה". ההבדל הוא מהותי. פנייה המסומנת כ"תקלה טכנית" — אבל לאיזה נציג או תור ספציפי היא צריכה להגיע? עובד בכיר, נציג עם התמחות מתאימה, נציג זמין באזור זמן נכון. ללא AI, כללים ידניים ב-Zendesk קורסים תחת עומס.
איך לאסוף הקשר על הלקוח הנייד?
אפליקציית המובייל היא נקודת הכניסה לפניות. הניתוב מתרחש בצד השרת; הלקוח שולח רק את הבקשה עם מטא-דאטה. אבל איכות הניתוב תלויה לחלוטין במטא-דאטה שהלקוח אוסף ומשדר. איסוף הקשר נכון הוא חצי מהקרב.
מטא-דאטה מינימלי לניתוב יעיל:
-
user_id+ היסטוריית פניות קודמות (נטען מהמטמון) -
platform(iOS/Android),app_version,os_version -
last_screen— המסך שבו המשתמש היה לפני שליחת הפנייה -
session_events— 20 הפעולות האחרונות מאנליטיקס (Firebase AnalyticslogEvent) - קטגוריה מהמסווג (אם מיושם)
-
device_locale— שפת המכשיר
ב-iOS (בנוי עם Swift SwiftUI) אנו אוספים:
struct TicketContext: Encodable {
let userId: String
let platform = "ios"
let appVersion: String = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? ""
let osVersion: String = UIDevice.current.systemVersion
let lastScreen: String
let sessionEvents: [String]
let locale: String = Locale.current.identifier
let previousTicketsCount: Int
}ב-Android — מחלקה דומה עם struct TicketContext: Encodable { let userId: String let platform = "ios" let appVersion: String = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "" let osVersion: String = UIDevice.current.systemVersion let lastScreen: String let sessionEvents: [String] let locale: String = Locale.current.identifier let previousTicketsCount: Int } ו-BuildConfig:
data class TicketContext(
val userId: String,
val platform: String = "android",
val appVersion: String = BuildConfig.VERSION_NAME,
val osVersion: String = Build.VERSION.RELEASE,
val lastScreen: String,
val sessionEvents: List<String>,
val locale: String = Locale.getDefault().toLanguageTag(),
val previousTicketsCount: Int
)מבנים אלה מקודדים ל-JSON ונשלחים לשרת יחד עם טקסט הפנייה. Apple Developer Documentation ממליצה להשתמש ב-Build.VERSION לסריאליזציה.
לוגיקת שרת: כללים, ML, או LLM?
השרת מקבל את הפנייה עם ההקשר ומריץ אותה דרך מנוע הניתוב. ישנן שלוש גישות, לכל אחת יש פשרות.
| גישה | מהירות | גמישות | קושי ביישום | עלות תפעול |
|---|---|---|---|---|
| כללים | גבוהה | נמוכה (עדכונים ידניים) | נמוך | אין (זמן שרת בלבד) |
| דירוג ML (LightGBM) | גבוהה | גבוהה (מאומן על נתונים) | בינוני | נמוכה (הסקה מהירה) |
| LLM (GPT-4o-mini) | בינונית | גבוהה מאוד (zero-shot) | נמוך (ללא אימון) | בינונית (~$0.0001/בקשה) |
כללים מתאימים ביותר לתרחישים קריטיים, ML לזרמים בנפח גבוה, LLM לאב-טיפוס מהיר. בפועל, אנו משתמשים בגישה היברידית: תחילה סינון עם כללים קשיחים (למשל, data class TicketContext( val userId: String, val platform: String = "android", val appVersion: String = BuildConfig.VERSION_NAME, val osVersion: String = Build.VERSION.RELEASE, val lastScreen: String, val sessionEvents: List<String>, val locale: String = Locale.getDefault().toLanguageTag(), val previousTicketsCount: Int ) + קטגוריה JSONEncoder → תור legacy), ולאחר מכן דירוג ML על פני נציגים זמינים. ניתוב היברידי זה משיג דיוק של 95% — מדויק פי 3 מכללים סטטיים — ומעבד פניות פי 2 מהר יותר.
אם הנפח שלכם קטן ואין לכם מדען נתונים, קריאת פונקציות של OpenAI עובדת כמסווג zero-shot:
# Backend (Python)
routing_response = openai.chat.completions.create(
model="gpt-4o-mini",
messages=[{
"role": "system",
"content": f"Available queues: {json.dumps(queue_descriptions)}. Route the ticket."
}, {
"role": "user",
"content": ticket_text
}],
tools=[route_ticket_tool],
tool_choice={"type": "function", "function": {"name": "route_ticket"}}
)עלות לכל קריאה של app_version < 3.0 היא כ-$0.0001. ב-1000 פניות ביום, זה $3 לחודש. אפשרי לסטארטאפים. חיסכון שנתי של עד $60,000 לצוות של 10 נציגים בעת מעבר מניתוב ידני.
הצגת סטטוס ניתוב בזמן אמת
לאחר השליחה, משתמשים רוצים לדעת מה קורה. יישמו WebSocket או SSE לעדכוני סטטוס בזמן אמת.
// Android - обновление статуса через StateFlow
class TicketStatusViewModel : ViewModel() {
private val _status = MutableStateFlow<TicketStatus>(TicketStatus.Sent)
val status = _status.asStateFlow()
fun observeTicket(ticketId: String) {
webSocketManager.observe(ticketId)
.onEach { event ->
when (event) {
is TicketEvent.Routed -> _status.value = TicketStatus.Routed(event.agentName, event.estimatedTime)
is TicketEvent.AgentAssigned -> _status.value = TicketStatus.InProgress(event.agentName)
is TicketEvent.Resolved -> _status.value = TicketStatus.Resolved
}
}
.launchIn(viewModelScope)
}
}ב-iOS — באופן דומה דרך billing + # Backend (Python) routing_response = openai.chat.completions.create( model="gpt-4o-mini", messages=[{ "role": "system", "content": f"Available queues: {json.dumps(queue_descriptions)}. Route the ticket." }, { "role": "user", "content": ticket_text }], tools=[route_ticket_tool], tool_choice={"type": "function", "function": {"name": "route_ticket"}} ) . ממשק המשתמש מתעדכן אוטומטית; המשתמש רואה את שם הנציג וזמן תגובה משוער.
טיפול בשגיאות ניתוב
נתבים עושים טעויות. חיוני לאפשר לנציגים להקצות מחדש פניות ולדחוף את האירוע חזרה למערכת — זהו אות אימון למודל. הלקוח הנייד חייב לשקף הקצאה מחדש ללא צורך בטעינה מחדש. טעות אופיינית היא אחסון רק של gpt-4o-mini בצד השרת ואי דחיפת עדכונים דרך התראות push. פתרון: השתמשו ב-WebSocket לדחיפת אירועי הקצאה מחדש.
התהליך שלנו
- ביקורת על כללי הניתוב הנוכחיים ותיאור תורים וקריטריונים.
- יישום איסוף הקשר בלקוח (ספריות iOS ו-Android).
- אינטגרציה עם מנוע הניתוב בצד השרת (כללים, ML, או LLM).
- הוספת עדכוני סטטוס בזמן אמת דרך WebSocket/SSE בממשק המשתמש.
- רישום הקצאות מחדש לשיפור המודל ובדיקות A/B לדיוק.
ספריית איסוף ההקשר ב-iOS היא בגודל של כ-50KB, והמקבילה ב-Android מוסיפה עומס זניח.
מה כלול
| שלב | תוצאה |
|---|---|
| ניתוח מערכת התמיכה הנוכחית | דיאגרמת תורים, קריטריוני הפצה, נקודות איסוף נתונים |
| פיתוח SDK ללקוח | ספריית איסוף מטא-דאטה ל-iOS/Android |
| אינטגרציה של מנוע ניתוב בשרת | נקודת קצה REST/GraphQL עם מודל ML |
| סטטוס בזמן אמת | ערוץ WebSocket/SSE, ווידג'טים לממשק המשתמש |
| בדיקות וניפוי שגיאות | בדיקת A/B, מדדי דיוק וזמן עיבוד |
| תיעוד והדרכת צוות | תיעוד API, לוחות מחוונים לניטור |
הערכות זמנים
ניתוב בסיסי מבוסס כללים עם הקשר לקוח — מ-5 ימים. תוכנית היברידית עם דירוג ML — מ-3 שבועות. סטטוס WebSocket בזמן אמת — מ-3 ימים בנפרד. מחזור יישום מלא — מ-2 חודשים.
לצוות שלנו יש ניסיון של 5+ שנים באוטומציה של תמיכה, עם למעלה מ-40 פרויקטים שיישמו ניתוב AI לאפליקציות מובייל. כדי לגלות כיצד טכנולוגיה זו יכולה לשפר את האפליקציה שלכם, צרו קשר — אנו נערוך ביקורת של המערכת הנוכחית שלכם ונציע את הפתרון האופטימלי.







