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