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

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

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

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

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

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

‫Stock pgvector תומך בחיפוש משוער של השכן הקרוב ביותר באמצעות יצירת אינדקס. ‫AlloyDB Omni מוסיף לתמיכה הזו תכונה של כימות סקלרי שאפשר לציין כשיוצרים אינדקס. כשמפעילים את הכמותית הסקלרית, אפשר להאיץ באופן משמעותי את השאילתות שמכילות וקטורים עם מימדים גדולים יותר, ולאחסן וקטורים עם עד 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.

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