יצירת אינדקס ScaNN

אינדקסים של Scalable Nearest Neighbors‏ (ScaNN) ב-AlloyDB ל-PostgreSQL מאפשרים להאיץ חיפושים וקטוריים של approximate nearest neighbor בהטמעות מאוחסנות.

אינדקס ScaNN הוא אינדקס קוונטיזציה מבוסס-עץ שנוצר על ידי Google, לחיפוש השכן הקרוב ביותר (ANN). הוא מספק זמן קצר יותר ליצירת אינדקס והזיכרון שבשימוש קטן יותר בהשוואה ל-HNSW. בנוסף, הוא מספק QPS מהיר יותר בהשוואה ל-HNSW, בהתאם לעומס העבודה.

לפני שמתחילים

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

יצירת אינדקס בכוונון אוטומטי

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

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

  • (ברירת המחדל) זמן האחזור והאחזור של החיפוש הווקטורי על חשבון זמן היצירה של האינדקס
  • איזון בין זמן בניית האינדקס לבין ביצועי החיפוש

כדי ליצור אינדקס ScaNN בכוונון אוטומטי, מריצים את הפקודה הבאה.

CREATE INDEX INDEX_NAME ON TABLE
       USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)

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

  • ‫INDEX_NAME: שם האינדקס שרוצים ליצור. לדוגמה, my_scann_index. שמות האינדקסים משותפים בכל מסד הנתונים. מוודאים שכל שם של אינדקס הוא ייחודי לכל טבלה במסד הנתונים.

  • ‫TABLE: הטבלה שאליה מוסיפים את האינדקס.

  • EMBEDDING_COLUMN: עמודה שבה מאוחסנים נתוני vector.

  • ‫DISTANCE_FUNCTION: פונקציית המרחק שבה משתמשים באינדקס הזה. צריך לבחור אחת מהאפשרויות:

    • מרחק L2: l2

    • מכפלה סקלרית: dot_product

    • מרחק קוסינוס: cosine

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

CREATE INDEX INDEX_NAME ON TABLE
       USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (MODE='AUTO',
      OPTIMIZATION='OPTIMIZATION',
      auto_maintenance='AUTO_MAINTENANCE')

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

  • ‫INDEX_NAME: שם האינדקס שרוצים ליצור. לדוגמה, my_scann_index. שמות האינדקסים משותפים בכל מסד הנתונים. מוודאים שכל שם של אינדקס הוא ייחודי לכל טבלה במסד הנתונים.

  • ‫TABLE: הטבלה שאליה מוסיפים את האינדקס.

  • EMBEDDING_COLUMN: עמודה שבה מאוחסנים נתוני vector.

  • ‫DISTANCE_FUNCTION: פונקציית המרחק שבה משתמשים באינדקס הזה. צריך לבחור אחת מהאפשרויות:

    • מרחק L2: l2

    • מכפלה סקלרית: dot_product

    • מרחק קוסינוס: cosine

  • (אופציונלי) OPTIMIZATION: מוגדר לאחת מהאפשרויות הבאות:

    • ‫SEARCH_OPTIMIZED (ברירת המחדל): אופטימיזציה של ה-recall והזמן של החיפוש הווקטורי, על חשבון זמני בנייה ארוכים יותר של האינדקס.

    • ‫BALANCED: איזון בין זמן בניית האינדקס לבין ביצועי החיפוש.

    אם מגדירים את OPTIMIZATION, צריך לכלול גם את MODE='AUTO'.

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

    • ‫ON (ברירת המחדל): AlloyDB מבצע תחזוקה אוטומטית של האינדקס.

    • OFF: AlloyDB לא מבצע תחזוקה אוטומטית של האינדקס.

יצירת אינדקס בכוונון ידני

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

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

אינדקס עץ דו-שלבי

