לדלג לתוכן

איך מדרגים פיד חדשות - מקרה בוחן

בפוסט קודם דיברנו על איך בונים פיד חברתי מבחינת תשתית - מי רואה איזה פוסט, ואיך מפיצים פוסט חדש לעוקבים ביעילות. הפעם השאלה שונה - נניח שהתשתית כבר קיימת, איך בכלל מחליטים באיזה סדר להציג את הפוסטים? זו לא שאלת מדרגיות, אלא שאלה של מה שנקרא ranking - דירוג.

שלב 1 - למה כרונולוגי לא מספיק

הפתרון הכי פשוט הוא להציג פוסטים לפי זמן פרסום, החדש ביותר למעלה. זה עובד כשעוקבים אחרי מעט אנשים שמפרסמים לעיתים רחוקות, אבל נשבר כשמשתמש עוקב אחרי מאות חשבונות פעילים - הפיד מוצף בתוכן, והפוסטים החשובים ביותר עבור המשתמש הספציפי הזה יכולים בקלות להיטבע בתוך פוסטים פחות רלוונטיים שפורסמו רגע לפני. דירוג לפי רלוונטיות משוערת, לא רק זמן, הוא הפתרון שרוב הרשתות החברתיות הגדולות עברו אליו.

שלב 2 - מה בעצם מנבאים

הבעיה מנוסחת בדרך כלל כך - לכל פוסט, לחשב הסתברות שהמשתמש הספציפי הזה יתעניין בו, ולמיין לפי ההסתברות הזאת מהגבוהה לנמוכה. "התעניינות" מוגדרת בדרך כלל דרך מדדים ניתנים למדידה - הסתברות ללחוצה על לייק, הסתברות לתגובה, הסתברות לזמן צפייה ארוך, ולפעמים גם הסתברות שלילית - כמה סביר שהמשתמש ידווח על הפוסט או יסתיר אותו.

שלב 3 - פיצ'רים - המידע שהמודל מסתכל עליו

חיזוי כזה מתבסס על מודל שמקבל קלט של פיצ'רים - נתונים על הפוסט, על המשתמש, ועל היחס ביניהם. דוגמאות לפיצ'רים - כמה קרוב המשתמש למפרסם, לפי היסטוריית אינטראקציות קודמות בין השניים, סוג התוכן - תמונה, וידאו, טקסט - וכמה זמן עבר מאז הפרסום. גם מדדים גלובליים על הפוסט עצמו נכנסים לתמונה - כמה מעורבות הוא כבר קיבל ממשתמשים אחרים בדקות הראשונות שלו, שנחשב סימן חזק לאיכות התוכן.

שלב 4 - מודל פשוט מול מודל למידת מכונה

בהתחלה, ציון כזה יכול להיות פשוט - נוסחה ידנית שמשקללת כמה פיצ'רים עם משקלים קבועים, למשל ציון גבוה יותר לפוסט מחבר שאתם מתעדים אינטראקציה גבוהה איתו, ועוד ציון על סמך טריות. בקנה מידה גדול, רוב המערכות עוברות למודל למידת מכונה שאומן על נתוני מעורבות היסטוריים, ולומד בעצמו אילו שילובי פיצ'רים חוזים הכי טוב מעורבות עתידית. ההבדל המרכזי הוא שהמודל הנלמד יכול לתפוס דפוסים עדינים שקשה לנסח בנוסחה ידנית, אבל דורש תשתית אימון ותחזוקה שלמה סביבו.

שלב 5 - שני שלבים - שליפה ואז דירוג מדויק

בקנה מידה גדול, אי אפשר להריץ מודל דירוג מלא ומדויק על כל פוסט אפשרי בכל טעינת פיד - זה יקר מדי חישובית. הפתרון הנפוץ הוא שני שלבים - שלב שליפה (retrieval) שמצמצם מהר ובזול מיליוני פוסטים אפשריים למאות מועמדים סבירים, בעזרת חוקים פשוטים או מודל קל משקל, ואז שלב דירוג (ranking) שמריץ מודל מדויק ויקר יותר רק על אותם מאות מועמדים, כדי לקבוע את הסדר הסופי. חלוקה כזאת מאזנת בין דיוק לביצועים.

שלב 6 - גיוון והימנעות מבועה

דירוג שמבוסס רק על הסתברות מעורבות נוטה ליצור בועה - מציג שוב ושוב תוכן דומה לתוכן שכבר אהבתם, כי זה בדיוק מה שהמודל למד לחזות. מערכות בשלות מוסיפות שכבת גיוון מפורשת שמוודאת שהפיד לא מורכב רק מתוכן דומה מדי, ולפעמים גם מזריקה תוכן חדש או פחות צפוי בכוונה, כדי למנוע מהמשתמש להיתקע באותו סוג תוכן שוב ושוב.

זה תחום שמשלב עיצוב מערכות עם למידת מכונה, אבל הרעיונות הבסיסיים - שליפה זולה ואז דירוג יקר, פיצ'רים כמדד לרלוונטיות - שימושיים גם בלי לבנות מודל למידה מלא. בקורס ארכיטקטורת תוכנה שלנו נוגעים בזה כחלק ממקרי בוחן על מערכות תוכן בקנה מידה גדול.

בניתם מנגנון דירוג לתוכן במוצר שלכם? הצטרפו לקהילה בדיסקורד ותספרו איך ניגשתם לזה.

לסיכום

דירוג פיד חדשות עובר משאלה של סדר כרונולוגי פשוט לחיזוי רלוונטיות אישית עבור כל משתמש, על סמך פיצ'רים כמו קרבה בין משתמשים ומעורבות צפויה. בקנה מידה גדול, זה קורה בשני שלבים - שליפה זולה שמצמצמת את המועמדים, ואז דירוג יקר ומדויק רק על מה שנשאר, עם תשומת לב מיוחדת למניעת בועת תוכן חד גונית.