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

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

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

סקירה כללית

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

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

  • הגדלת החשיפה: תוכלו להבין אילו אותות תורמים לדירוג הסופי של תוצאות החיפוש.
  • שיפור אותות קיימים: שינוי המשקלים של אותות שונים כמו דמיון סמנטי, התאמה למילות מפתח או עדכניות של מסמך.
  • שילוב של לוגיקה עסקית: אפשר להוסיף ישירות לנוסחת הדירוג אותות מותאמים אישית מנתוני המסמכים.
  • אופטימיזציה שיטתית: אפשר להשתמש בספריית 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 דירוג ברירת המחדל של המסמך כפי שנקבע על ידי אלגוריתם הדירוג הרגיל של Agent Search.
semantic_similarity_score ציון שמחושב על סמך הטמעות של שאילתות ותוכן כדי לקבוע עד כמה שאילתת חיפוש דומה לתוכן של מסמך. הערך הזה מחושב באמצעות אלגוריתם קנייני של Google.
relevance_score ציון שנוצר על ידי מודל רלוונטיות עמוקה, שמטפל באינטראקציות מורכבות בין שאילתות למסמכים. המודל קובע את המשמעות והכוונה של שאילתה בהקשר של התוכן. הערך הזה מחושב באמצעות אלגוריתם קנייני של Google.
keyword_similarity_score ציון שמתמקד בהתאמה למילות מפתח. האות הזה מבוסס על פונקציית הדירוג Best Match 25 ‏ (BM25).
document_age

הגיל של המסמך בשעות. המערכת תומכת בערכים עם נקודה עשרונית. לדוגמה, ערך של 0.5 מייצג 30 דקות, וערך של 50 מייצג יומיים ושעתיים.

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

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": {
              "latitude": 52.23034637633789,
              "longitude": 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): ערכים חיוביים או שליליים של נקודה צפה שמוסיפים משקל לאות או לביטוי.

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

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

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

    • 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 הוא מספר חיובי עם נקודה עשרונית שאתם מספקים.

    הפונקציה 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.