CREATE INDEX INDEX_NAME ON TABLE
       USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (mode='MANUAL',
      num_leaves=NUM_LEAVES_VALUE,
      quantizer=QUANTIZER,
      auto_maintenance=AUTO_MAINTENANCE);
  • ‫INDEX_NAME: שם האינדקס שרוצים ליצור. לדוגמה, my_scann_index. שמות האינדקסים משותפים במסד הנתונים. חשוב לוודא שכל שם אינדקס הוא ייחודי לכל טבלה במסד הנתונים.
  • ‫TABLE: הטבלה שרוצים להוסיף לה את האינדקס.
  • ‫EMBEDDING_COLUMN: עמודה שבה מאוחסנים נתוני `vector`.
  • ‫DISTANCE_FUNCTION: פונקציית המרחק שבה משתמשים באינדקס הזה. בוחרים באחת מהאפשרויות הבאות:
    • מרחק L2: l2
    • מכפלה סקלרית: dot_product
    • מרחק קוסינוס: cosine
  • ‫NUM_LEAVES_VALUE: מספר המחיצות שצריך להחיל על האינדקס הזה. מגדירים ערך בין 1 ל-100 מיליון לגרסה 17 ומעלה של PostgreSQL, וערך בין 1 ל-30 מיליון לגרסה 16 ומטה של PostgreSQL. מידע נוסף מופיע במאמר כוונון אינדקס של ScaNN.
  • ‫QUANTIZER: סוג הקוונטיזציה שבה משתמשים. שימו לב שאפשר לטעון את אינדקס ScaNN למנוע מבוסס-עמודות כדי להאיץ עוד יותר את החיפוש הווקטורי. בוחרים באחת מהאפשרויות הבאות:
    • ‫(ברירת מחדל) SQ8: מספק איזון בין ביצועי השאילתה לבין אובדן מינימלי של שליפה. בדרך כלל מדובר בפחות מ-1-2%.
    • גרסת טרום-השקה (Preview) AH: גיבוב אסימטרי (AH) דחוס עד פי 4 בהשוואה ל-SQ8. כדי לשפר את ביצועי השאילתות, כדאי להשתמש במנוע מבוסס-העמודות כשהוא מופעל ונתוני האינדקס והטבלה מאוכלסים בו. מידע נוסף זמין במאמר שיטות מומלצות לכוונון ScaNN.
    • ‫FLAT: מספק את השליפה הגבוהה ביותר, 99% או יותר, על חשבון ביצועי החיפוש.
  • ‫(אופציונלי) AUTO_MAINTENANCE: קובע אם התחזוקה האוטומטית של האינדקס מופעלת או מושבתת. מידע נוסף על תחזוקה אוטומטית זמין במאמר תחזוקה של אינדקסים וקטוריים.
    • ‫ON: AlloyDB מבצע תחזוקה אוטומטית של האינדקס.
    • ‫(ברירת המחדל) OFF: מערכת AlloyDB לא מבצעת תחזוקה אוטומטית של האינדקס.

אינדקס עץ תלת-שלבי

CREATE INDEX INDEX_NAME ON TABLE
       USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (mode='MANUAL',
      num_leaves=NUM_LEAVES_VALUE,
      quantizer=QUANTIZER,
      auto_maintenance=AUTO_MAINTENANCE,
      max_num_levels = 2);
  • ‫INDEX_NAME: שם האינדקס שרוצים ליצור. לדוגמה, my_scann_index. שמות האינדקסים משותפים במסד הנתונים. חשוב לוודא שכל שם אינדקס הוא ייחודי לכל טבלה במסד הנתונים.
  • ‫TABLE: הטבלה שרוצים להוסיף לה את האינדקס.
  • ‫EMBEDDING_COLUMN: עמודה שבה מאוחסנים נתוני `vector`.
  • ‫DISTANCE_FUNCTION: פונקציית המרחק שבה משתמשים באינדקס הזה. בוחרים באחת מהאפשרויות הבאות:
    • מרחק L2: l2
    • מכפלה סקלרית: dot_product
    • מרחק קוסינוס: cosine
  • ‫NUM_LEAVES_VALUE: מספר המחיצות שצריך להחיל על האינדקס הזה. מגדירים ערך בין 1 ל-100 מיליון לגרסה 17 ומעלה של PostgreSQL, וערך בין 1 ל-30 מיליון לגרסה 16 ומטה של PostgreSQL. מידע נוסף מופיע במאמר כוונון אינדקס של ScaNN.
  • ‫QUANTIZER: סוג הקוונטיזציה שבה משתמשים. שימו לב שאפשר לטעון את אינדקס ScaNN למנוע מבוסס-העמודות כדי להאיץ עוד יותר את החיפוש הווקטורי. בוחרים אחת מהאפשרויות הבאות:
    • ‫(ברירת מחדל) SQ8: מספק איזון בין ביצועי השאילתה לבין אובדן מינימלי של שליפה. בדרך כלל מדובר בפחות מ-1-2%.
    • גרסת טרום-השקה (Preview) AH: גיבוב אסימטרי (AH) דחוס עד פי 4 בהשוואה ל-SQ8. כדי לשפר את ביצועי השאילתות, כדאי להשתמש במנוע מבוסס-העמודות כשהוא מופעל ונתוני האינדקס והטבלה מאוכלסים בו. מידע נוסף זמין במאמר שיטות מומלצות לכוונון ScaNN.
    • ‫FLAT: מספק את השליפה הגבוהה ביותר, 99% או יותר, על חשבון ביצועי החיפוש.
  • ‫(אופציונלי) AUTO_MAINTENANCE: קובע אם התחזוקה האוטומטית של האינדקס מופעלת או מושבתת. מידע נוסף על תחזוקה אוטומטית זמין במאמר תחזוקה של אינדקסים וקטוריים.
    • ‫ON: AlloyDB מבצע תחזוקה אוטומטית של האינדקס.
    • ‫(ברירת המחדל) OFF: מערכת AlloyDB לא מבצעת תחזוקה אוטומטית של האינדקס.
  • ‫max_num_levels = 2: המספר המקסימלי של רמות מרכז הכובד של עץ האשכולות של K-means. מגדירים את הפרמטר הזה לערך 2 כדי ליצור אינדקס עם שלוש רמות.

