אינדקסים של Hierarchical Navigable Small World (HNSW) ב-AlloyDB ל-PostgreSQL מאפשרים לכם להאיץ חיפושים של דמיון וקטורי בהטמעות מאוחסנות עם היזכרות גבוהה וזמן אחזור נמוך של שאילתות. אתם יכולים ליצור אינדקסים של HNSW שמבוססים על גרפים באמצעות התוסף vector, לשנות את הפרמטרים של יצירת האינדקסים ולהריץ שאילתות דמיון על ההטמעות שנוספו לאינדקס. מידע נוסף על אחסון הטמעות זמין במאמר אחסון הטמעות וקטוריות.
לפני שמתחילים
לפני שמתחילים ליצור אינדקסים, צריך לוודא שמתקיימים התנאים המוקדמים הבאים.
וקטורי ההטמעה מתווספים לטבלה במסד הנתונים ב-AlloyDB.
גרסה
vectorשל התוסף0.5.0ואילך, שמבוססת עלpgvector, מותקנת. Google הרחיבה את התוסף הזה עבור AlloyDB.CREATE EXTENSION IF NOT EXISTS vector;
יצירת אינדקס של HNSW
AlloyDB תומך ביצירת אינדקס hnsw מבוסס-גרף
שזמין עם pgvector באמצעות התוסף pgvector של AlloyDB. שימוש באינדקס hnsw מוביל לחיפוש באלגוריתם חמדן שעובר בגרף ומחפש כל הזמן את השכן הכי קרוב לווקטור השאילתה, עד שהוא מוצא את התוצאה האופטימלית. הוא מספק ביצועי שאילתות מהירים יותר, אבל זמני ה-build איטיים יותר בהשוואה ל-IVF.
מידע נוסף על אלגוריתם HNSW זמין במאמר תרשימי Hierarchical Navigable Small World.
כדי ליצור אינדקס hnsw, מריצים את השאילתה הבאה:
CREATE INDEX INDEX_NAME ON TABLE
USING hnsw (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (m = NUMBER_OF_CONNECTIONS, ef_construction = 'CANDIDATE_LIST_SIZE');
מחליפים את מה שכתוב בשדות הבאים:
INDEX_NAME: השם של האינדקס שרוצים ליצור – לדוגמה,my-hnsw-index.
TABLE: הטבלה שאליה רוצים להוסיף את האינדקס.
EMBEDDING_COLUMN: עמודה שבה מאוחסנים נתונים מסוגvector.
DISTANCE_FUNCTION: פונקציית המרחק שבה רוצים להשתמש עם האינדקס הזה. צריך לבחור אחת מהאפשרויות:מרחק L2:
vector_l2_opsמכפלה פנימית:
vector_ip_opsמרחק קוסינוס:
vector_cosine_ops
NUMBER_OF_CONNECTIONS: המספר המקסימלי של חיבורים מכל צומת בגרף. אפשר להתחיל עם ערך ברירת המחדל16ולנסות ערכים גבוהים יותר בהתאם לגודל קבוצת הנתונים.
CANDIDATE_LIST_SIZE: גודל רשימת המועמדים שנשמרת במהלך בניית התרשים, שמעדכנת כל הזמן את המועמדים הטובים ביותר לשכנים הקרובים ביותר של צומת. מגדירים את הערך הזה לערך כלשהו שגבוה פי שניים מהערך שלm– לדוגמה,64.
כדי לראות את התקדמות ההוספה לאינדקס, משתמשים בתצוגה pg_stat_progress_create_index:
SELECT * FROM pg_stat_progress_create_index;
בעמודה phase מוצג המצב הנוכחי של יצירת האינדקס, והשלב building graph נעלם אחרי שהאינדקס נוצר.
כדי לכוונן את האינדקס ליעד של היזכרות ואיזון של QPS, אפשר לעיין במאמר בנושא כווננו של אינדקס hnsw.
הרצת שאילתה
אחרי שמאחסנים את ההטמעות במסד הנתונים ומוסיפים אותן לאינדקס, אפשר להתחיל לשלוח שאילתות באמצעות פונקציונליות השאילתות של pgvector.
כדי למצוא את השכנים הסמנטיים הקרובים ביותר לווקטור הטמעה, אפשר להריץ את השאילתה הבאה לדוגמה, שבה מגדירים את אותה פונקציית מרחק שבה השתמשתם במהלך יצירת האינדקס.
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']
LIMIT ROW_COUNT
מחליפים את מה שכתוב בשדות הבאים:
TABLE: הטבלה שמכילה את ההטמעה שאליה רוצים להשוות את הטקסט.
INDEX_NAME: השם של האינדקס שרוצים להשתמש בו, לדוגמהmy-hnsw-index.
EMBEDDING_COLUMN: העמודה שמכילה את ההטמעות השמורות.
DISTANCE_FUNCTION_QUERY: פונקציית המרחק שבה משתמשים בשאילתה הזו. בוחרים אחת מהאפשרויות הבאות, בהתאם לפונקציית המרחק שבה השתמשתם כשנוצר האינדקס:מרחק L2:
<->מכפלה פנימית:
<#>מרחק קוסינוס:
<=>
EMBEDDING: וקטור ההטמעה שרוצים למצוא את השכנים הסמנטיים הקרובים ביותר שלו שמאוחסנים.ROW_COUNT: מספר השורות שיוחזרו.ציינו
1אם אתם רוצים רק את ההתאמה הטובה ביותר.
למידע נוסף על דוגמאות אחרות לשאילתות, ראו שאילתות.
אפשר גם להשתמש בפונקציה embedding() כדי לתרגם את הטקסט לווקטור. מחילים את הווקטור על אחד מהאופרטורים של pgvector השכנים הקרובים ביותר, <-> למרחק L2, כדי למצוא את שורות מסד הנתונים עם ההטמעות הכי דומות מבחינה סמנטית.
מכיוון שהפונקציה embedding() מחזירה מערך real, צריך להגדיר במפורש את ההמרה של הקריאה embedding() ל-vector כדי להשתמש בערכים האלה עם אופרטורים של pgvector.
המאמרים הבאים
- יצירת אינדקס ScaNN
- הרצת חיפושים של דמיון וקטורי
- כוונון הביצועים של שאילתות וקטוריות
- מדדים של אינדקס וקטורי
- איך יוצרים עוזר חכם לשופינג באמצעות AlloyDB, pgvector וניהול נקודות קצה של מודלים