בדף הזה מוסבר איך להשתמש בהטמעות מאוחסנות כדי ליצור אינדקסים ולשאילת הטמעות באמצעות אינדקס IVF ב-AlloyDB Omni. מידע נוסף על אחסון הטמעות זמין במאמר אחסון הטמעות וקטוריות.
לפני שמתחילים
לפני שמתחילים ליצור אינדקסים, צריך לוודא שמתקיימים התנאים המוקדמים הבאים.
וקטורים של הטמעה מתווספים לטבלה במסד הנתונים של AlloyDB Omni.
גרסה
vectorשל התוסף0.5.0ואילך שמבוססת עלpgvector, הורחבה על ידי Google עבור AlloyDB Omni.CREATE EXTENSION IF NOT EXISTS vector;
יצירת אינדקס 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.
המאמרים הבאים
- יצירת אינדקס ScaNN
- הרצת חיפושים של דמיון וקטורי
- שיפור הביצועים של שאילתות וקטוריות
- מדדים של אינדקס וקטורים
- איך יוצרים עוזר חכם לשופינג באמצעות AlloyDB, pgvector וניהול נקודות קצה של מודלים