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

בחירת גרסה של מאמר העזרה:

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

אפשר ליצור אינדקסים של ScaNN, IVF, IVFFlat ו-HNSW באמצעות AlloyDB.

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

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

  • וקטורים של הטמעה מתווספים לטבלה במסד הנתונים של AlloyDB.

  • הגרסה של התוסף vector 0.5.0 ואילך שמבוססת על pgvector, הורחבה על ידי Google עבור AlloyDB.

    CREATE EXTENSION IF NOT EXISTS vector;
    
  • כדי ליצור אינדקסים של ScaNN, צריך להתקין את התוסף alloydb_scann בנוסף לתוסף vector.

    CREATE EXTENSION IF NOT EXISTS alloydb_scann;
    

יצירת אינדקס

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

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

‫AlloyDB alloydb_scann, ‏ a

תוסף PostgreSQL שפותח על ידי Google ומיישם

אינדקס יעיל של שכן קרוב שמבוסס על [the ScaNN

algorithm](https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md).

האינדקס ScaNN הוא אינדקס קוונטיזציה מבוסס-עץ לאחזור

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

הזיכרון שבשימוש בהשוואה ל-HNSW. בנוסף, הוא מספק QPS מהיר יותר ב-

השוואה ל-HNSW על סמך עומס העבודה.

טבלה במסד הנתונים של AlloyDB. אם מנסים ליצור אינדקס ScaNN

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

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

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

כדי להחיל אינדקס עץ דו-רמתי באמצעות אלגוריתם ScaNN על עמודה

שמכיל הטמעות וקטורים מאוחסנות, מריצים את שאילתת ה-DDL הבאה:


CREATE INDEX INDEX_NAME ON TABLE

  USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)

  WITH (num_leaves=NUM_LEAVES_VALUE);

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

  • INDEX_NAME: השם של האינדקס שרוצים

    יצירה – לדוגמה, my-scann-index. השמות של האינדקסים משותפים

    במסד הנתונים. חשוב לוודא שכל שם של אינדקס הוא ייחודי

    טבלה במסד הנתונים.

  • TABLE: הטבלה שאליה רוצים להוסיף את האינדקס.

  • EMBEDDING_COLUMN: עמודה שמאחסנת vector

    נתונים.

  • DISTANCE_FUNCTION: פונקציית המרחק לשימוש

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

    • מרחק L2: l2

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

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

  • NUM_LEAVES_VALUE: מספר המחיצות להחלה

    האינדקס הזה. הערך יכול להיות בין 1 ל-1048576. למידע נוסף

    מידע נוסף על קביעת הערך הזה זמין במאמר בנושא התאמה של אינדקס ScaNN.

אינדקס של עץ עם שלוש רמות ScaNN

כדי ליצור אינדקס של עץ עם שלוש רמות באמצעות אלגוריתם ScaNN בעמודה

שמכיל הטמעות וקטורים מאוחסנות, מריצים את שאילתת ה-DDL הבאה:


CREATE INDEX INDEX_NAME ON TABLE

  USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)

  WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);

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

  • MAX_NUM_LEVELS: המספר המקסימלי של רמות

    עץ של אשכולות K-means. ההגדרה 1(ברירת מחדל) מיועדת למבנה היררכי דו-רמתי

    קוונטיזציה ועד 2 לקוונטיזציה מבוססת-עץ עם שלוש רמות.

אחרי שיוצרים את האינדקס, אפשר להריץ שאילתות חיפוש של השכן הקרוב ביותר

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

שאילתה עם הטקסט שצוין](#query).

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

למידע נוסף על כוונון האינדקס של ScaNN, אפשר לעיין במאמר בנושא [כוונון אינדקס של ScaNN

index](/alloydb/omni/containers/15.7.0/docs/ai/tune-indexes).

כדי ליצור את האינדקס הזה בעמודת הטמעה שמשתמשת בסוג הנתונים real[]

במקום vector, מבצעים המרה של העמודה לסוג הנתונים vector:


CREATE INDEX INDEX_NAME ON TABLE

  USING scann (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)) DISTANCE_FUNCTION)

  WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);