אינדקס עץ עם ארבע רמות

CREATE INDEX INDEX_NAME ON TABLE
       USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (mode='MANUAL',
      num_leaves=NUM_LEAVES_VALUE,
      quantizer=QUANTIZER,
      auto_maintenance=AUTO_MAINTENANCE,
      max_num_levels = 3);
  • ‫INDEX_NAME: שם האינדקס שרוצים ליצור. לדוגמה, my_scann_index. שמות האינדקסים משותפים במסד הנתונים. חשוב לוודא שכל שם אינדקס הוא ייחודי לכל טבלה במסד הנתונים.
  • ‫TABLE: הטבלה שרוצים להוסיף לה את האינדקס.
  • ‫EMBEDDING_COLUMN: עמודה שבה מאוחסנים נתוני `vector`.
  • ‫DISTANCE_FUNCTION: פונקציית המרחק שבה משתמשים באינדקס הזה. בוחרים באחת מהאפשרויות הבאות:
    • מרחק L2: l2
    • מכפלה סקלרית: dot_product
    • מרחק קוסינוס: cosine
  • ‫NUM_LEAVES_VALUE: מספר המחיצות שצריך להחיל על האינדקס הזה. מגדירים ערך בין 1 ל-100 מיליון לגרסה 17 ומעלה של PostgreSQL, וערך בין 1 ל-30 מיליון לגרסה 16 ומטה של PostgreSQL. מידע נוסף מופיע במאמר כוונון אינדקס של ScaNN.
  • ‫QUANTIZER: סוג הקוונטיזציה שבה משתמשים. שימו לב שאפשר לטעון את אינדקס ScaNN למנוע מבוסס-העמודות כדי להאיץ עוד יותר את החיפוש הווקטורי. בוחרים אחת מהאפשרויות הבאות:
    • ‫(ברירת מחדל) SQ8: מספק איזון בין ביצועי השאילתה לבין אובדן מינימלי של שליפה. בדרך כלל מדובר בפחות מ-1-2%.
    • גרסת טרום-השקה (Preview) AH: גיבוב אסימטרי (AH) דחוס עד פי 4 בהשוואה ל-SQ8. כדי לשפר את ביצועי השאילתות, כדאי להשתמש במנוע מבוסס-העמודות כשהוא מופעל ונתוני האינדקס והטבלה מאוכלסים בו. מידע נוסף זמין במאמר שיטות מומלצות לכוונון ScaNN.
    • ‫FLAT: מספק את השליפה הגבוהה ביותר, 99% או יותר, על חשבון ביצועי החיפוש.
  • ‫(אופציונלי) AUTO_MAINTENANCE: קובע אם התחזוקה האוטומטית של האינדקס מופעלת או מושבתת. מידע נוסף על תחזוקה אוטומטית זמין במאמר תחזוקה של אינדקסים וקטוריים.
    • ‫ON: AlloyDB מבצע תחזוקה אוטומטית של האינדקס.
    • ‫(ברירת המחדל) OFF: מערכת AlloyDB לא מבצעת תחזוקה אוטומטית של האינדקס.
  • ‫max_num_levels = 3: המספר המקסימלי של רמות מרכז הכובד של עץ האשכולות של K-means. מגדירים את הפרמטר הזה לערך 3 כדי ליצור אינדקס עם ארבע רמות.

