בדף הזה נסביר איך להשתמש בהטמעות מאוחסנות כדי ליצור אינדקסים ולשאילת הטמעות באמצעות IVFFlatאינדקס עם AlloyDB.
למידע נוסף על אחסון הטמעות, אפשר לעיין במאמר אחסון הטמעות וקטוריות.
לפני שמתחילים
לפני שמתחילים ליצור אינדקסים, צריך לוודא שמתקיימים התנאים המוקדמים הבאים.
וקטורים של הטמעה מתווספים לטבלה במסד הנתונים של AlloyDB.
הגרסה של התוסף
vector0.5.0ואילך שמבוססת עלpgvector, הורחבה על ידי Google עבור AlloyDB.CREATE EXTENSION IF NOT EXISTS vector;
יצירת אינדקס IVFFlat
Stock pgvector מספק גם גרסה של אינדקס IVF בשם IVFFlat, שמאפשרת זמן בנייה מהיר יותר ושימוש קטן יותר בזיכרון בהשוואה לאינדקס hnsw.
כדי ליצור אינדקס IVFFlat, מבצעים את השלבים הבאים:
CREATE INDEX INDEX_NAME ON TABLE
USING ivfflat (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (lists = LIST_COUNT);
מחליפים את מה שכתוב בשדות הבאים:
INDEX_NAME: השם של האינדקס שרוצים ליצור, לדוגמהmy-ivf-index.
TABLE: הטבלה שאליה רוצים להוסיף את האינדקס.EMBEDDING_COLUMN: עמודה שמאחסנת נתוניםvector
DISTANCE_FUNCTION: פונקציית המרחק לשימוש באינדקס הזה. צריך לבחור אחת מהאפשרויות:מרחק L2:
vector_l2_opsמכפלה פנימית:
vector_ip_opsמרחק קוסינוס:
vector_cosine_ops
LIST_COUNT: מספר הרשימות שבהן יש להשתמש עם האינדקס הזה. מידע נוסף על אופן קביעת הערך הזה זמין במאמר בנושא התאמה של אינדקס IVFFlat.כדי ליצור את האינדקס הזה בעמודת הטמעה שמשתמשת בסוג הנתונים
real[]במקוםvector, צריך להמיר את העמודה לסוג הנתוניםvector:
CREATE INDEX INDEX_NAME ON TABLE
USING ivfflat (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)))'}} DISTANCE_FUNCTION)
WITH (lists = LIST_COUNT);
מחליפים את DIMENSIONS ברוחב הממדי של עמודת ההטמעה. מידע נוסף על איתור המאפיינים זמין בפונקציה vector_dims במאמר פונקציות וקטוריות.
כדי לראות את התקדמות ההוספה לאינדקס, משתמשים בתצוגה pg_stat_progress_create_index:
SELECT * FROM pg_stat_progress_create_index;
בעמודה phase מוצג המצב הנוכחי של יצירת האינדקס.
כדי לכוונן את האינדקס כדי להשיג איזון בין היעד לבין QPS, אפשר לעיין במאמר בנושא כווננו של אינדקס IVFFlat.
הרצת שאילתה
אחרי שמאחסנים את ההטבעות ומבצעים אינדוקס שלהן במסד הנתונים, אפשר להתחיל לשלוח שאילתות באמצעות פונקציית השאילתות של 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.
המאמרים הבאים
- יצירת אינדקס ScaNN
- הרצת חיפושים של דמיון וקטורי
- שיפור הביצועים של שאילתות וקטוריות
- מדדים של אינדקס וקטורים
- איך יוצרים עוזר חכם לשופינג באמצעות AlloyDB, pgvector וניהול נקודות קצה של מודלים