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

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

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

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

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

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 מציין שהיצירה של האינדקס מתקרבת לסיום.

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

הרצת שאילתה

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

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

  SELECT * FROM TABLE
    ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']
    LIMIT ROW_COUNT

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

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

  • EMBEDDING_COLUMN: העמודה שמכילה את ההטמעות המאוחסנות.

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

    • מרחק L2: <->

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

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

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

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

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

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

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

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

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