התאמה אישית של דירוג תוצאות החיפוש

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

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

סקירה כללית

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

בעזרת דירוג בהתאמה אישית, אתם יכולים:

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

הצורך בדירוג בהתאמה אישית – דוגמה

נניח שמתבצעת שאילתה עם המחרוזת הבאה באתר להזמנת חדרים במלון:

luxury hotel with a large rooftop pool in Vancouver, pet-friendly and close to airport.

נניח שאלה הערכים שמאוחזרים:

  • מלון א': "מלון יוקרה מוביל בוונקובר עם נוף לנמל התעופה. יש במלון בריכה מדהימה על הגג. אין כניסה לחיות מחמד."
  • מלון ב': "מלון מסוגנן ומודרני במרכז ונקובר. מתאים לחיות מחמד עם חדרים מרווחים. כולל בריכה מקורה גדולה ומרכז כושר".
  • מלון ג': "מלון בוטיק מקסים שמאפשר כניסה של חיות מחמד ליד האקווריום (10 דקות הליכה ממרכז העיר). כולל חצר גן יפה. אין בריכה."
  • מלון ד': "אתר נופש כפרי איקוני. המסעדה ידועה באוכל המעולה ובשירות ללא רבב. במלון יש בריכה מקורה וספא. אפשר לקבל אפשרויות לינה ידידותיות לחיות מחמד לפי בקשה".

