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

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

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

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

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

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

    CREATE EXTENSION IF NOT EXISTS vector;
    

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

‫Stock pgvector תומך בחיפוש משוער של השכן הקרוב ביותר באמצעות יצירת אינדקס. ‫AlloyDB מוסיף לתמיכה הזו תכונה של כימות סקלרי שאפשר לציין כשיוצרים אינדקס. כשמפעילים את הכמותית הסקלרית, אפשר להאיץ באופן משמעותי שאילתות שמכילות וקטורים עם יותר ממדים, ולאחסן וקטורים עם עד 8,000 ממדים.

כדי להפעיל כימות סקלרי באינדקס שמבוסס על pgvector, צריך לציין את IVF כשיטת האינדקס ואת SQ8 ככמת:

CREATE INDEX INDEX_NAME ON TABLE
  USING ivf (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (lists = LIST_COUNT, quantizer = 'QUANTIZER');

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

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

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

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

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

    • מרחק L2: vector_l2_ops

    • מכפלה פנימית: vector_ip_ops

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

  • LIST_COUNT: מספר הרשימות שבהן יש להשתמש עם האינדקס הזה. מידע נוסף על קביעת הערך הזה זמין במאמר בנושא שיפור מדד IVF.

  • QUANTIZER: סוג הכמת שרוצים להשתמש בו.

    מגדירים את אחת מהאפשרויות הבאות:

    • SQ8: מומלץ. תשובה מהירה יותר לשאילתה, אבל יש פה איבוד של חלק מהמידע, שלא משפיע על תרחישי ייצור.
    • FLAT: תגובה איטית יותר לשאילתה ושימוש גבוה יותר בזיכרון, אבל יכולה להשיג אובדן זכירה זניח.

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

CREATE INDEX INDEX_NAME ON TABLE
  USING ivf (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)))'}} DISTANCE_FUNCTION)
  WITH (lists = LIST_COUNT, quantizer = 'SQ8');

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

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

SELECT * FROM pg_stat_progress_create_index;

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

כדי לכוון את האינדקס לערך recall ויעד QPS מאוזנים, אפשר לעיין במאמר בנושא כוונון של אינדקס IVF.

הרצת שאילתה

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

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

  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אופרטורי השכן הקרוב ביותר, <-> למרחק L2, כדי למצוא את שורות מסד הנתונים עם ההטמעות הדומות ביותר מבחינה סמנטית.

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

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