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