כל המלונות בקטלוג כוללים את השדה distance_from_airport בקילומטרים (ק"מ).

דירוג מבוסס-הטמעה

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

זה הדירוג הסביר מחיפוש רלוונטיות שמבוסס על הטמעה בלבד:

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

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

דירוג בהתאמה אישית

נניח שהגדרתם את ביטוי הדירוג הבא לתרחיש לדוגמה הזה. מידע על הרכיבים של הביטוי הזה זמין במאמר הטמעה של דירוג בהתאמה אישית.

rankingExpression = drr(semantic_similarity_score, 32) * 0.4 + drr(keyword_similarity_score, 32) * 0.3 + drr(c.distance_from_airport * -1, 32) * 0.8

כאשר distance_from_airport הוא שדה שאפשר לאחזר בקטלוג ו- c.distance_from_airport משמש כאות.

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

בדוגמה הזו, התהליך הזה מוסבר כך:

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

  2. פונקציית ההמרה של דירוג הדדי צפוף או drr() משמשת להמרת כל הציונים לאותו סולם.

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

הטבלה הבאה מציגה את האותות השונים לכל מלון:

מלון semantic_similarity_score keyword_similarity_score c.distance_from_airport ציון דירוג מותאם אישית דירוג בהתאמה אישית דירוג מבוסס-הטמעה
מלון א' ‫9.0 ‫6.2 ("airport", "luxury", "rooftop pool") 5.0 0.04879 2 1
מלון ב' 7.5 ‫5.6 ("pet-friendly", "downtown", "indoor pool", "stylish") 12.5 0.04691 3 2
מלון ג' 5.0 ‫3.4 ("pet-friendly", "downtown") 18 0.04525 4 4
מלון D 8.0 ‫4.5 ("בריכה מקורה", "מתאים לחיות מחמד", "כפרי") 1 0.04890 1 3

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

מידע על הטמעה של דירוג מותאם אישית

כדי לקבל דירוג מותאם אישית בתוצאות החיפוש, צריך לקרוא לשיטה search ולספק את השדות הבאים:

  • קצה עורפי של ביטוי דירוג (rankingExpressionBackend): השדה הזה מציין באיזה ממנגנוני הדירוג הבאים צריך להשתמש.

    • RANK_BY_EMBEDDING: זהו ערך ברירת המחדל אם השדה הזה לא צוין. אם בוחרים באפשרות הזו, התוצאות מדורגות לפי ביטוי דירוג מוגדר מראש שמבוסס על הטמעה או על רלוונטיות.
    • RANK_BY_FORMULA: האפשרות הזו מבטלת את דירוג ברירת המחדל ומאפשרת לכם לספק את הנוסחה המותאמת אישית בשדה rankingExpression.
  • ביטוי לדירוג (rankingExpression): השדה הזה מכיל נוסחה מתמטית שקובעת את הדירוג של המסמכים שאוחזרו.

    • במקרה של RANK_BY_EMBEDDING, זהו ניקוד שמבוסס על רלוונטיות (double * relevanceScore) או על הטמעה (double * dotProduct(embedding_field_path)).

    • במקרה של RANK_BY_FORMULA, מדובר בביטוי שנבחר בקפידה ומשלב כמה אותות כדי לחשב ציון חדש לכל תוצאת חיפוש.

אותות רגילים

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

שם האות תיאור
default_rank דירוג ברירת המחדל של המסמך כפי שנקבע על ידי אלגוריתם הדירוג הרגיל של חיפוש מבוסס סוכנים.
semantic_similarity_score ציון שמחושב על סמך הטמעות של שאילתות ותוכן כדי לקבוע עד כמה שאילתת חיפוש דומה לתוכן של מסמך. הערך הזה מחושב באמצעות אלגוריתם קנייני של Google.
relevance_score ציון שנוצר על ידי מודל רלוונטיות עמוקה, שמטפל באינטראקציות מורכבות בין שאילתות למסמכים. המודל קובע את המשמעות והכוונה של שאילתה בהקשר של התוכן. הערך הזה מחושב באמצעות אלגוריתם קנייני של Google.
keyword_similarity_score ציון שמתמקד בהתאמה למילות מפתח. האות הזה משתמש בפונקציית הדירוג Best Match 25 (BM25).
document_age הגיל של המסמך בשעות. המערכת תומכת בערכים עם נקודה עשרונית. לדוגמה, ערך של 0.5 מייצג 30 דקות, וערך של 50 מייצג יומיים ושעתיים.
pctr_rank דירוג שמציין את שיעורי ההמרה החזויים, שמחושבים על סמך נתוני אירועים של משתמשים. האות הזה מבוסס על שיעור קליקים צפוי (pCTR) כדי לאמוד את הרלוונטיות של תוצאת חיפוש מנקודת המבט של המשתמש.
topicality_rank דירוג שמציין את ההתאמה של מילת המפתח, שמחושב באמצעות אלגוריתם קנייני של Google.
boosting_factor שילוב של כל ההגברות המותאמות אישית שהחלתם על המסמך.

אותות בהתאמה אישית

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

שמות האותות הם שילוב של תווים אלפביתיים וקווים תחתונים (_). זו רשימה של שמות שמורים שאסור להשתמש בהם כשמות של אותות: log,‏ exp,‏ rr,‏ drr,‏ is_nan,‏ fill_nan ו-geo_distance.

מרחק גיאוגרפי – אות נגזר

אותות נגזרים, כמו מרחק גיאוגרפי, מחושבים על סמך אותות רגילים ומותאמים אישית. הפונקציה geodistance מחשבת את המרחק בין מיקום מקור למיקום יעד. הפונקציה geo_distance() מבוטאת בצורה geo_distance(source_location, destination_location). הוא מורכב מהארגומנטים הבאים:

  • מיקום המקור או source_location: המיקום שממנו מחושב המרחק, שיכול להיות אחד מהסוגים הבאים:

    • מיקום השאילתה: המיקום שמנותח מהשאילתה באמצעות מודלים של הבנת שפה טבעית. לדוגמה, בשאילתה Hotels along the M6, מודל הבנת השפה הטבעית שולף את Hotels כחלק מה של פרמטרי החיפוש ואת M6 כחלק איפה של פרמטרי החיפוש. החלק where הוא מיקום השאילתה ויכול להיות מיוצג כנקודה, כקו פוליגוני, כעיגול או כפוליגון.

      {
       "query": "Hotels along M6",
       "ranking_expression": "geo_distance(query_loc, c.hotel_location)",
       "ranking_expression_backend": "RANK_BY_FORMULA"
      }
      
    • בקשה לקואורדינטות של מיקום: מיקום שצוין במפורש בבקשת החיפוש, כמו קו הרוחב וקו האורך של המשתמש. לדוגמה, אפשר לציין את השאילתה כ-Hotels ולציין מיקום באמצעות קו רוחב וקו אורך.

      {
        "query": "Hotels",
        "user_info": {
          "precise_location": {
            "point": {
              "lat": 52.23034637633789,
              "lon": 20.98339855121653,
            }
          }
        },
        "ranking_expression": "geo_distance(request_loc, c.hotel_location)",
        "ranking_expression_backend": "RANK_BY_FORMULA"
      }
      
    • כתובת המיקום המבוקשת: כתובת שצוינה במפורש בבקשת החיפוש. לדוגמה, אפשר לספק את השאילתה כ-Hotels ולספק כתובת להפניה.

      {
        "query": "Hotels",
        "user_info": {
          "precise_location": {
            "address": "1800 Amphibious Blvd. Mountain View, CA 94045"
          }
        },
        "ranking_expression": "geo_distance(request_loc, c.hotel_location)",
        "ranking_expression_backend": "RANK_BY_FORMULA"
      }
      
  • מיקום היעד או destination_location: היעד לחישוב המרחק, שהוא שדה מותאם אישית שאפשר לאחזר כמו c.office_location או c.home_location.

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

התחביר של נוסחת הדירוג

נוסחת הדירוג בהתאמה אישית היא ביטוי מתמטי עם הרכיבים הבאים:

  • מספרים (double): ערכים חיוביים או שליליים של נקודה צפה שמוסיפים משקל לאות או לביטוי.

  • Signals (signal): השמות של האותות שמפורטים בקטע Standard signals.

  • אופרטורים אריתמטיים: + (חיבור) ו-* (כפל).

  • פונקציות מתמטיות:

    • log(expression): הלוגריתם הטבעי
    • exp(expression): האקספוננט הטבעי

    כל אחד מהביטויים האלה מקבל בדיוק ארגומנט אחד, שהוא ביטוי שנכתב במונחים של אות.

    דוגמאות לפונקציות תקינות: exp(c.document_age) ו-log(keywordSimilarityScore * 0.2 + 1.0).

  • פונקציית טרנספורמציה של דירוג הדדי צפוף (drr):

    הפונקציה הזו מיוצגת כ-drr(expression, k, eps). הפונקציה ממיינת קודם את המסמכים לפי הערך של expression בסדר יורד, ואז מקצה למסמכים דירוג. הערכים נחשבים שווים אם ההפרש ביניהם הוא eps. לאחר מכן הפונקציה מחשבת את הערך הסופי באמצעות הביטוי 1 / (rank_i + k). בביטוי הזה, rank_i הוא המיקום של המסמך ברשימה הממוינת, החל מ-0, ו-k הוא מספר חיובי עם נקודה צפה (floating-point) שאתם מספקים.

    הפונקציה drr() משמשת בדרך כלל להמרת כל הציונים לאותו קנה מידה, וכך אין צורך בנורמליזציה נוספת.

    ‫Google ממליצה להשתמש בפונקציה הזו במקום בפונקציית ההמרה הקודמת של דירוג הדדי (rr), כי היא נותנת תוצאות טובות יותר במקרים שבהם יש כמה אותות שקשורים לתוצאות המובילות. לדוגמה, אם החיפוש הוא של מלונות בתל אביב, יש הרבה מלונות בתחומי העיר, ולכן הרבה מלונות חולקים את אותו אות של מרחק גיאוגרפי.

    מידע נוסף על הפרמטר eps:

    • הפרמטר eps מוסיף גמישות כשקובעים אם שני אותות שווים. אותות מקבילים נמצאים בדרך כלל לאותות מהסוגים הבאים: boosting_factor, geo_distance, מותאמים אישית קטגוריים ומותאמים אישית מסוג מספר שלם.

    • הפונקציה קובעת אם ערך הביטוי ממסמך אחד שווה לערך הביטוי ממסמך אחר. אם eps=0, הערכים צריכים להיות זהים בדיוק כדי להיחשב שווים. אם eps>0, הערכים בטווח שצוין על ידי eps נחשבים שווים.

    • באופן ספציפי יותר, אם x1 ו-x2 הם ערכי אותות, הם נחשבים לאותו ערך אם ההפרש המוחלט ביניהם קטן מ-eps או שווה לו, כלומר אם abs(x1-x2) <= eps. כברירת מחדל, eps=0, כלומר הערכים נחשבים זהים אם x1 == x2. ערך ברירת המחדל של eps=0 מתאים למספרים שלמים, אבל יכול להיות שהוא לא יתאים במקרים מסוימים למספרים עשרוניים, בגלל חוסר הדיוק של פעולות חשבוניות עם מספרים עשרוניים. לדוגמה, יכול להיות שהערך של 1/5 יהיה 0.20000000000001 או 0.19999999999.

  • פונקציית טרנספורמציה של דרגה הפוכה (rr): הפונקציה הזו מבוטאת כ-rr(expression, k). קודם כל, המסמכים ממוינים לפי הערך של expression בסדר יורד, ומוקצה להם דירוג. לאחר מכן המערכת מחשבת את הערך הסופי באמצעות הביטוי 1 / (rank_i + k). בביטוי הזה, rank_i הוא המיקום של המסמך ברשימה הממוינת, החל מ-0, ו-k הוא מספר חיובי עם נקודה צפה שאתם מספקים.

    הפונקציה rr() משמשת בדרך כלל להמרת כל הציונים לאותו קנה מידה, וכך אין צורך בנורמליזציה נוספת.

    הפונקציה הזו נתמכת, אבל Google ממליצה להשתמש בפונקציית הטרנספורמציה החדשה יותר של דירוג הדדי צפוף (drr).

  • פונקציות לטיפול בערך NaN (לא מספר):

    • is_nan(expression): אם הערך של הביטוי הוא NaN, למשל אם חסר אות במסמך, הפונקציה מחזירה את הערך 1. אחרת, מוחזר הערך 0.
    • fill_nan(arg_expression, fill_with_expression): אם הערך של arg_expression הוא NaN, הפונקציה מחזירה fill_with_expression. אחרת, הפונקציה מחזירה arg_expression. ההגדרה הזו חשובה לטיפול במסמכים שאולי חסרים בהם אותות מסוימים.

דוגמאות לנוסחאות לדירוג

ריכזנו כאן כמה דוגמאות לנוסחאות דירוג שאפשר להשתמש בהן בשדה rankingExpression של בקשת החיפוש:

  • שילוב לינארי אלמנטרי:

    semantic_similarity_score * 0.7 + keyword_similarity_score * 0.3
    
  • נוסחה מורכבת שמשתמשת בדרגה ההדדית הצפופה ובטיפול ב-NaN:

    drr(fill_nan(semantic_similarity_score, 0), 40) * 0.5 + drr(topicality_rank * -1, 40) * 0.5
    
  • נוסחה מורכבת שמשתמשת בדרגה הדדית צפופה, בפונקציה מעריכית ובטיפול ב-NaN:

    drr(fill_nan(semantic_similarity_score, 0), 40) * 0.2 + exp(keyword_similarity_score) * 0.3 + is_nan(keyword_similarity_score) * 0.1
    
  • נוסחה מורכבת שמשתמשת בדרגת הדחיסות ההדדית עם הפונקציה geo_distance(), וממחישה את השימוש בפרמטר eps עם הפונקציה geo_distance():

    drr(keyword_similarity_score, 16) * 0.8 + drr(geo_distance(query_loc, c.office_location) * -1, 16, 0.00001) * 0.2
    

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

אותות בתגובה

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

שדות טקסט לדמיון בין מילות מפתח

כדי לקבל את אות ה-keywordSimilarityScore בתגובה לחיפוש במאגרי נתונים מובְנים, צריך לעדכן את הסכימה באופן הבא:

  • ממפים את שדות הטקסט שחיוניים להתאמה למילות מפתח למאפייני המפתח title ו-description
  • תעדכן את ההערה לשדות הטקסט ל-Searchable

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

  1. מגדירים ביטוי לדירוג.

  2. מקבלים תוצאות חיפוש.

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:search" \
    -d '{
    "servingConfig": "projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search",
    "query": "QUERY",
    "rankingExpression": "RANKING_EXPRESSION",
    "rankingExpressionBackend": "RANK_BY_FORMULA"
    }'
    

    מחליפים את מה שכתוב בשדות הבאים:

שינוי נוסחת הדירוג באמצעות ספריית Python

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

תהליך העבודה הכללי הוא כזה:

  1. מכינים מערך נתונים של שאילתות עם תוויות זהב תואמות. תוויות הזהב האלה יכולות להיות שדות מזהים ייחודיים, כמו מזהה המסמך, שיכולים לעזור לכם לשייך את אובייקט SearchResult בתגובה לחיפוש.
  2. כדי לקבל את אותות הדירוג הזמינים לכל המסמכים שמוחזרים, צריך להפעיל את search API עבור קבוצה של שאילתות מייצגות. אפשר לראות את זה בשדה SearchResult.rankSignals. אחסון הנתונים האלה יחד עם התוויות המאומתות.
  3. משתמשים בספריית Python כדי לאמן מודל דירוג על מערך הנתונים הזה. מידע נוסף זמין במאמר בנושא ספריית Clearbox Python.

  4. להמיר את הנוסחה מתוצאות האימון לביטוי דירוג, שאחר כך תוכלו להשתמש בו בקריאות ל-API.