מחליפים את DIMENSIONS ברוחב המימדי של

עמודת הטמעה. מידע נוסף על איתור המאפיינים

אפשר לעיין בפונקציה vector_dims ב-Vector

functions](https://github.com/pgvector/pgvector?tab=readme-ov-file#vector-functions).

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


SELECT * FROM pg_stat_progress_create_index;

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

השלב building index: tree training נעלם אחרי שיוצרים את האינדקס.

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

ניתוח הטבלה עם האינדקס

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


ANALYZE TABLE;

הרצת שאילתה

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

שליחת שאילתות באמצעות [pgvector query

פונקציונליות](https://github.com/pgvector/pgvector#querying). אי אפשר להריץ

שאילתות חיפוש בכמות גדולה באמצעות התוסף alloydb_scann.

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

בדוגמת השאילתה הבאה, הגדרתם את אותה פונקציית מרחק שבה השתמשתם

במהלך יצירת האינדקס.


  SELECT * FROM TABLE

    ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']

    LIMIT ROW_COUNT

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

  • TABLE: הטבלה שמכילה את ההטמעה להשוואה

    שליחת הודעת טקסט.

  • INDEX_NAME: השם של האינדקס שרוצים להשתמש בו – למשל

    לדוגמה, my-scann-index.

  • EMBEDDING_COLUMN: העמודה שמכילה את

    הטמעות.

  • DISTANCE_FUNCTION_QUERY: פונקציית המרחק לשימוש עם

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

    במהלך יצירת האינדקס:

    • מרחק L2: <->

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

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

  • EMBEDDING: וקטור ההטמעה שרוצים למצוא את וקטור ההטמעה הכי קרוב שמאוחסן

    שכנים סמנטיים של.

  • ROW_COUNT: מספר השורות שיש להחזיר.

    מציינים 1 אם רוצים רק את ההתאמה הטובה ביותר.

דוגמאות נוספות לשאילתות זמינות במאמר

שאילתות.

אפשר גם להשתמש בפונקציה embedding() כדי לתרגם את

טקסט לווקטור. מחילים את הווקטור על אחד מה

pgvector nearest-neighbor operator, <-> for L2 distance, to find the database rows with the

הכי דומים מבחינה סמנטית.

מכיוון ש-embedding() מחזירה מערך real, צריך להגדיר במפורש את

embedding() call to vector כדי להשתמש בערכים האלה עם pgvector

אופרטורים.


  CREATE EXTENSION IF NOT EXISTS google_ml_integration;

  CREATE EXTENSION IF NOT EXISTS vector;



  SELECT * FROM TABLE

    ORDER BY EMBEDDING_COLUMN::vector

    <-> embedding('MODEL_IDVERSION_TAG', 'TEXT')

    LIMIT ROW_COUNT

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

  • MODEL_ID: המזהה של המודל שאליו רוצים לשלוח שאילתה.

    אם אתם משתמשים ב-Vertex AI Model Garden, צריך לציין את text-embedding-005 כמזהה המודל. אלה המודלים מבוססי-הענן ש-AlloyDB יכול להשתמש בהם להטמעות טקסט. מידע נוסף זמין במאמר בנושא הטמעות של טקסט.

  • אופציונלי: VERSION_TAG: תג הגרסה של המודל שאליו רוצים לשלוח שאילתה. מוסיפים את התג עם @.

    אם אתם משתמשים באחד ממודלי text-embedding באנגלית עם Vertex AI, צריך לציין אחד מתגי הגרסה – למשל, text-embedding-005, שמופיע בגרסאות המודלים.

    ‫Google ממליצה מאוד לציין תמיד את תג הגרסה. אם לא מציינים את תג הגרסה, מערכת AlloyDB תמיד משתמשת בגרסה העדכנית ביותר של המודל, וזה עלול להוביל לתוצאות לא צפויות.

  • TEXT: הטקסט שרוצים לתרגם להטמעה וקטורית.

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