מערכת המלצות בינה מלאכותית לאפליקציות מובייל: מדריך יישום
הבעיה: המלצות איטיות או לא רלוונטיות
לאחרונה, לקוח מתחום המסחר האלקטרוני פנה אלינו: אפליקציית ה-iOS שלהם הציגה המלצות עם עיכוב של 2 שניות — משתמשים גללו הלאה לפני שהן נטענו. שיעור ההמרה בבלוק ההמלצות היה 1.2%. העברנו את הדירוג מחדש הסופי למכשיר באמצעות CoreML — זמן התגובה ירד ל-50 אלפיות השנייה, ושיעור ההמרה עלה ל-4.1%. חיסכון במשאבי שרת: 40% (כ-$3,500 לחודש) עקב הפחתת בקשות. הבעיה של התחלה קרה למשתמשים חדשים נפתרה באמצעות שאלון קליטה (2 שאלות העדפה) ומנגנון גיבוי מבוסס פופולריות. לאחר 10 סשנים, המלצות מותאמות אישית פעלו.
אנחנו בונים מערכות המלצות בינה מלאכותית לא כקופסאות שחורות אלא כצינורות עיבוד: איסוף אירועי התנהגות, הזנתם למודלי ML, דירוג, והטמעה בממשק המשתמש ללא פגיעה בביצועים. לצוות שלנו יש ניסיון של 7+ שנים ו-15+ פרויקטים ל-iOS ו-Android. ארכיטקטורה היברידית עולה על פתרון שרת-טהור: שיעור הקלקות (CTR) גבוה פי 2–3 עם אותם נתונים.
איך לבחור ארכיטקטורה: במכשיר או בשרת?
| קריטריון | צד שרת | צד לקוח (CoreML/TFLite) |
|---|---|---|
| איכות | גבוהה (רואה את כל המשתמשים) | בינונית (רק המכשיר) |
| זמן השהיה | עיכוב רשת | מיידי, לא מקוון |
| פרטיות | נתונים על השרת | נתונים על המכשיר |
| עדכוני מודל | פעם ביום | אפשרי ללא שחרור גרסה |
דירוג מחדש במכשיר מקצר את זמן ההשהיה פי 3–5 וחוסך עד 60% ממשאבי השרת (עד $4,000 לחודש). בדיקות מראות שגישה היברידית משפרת את שיעור ההקלקות פי 2–3 לעומת שרת-טהור.
למה איסוף אירועים הוא הבסיס לאיכות?
מערכת המלצות טובה רק כמו הנתונים שלה. במובייל, יש לתעד לפחות:
-
item_view— צפייה באובייקט (עם זמן שהייה, לא רק חשיפה) -
item_click— הקשה/קליק על אובייקט -
item_purchase/item_save— פעולת המרה -
item_skip— גלילה מעבר (אות שלילי חשוב)
// Android: событийный логгер с батчингом
class RecoEventLogger(private val api: RecoApi) {
private val buffer = mutableListOf<RecoEvent>()
private val flushInterval = 30_000L // 30 секунд
fun log(event: RecoEvent) {
buffer.add(event.copy(timestamp = System.currentTimeMillis()))
if (buffer.size >= 20) flush() // или по таймеру
}
private fun flush() {
if (buffer.isEmpty()) return
val batch = buffer.toList()
buffer.clear()
viewModelScope.launch(Dispatchers.IO) {
runCatching { api.sendEvents(batch) }
// При ошибке — записать в Room для повторной отправки
}
}
}חשוב: זמן שהייה הוא לעיתים קרובות אות מוחמץ. עקבו אחרי מתי כרטיס נכנס לאזור התצוגה (RecyclerView.OnScrollListener או LazyList.onVisibleItemsChanged) ומתי הוא יוצא. צפייה של פחות מ-2 שניות היא כנראה גלילה חולפת. בפרויקט אחד, הוספת זמן שהייה הגדילה את שיעור ההקלקות ב-18%.
איך פועל דירוג מחדש במכשיר עם CoreML/TFLite?
אם השרת מחזיר 200 מועמדים מובילים, הדירוג הסופי יכול להתבצע במכשיר. זה מבטל בקשות רשת נוספות בכל פתיחת מסך.
ב-iOS עם CoreML:
// Загрузка модели (bundled или через Core ML Model Deployment)
let model = try MLModel(contentsOf: modelURL)
let input = RerankerInput(
userVector: userEmbedding, // Float32 array 64d
itemVectors: itemEmbeddings, // [Float32 array 64d]
sessionFeatures: sessionContext // последние 10 действий
)
let output = try model.prediction(from: input)
let scores = output.featureValue(for: "scores")?.multiArrayValueTensorFlow Lite ב-Android משתמש ב-Interpreter עם קלט ByteBuffer. עבור מודלים >10 MB, השתמשו ב-GPU delegate (GpuDelegate) — האצה של פי 3–8 במכשירי דגל.
עדכון המודל ללא שחרור אפליקציה: ב-iOS — Core ML Model Deployment דרך CloudKit או CDN מותאם עם // Android: событийный логгер с батчингом class RecoEventLogger(private val api: RecoApi) { private val buffer = mutableListOf<RecoEvent>() private val flushInterval = 30_000L // 30 секунд fun log(event: RecoEvent) { buffer.add(event.copy(timestamp = System.currentTimeMillis())) if (buffer.size >= 20) flush() // или по таймеру } private fun flush() { if (buffer.isEmpty()) return val batch = buffer.toList() buffer.clear() viewModelScope.launch(Dispatchers.IO) { runCatching { api.sendEvents(batch) } // При ошибке — записать в Room для повторной отправки } } } . ב-Android — Firebase ML עם RemoteModel או הורדת .tflite ישירה לתיקיית filesDir עם אימות hash.
שלבים ליישום מערכת המלצות
- נתונים ובדיקת אירועים — בדקו אילו אירועים כבר מתועדים, הוסיפו חסרים (זמן שהייה, דילוג).
- בחירת ארכיטקטורה — החליטו מה יישאר בשרת ומה במכשיר.
- פיתוח עוקב אירועים — עם אצירה, מנגנון ניסיון חוזר, אחסון Room למצב לא מקוון.
- מודל שרת — סינון שיתופי או שירות מוכן (Amazon Personalize, Google Recommendations AI).
- שילוב מודל לקוח — CoreML/TFLite, דירוג מחדש של מועמדים.
- רכיבי ממשק משתמש — בלוקים אדפטיביים עם טעינה עצלה.
- בדיקות A/B — Firebase Remote Config, Amplitude Experiment.
- תיעוד ואחריות ל-6 חודשים.
מה מספק דירוג מחדש במכשיר (השוואה)
| פרמטר | שרת בלבד | היברידי (שרת + מכשיר) |
|---|---|---|
| זמן הצגה | 200–500 אלפיות השנייה | 20–50 אלפיות השנייה |
| מספר בקשות | 1 לכל צפייה | 1 ליום |
| חיסכון במשאבי שרת | — | עד 60% (עד $4,000 לחודש) |
| איכות התאמה אישית | גבוהה | גבוהה מאוד (עם אותות סשן) |
איך להתמודד עם התחלה קרה?
ב-5–10 הסשנים הראשונים אין מספיק נתונים להתאמה אישית. הגישה הסטנדרטית — היברידית:
- שאלון קליטה (2–3 שאלות העדפה) נותן פרופיל ראשוני.
- המלצות מבוססות פופולריות כגיבוי.
- משוב סמוי מהאינטראקציות הראשונות מעדכן במהירות את הפרופיל.
הימנעו מהצגת "המלצות בשבילך" עד שנאספת היסטוריה מינימלית — זה הוגן למשתמש ושומר על איכות המדדים.
אילו מדדי איכות לעקוב?
שיעור הקלקות (CTR) והמרה הם בסיסיים. אבל עבור חוויית משתמש במובייל, עקבו גם אחרי "עיוורון להמלצות": אם הבלוק מתעלמים ממנו, זה גרוע יותר מ-CTR נמוך. בדיקות A/B דרך Firebase Remote Config או Amplitude Experiment הן חובה כשמשנים אלגוריתמים. גודל מדגם מינימלי למובהקות סטטיסטית: 1000+ משתמשים ייחודיים לכל וריאנט.
מה כלול (תוצרים)
- תיעוד טכני: ארכיטקטורת עוקב אירועים, מודל נתונים.
- קוד מקור של עוקב אירועים עם אצירה וניסיון חוזר (Swift/Kotlin).
- שילוב מודל המלצות שרת (או מותאם אישית).
- רכיב המלצות UI בתוך האפליקציה עם טעינה עצלה.
- הגדרת בדיקות A/B וניטור מדדים.
- הדרכת צוות לשימוש במערכת.
- 6 חודשי תמיכה טכנית.
הנחיות לוחות זמנים
שילוב שירות המלצות שרת מוכן עם עוקב אירועים — 2–3 שבועות. מערכת היברידית עם דירוג מחדש במכשיר, אירועים מותאמים אישית ובדיקות A/B — 6–10 שבועות. העלות נקבעת באופן אישי.
צרו קשר לבדיקת האפליקציה שלכם — נבחן את הארכיטקטורה שלכם ונציע את הפתרון האופטימלי. בקשו יישום וקבלו ייעוץ לבחירת מודל.