המרת אינדקס שהותאם ידנית לאינדקס שהותאם אוטומטית

כדי להמיר אינדקס שהותאם ידנית לאינדקס שמותאם אוטומטית:

  1. איפוס כל הפרמטרים של השאילתה שהוגדרו לאינדקס שהותאם ידנית.

    ALTER INDEX INDEX_NAME RESET (PARAMETER_NAME);
    

    מחליפים את המשתנים הבאים:

    • ‫INDEX_NAME: שם האינדקס שרוצים להמיר. לדוגמה, my_scann_index. שמות האינדקסים משותפים בכל מסד הנתונים. מוודאים שכל שם של אינדקס הוא ייחודי לכל טבלה במסד הנתונים.

    • ‫PARAMETER_NAME: רשימה מופרדת בפסיקים שמכילה את השמות של הפרמטרים של השאילתה שרוצים לאפס. לדוגמה, num_leaves, quantizer.

      שימו לב שצריך לאפס את כל הפרמטרים האחרים של השאילתה לפני שמאפסים את num_leaves.

  2. כדי להמיר אינדקס שהותאם ידנית לאינדקס שמותאם אוטומטית, צריך להוסיף אותו מחדש לאינדקס.

    REINDEX INDEX CONCURRENTLY INDEX_NAME;
    

יצירת אינדקס ScaNN לסוגי נתונים של real[]

כדי ליצור אינדקס לעמודת הטמעה שמשתמשת בסוג הנתונים real[] במקום ב-vector, צריך להמיר את העמודה לסוג הנתונים vector:

CREATE INDEX INDEX_NAME ON TABLE
USING scann (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)) DISTANCE_FUNCTION)

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

  • ‫INDEX_NAME: שם האינדקס שרוצים ליצור. לדוגמה, my_scann_index. שמות האינדקסים משותפים בכל מסד הנתונים. מוודאים שכל שם של אינדקס הוא ייחודי לכל טבלה במסד הנתונים.

  • ‫TABLE: הטבלה שאליה מוסיפים את האינדקס.

  • ‫DIMENSIONS: מספר המאפיינים שהמודל תומך בהם.

  • EMBEDDING_COLUMN: עמודה שבה מאוחסנים נתוני vector.

  • ‫DISTANCE_FUNCTION: פונקציית המרחק שבה משתמשים באינדקס הזה. צריך לבחור אחת מהאפשרויות:

    • מרחק L2: l2

    • מכפלה סקלרית: dot_product

    • מרחק קוסינוס: cosine

צפייה בהתקדמות של ההוספה לאינדקס

כדי לראות את התקדמות ההוספה לאינדקס, משתמשים בתצוגה pg_stat_progress_create_index:

SELECT * FROM pg_stat_progress_create_index;

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

יצירת אינדקס מושהה לטבלאות ריקות או לטבלאות עם מספר לא מספיק של שורות

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

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

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

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

הפעלת יצירת אינדקס מושהה

כדי להפעיל יצירת אינדקס מושהה:

  1. מוודאים שהדגל scann.enable_index_maintenance ואחד מהדגלים הבאים מופעלים:

    כדי להגדיר את השימוש בהם, משתמשים ב-CLI של gcloud:

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

      gcloud alloydb instances update INSTANCE_ID \
         --database-flags scann.enable_index_maintenance=on \
         --database-flags scann.enable_preview_features=on \
         --region=REGION_ID \
         --cluster=CLUSTER_ID \
         --project=PROJECT_ID
      
    • כדי להפעיל באופן מפורש יצירת אינדקס מושהה בלי להפעיל תכונות אחרות בגרסת טרום-השקה (Preview):

      gcloud alloydb instances update INSTANCE_ID \
         --database-flags scann.enable_index_maintenance=on \
         --database-flags scann.enable_index_with_insufficient_data=on \
         --region=REGION_ID \
         --cluster=CLUSTER_ID \
         --project=PROJECT_ID
      

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

    • ‫INSTANCE_ID: מזהה המכונה.

    • ‫REGION_ID: האזור שבו נמצאת המכונה, לדוגמה us-central1.

    • ‫CLUSTER_ID: המזהה של האשכול שבו נמצא המכונה.

    • ‫PROJECT_ID: מזהה הפרויקט שבו נמצא האשכול.

  2. יוצרים אינדקס ScaNN:

    • כדי ליצור אינדקס בכוונון אוטומטי, צריך לציין במפורש את WITH (MODE='AUTO') בהצהרה CREATE INDEX:

      CREATE INDEX INDEX_NAME ON TABLE
             USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
      WITH (MODE='AUTO')
      

      מידע נוסף על הפרמטרים זמין במאמר יצירת אינדקס בכוונון אוטומטי.

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

מגבלות

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

אילוץ יצירת אינדקס בטבלאות ריקות או קטנות

‫AlloyDB משתמש באימותים כדי למנוע יצירה של אינדקס ScaNN בטבלה ריקה או בטבלה עם מעט מאוד שורות, מהסיבות הבאות:

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

  • יכול להיות שביצועי הכתיבה במסד הנתונים ירדו.

אם הביצועים לא אופטימליים, מומלץ לדחות את יצירת האינדקס.

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

כדי לאלץ יצירת אינדקס, מבצעים את השלבים הבאים:

  1. מגדירים את הפרמטר scann.allow_blocked_operations ברמת הסשן לערך true במסד הנתונים:

    SET scann.allow_blocked_operations = true;
    
  2. אם למשתמש שאתם משתמשים בו כדי להריץ את השאילתות האלה אין הרשאות SUPERUSER, הקצו לו אותן:

    CREATE USER USERNAME WITH SUPERUSER PASSWORD PASSWORD;
    

    מחליפים את המשתנים הבאים:

    • ‫USERNAME: שם המשתמש שרוצים לתת לו הרשאות SUPERUSER.

    • ‫PASSWORD: הסיסמה של המשתמש.

יצירת אינדקסים במקביל

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

למרות ש-AlloyDB מבצע אופטימיזציה אוטומטית של מספר ה-workers המקבילים, אתם יכולים לשנות את ה-workers המקבילים באמצעות הפרמטרים הבאים של תכנון שאילתות ב-PostgreSQL:

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

הרצת שאילתה

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

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

מכיוון שהפונקציה google_ml.embedding() מחזירה מערך אמיתי, צריך להמיר באופן מפורש את בקשה להפעלת פונקציה ל-vector לפני שמחילים אותה על אחד מהאופרטורים של השכן הקרוב ביותר, לדוגמה, <-> למרחק L2. לאחר מכן, האופרטורים האלה יכולים להשתמש באינדקס ScaNN כדי למצוא את שורות מסד הנתונים עם ההטמעות הכי דומות מבחינה סמנטית.

SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY
  google_ml.embedding(
      model_id => 'MODEL_ID',
      content => 'CONTENT')::vector
LIMIT ROW_COUNT

מחליפים את המשתנים הבאים:

  • ‫TABLE: הטבלה שמכילה את ההטמעה שאליה משווים את הטקסט.

  • ‫EMBEDDING_COLUMN: העמודה שמכילה את ההטמעות השמורות.

  • ‫DISTANCE_FUNCTION_QUERY: פונקציית המרחק שבה משתמשים בשאילתה הזו. בוחרים את השאילתה המקבילה לפונקציית המרחק שבה השתמשתם כשיצרתם את האינדקס:

    • מרחק L2: <->

    • מכפלה פנימית: <#>

    • מרחק קוסינוס: <=>

  • ‫MODEL_ID: המזהה של מודל ההטמעה הרשום שבו רוצים להשתמש.

  • ‫CONTENT: מחרוזת הטקסט שרוצים לתרגם להטמעה ולחפש.

  • ‫ROW_COUNT: מספר השורות שיוחזרו. לדוגמה, מציינים 1 אם רוצים את ההתאמה היחידה והטובה ביותר.

המאמרים הבאים