במסמך הזה מוסבר איך להשתמש בהטמעות מאוחסנות כדי ליצור אינדקסים ולהריץ שאילתות להטמעות. מידע נוסף על אחסון הטמעה זמין במאמר אחסון הטמעות של וקטורים.
אפשר ליצור אינדקסים של ScaNN, IVF, IVFFlat ו-HNSW באמצעות AlloyDB.
לפני שמתחילים
לפני שמתחילים ליצור אינדקסים, צריך לוודא שמתקיימים התנאים המוקדמים הבאים.
וקטורי הטמעה מתווספים לטבלה במסד הנתונים של AlloyDB.
גרסה
vectorשל התוסף0.5.0ואילך, שמבוססת עלpgvector, מותקנת. Google הרחיבה את התוסף הזה לשימוש ב-AlloyDB.CREATE EXTENSION IF NOT EXISTS vector;כדי ליצור אינדקסים של
ScaNN, צריך להתקין את התוסףalloydb_scannבנוסף לתוסףvector.CREATE EXTENSION IF NOT EXISTS alloydb_scann;
יצירת אינדקס
אפשר ליצור אחד מסוגי האינדקסים הבאים לטבלאות במסד הנתונים.
יצירת אינדקס ScaNN
AlloyDB alloydb_scann, תוסף ל-PostgreSQL שפותח על ידי Google ומיישם אינדקס יעיל מאוד של השכן הקרוב ביותר שמבוסס על אלגוריתם ScaNN.
האינדקס ScaNN הוא אינדקס קוונטיזציה מבוסס-עץ לחיפוש משוער של השכן הקרוב ביותר. הוא מספק זמן בניית אינדקס נמוך יותר והזיכרון שבשימוש קטן יותר בהשוואה ל-HNSW. בנוסף, הוא מספק QPS מהיר יותר בהשוואה ל-HNSW בהתאם לעומס העבודה.
אינדקס ScaNN של עץ עם שתי רמות
כדי להחיל אינדקס של עץ דו-רמתי באמצעות אלגוריתם ScaNN על עמוד שמכיל הטמעות וקטוריות מאוחסנות, מריצים את שאילתת ה-DDL הבאה:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE);
מחליפים את מה שכתוב בשדות הבאים:
INDEX_NAME: השם של האינדקס שרוצים ליצור, לדוגמהmy-scann-index. השמות של האינדקסים משותפים במסד הנתונים. חשוב לוודא שכל שם אינדקס הוא ייחודי לכל טבלה במסד הנתונים.
TABLE: הטבלה שאליה רוצים להוסיף את האינדקס.EMBEDDING_COLUMN: עמודה שמאחסנת נתוניםvector.
DISTANCE_FUNCTION: פונקציית המרחק לשימוש באינדקס הזה. צריך לבחור אחת מהאפשרויות:מרחק L2:
l2מכפלה סקלרית:
dot_productמרחק קוסינוס:
cosine
NUM_LEAVES_VALUE: מספר המחיצות שיוחלו על האינדקס הזה. הערך יכול להיות בין 1 ל-1048576. מידע נוסף על האופן שבו מחליטים על הערך הזה זמין במאמר בנושא התאמה של אינדקסScaNN.
אינדקס של עץ עם שלוש רמות ScaNN
כדי ליצור אינדקס של עץ עם שלוש רמות באמצעות אלגוריתם ScaNN בעמודה שמכילה הטמעות וקטוריות מאוחסנות, מריצים את שאילתת ה-DDL הבאה:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);
מחליפים את מה שכתוב בשדות הבאים:
-
MAX_NUM_LEVELS: המספר המקסימלי של רמות בעץ של אשכולות K-means. הערך1(ברירת מחדל) מגדיר קוונטיזציה מבוססת-עץ בשתי רמות, והערך2מגדיר קוונטיזציה מבוססת-עץ בשלוש רמות.
אחרי שיוצרים את האינדקס, אפשר להריץ שאילתות חיפוש של השכן הקרוב ביותר שמשתמשות באינדקס. כדי לעשות את זה, צריך לפעול לפי ההוראות במאמר איך מריצים שאילתת חיפוש של השכן הקרוב ביותר עם טקסט נתון.
צריך להגדיר את פרמטרים של האינדקס כך שיהיה איזון נכון בין QPS לבין recall. מידע נוסף על כוונון האינדקס של ScaNN זמין במאמר כוונון אינדקס של ScaNN.
כדי ליצור את האינדקס הזה בעמודת הטמעה שמשתמשת בסוג הנתונים real[] במקום vector, צריך להמיר את העמודה לסוג הנתונים vector:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)) DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);
מחליפים את DIMENSIONS ברוחב הממדי של עמודת ההטמעה. מידע נוסף על איתור המאפיינים זמין בפונקציה vector_dims במאמר פונקציות וקטוריות.
כדי להשיג חוויית חיפוש עקבית, מומלץ להפעיל תחזוקה אוטומטית כשיוצרים אינדקס ScaNN. מידע נוסף זמין במאמר בנושא תחזוקה של אינדקסים של וקטורים. התכונה הזו זמינה בגרסת טרום-השקה.
כדי לראות את התקדמות ההוספה לאינדקס, משתמשים בתצוגה pg_stat_progress_create_index:
SELECT * FROM pg_stat_progress_create_index;
בעמודה phase מוצג המצב הנוכחי של יצירת האינדקס, והשלב building index: tree training נעלם אחרי שהאינדקס נוצר.
כדי לכוון את האינדקס לזיכרון (recall) ול-QPS מאוזנים, אפשר לעיין במאמר בנושא כוונון אינדקס ScaNN.
ניתוח הטבלה שעברה אינדוקס
אחרי שיוצרים את האינדקס של ScaNN, צריך להריץ את הפקודה ANALYZE כדי לעדכן את הנתונים הסטטיסטיים לגבי הנתונים.
ANALYZE TABLE;
יצירת אינדקסים במקביל
יכול להיות ש-AlloyDB ייצור באופן אוטומטי כמה תהליכי עבודה מקבילים, בהתאם למערך הנתונים ולסוג האינדקס שתבחרו, כדי לבנות את האינדקס מהר יותר.
בניית אינדקס מקבילה מופעלת בדרך כלל כשיוצרים אינדקס ScaNN ברמה 3 או אם מערך הנתונים כולל יותר מ-100 מיליון שורות.
מערכת AlloyDB מבצעת אופטימיזציה אוטומטית של מספר העובדים המקבילים, אבל אתם יכולים לשנות את מספר העובדים המקבילים באמצעות הפרמטרים max_parallel_maintenance_workers, max_parallel_workers ו-min_parallel_table_scan_size לתכנון שאילתות ב-PostgreSQL.
הרצת שאילתה
אחרי ששומרים ומאנדקסים את ההטמעות במסד הנתונים, אפשר להתחיל לשלוח שאילתות באמצעות הפונקציונליות של שאילתת pgvector. אי אפשר להריץ שאילתות חיפוש בכמות גדולה באמצעות התוסף alloydb_scann.
כדי למצוא את השכנים הסמנטיים הקרובים ביותר לווקטור הטמעה, אפשר להריץ את השאילתה הבאה לדוגמה, שבה מגדירים את אותה פונקציית מרחק שבה השתמשתם במהלך יצירת האינדקס.
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.
CREATE EXTENSION IF NOT EXISTS google_ml_integration;
CREATE EXTENSION IF NOT EXISTS vector;
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN::vector
<-> embedding('MODEL_IDVERSION_TAG', 'TEXT')
LIMIT ROW_COUNT
מחליפים את מה שכתוב בשדות הבאים:
MODEL_ID: המזהה של המודל שאליו רוצים לשלוח שאילתה.אם אתם משתמשים ב-Vertex AI Model Garden, צריך לציין
text-embedding-005כמזהה המודל. אלה המודלים מבוססי-הענן ש-AlloyDB יכול להשתמש בהם להטמעות טקסט. מידע נוסף זמין במאמר בנושא הטמעות של טקסט.אופציונלי:
VERSION_TAG: תג הגרסה של המודל שאליו רוצים לשלוח שאילתה. מוסיפים את התג עם הקידומת@.אם אתם משתמשים באחד מהמודלים באנגלית של
text-embeddingעם Vertex AI, צריך לציין אחד מתגי הגרסה – למשל,text-embedding-005, שמופיע בגרסאות המודלים.Google ממליצה מאוד לציין תמיד את תג הגרסה. אם לא מציינים את תג הגרסה, AlloyDB תמיד משתמש בגרסה העדכנית ביותר של המודל, וזה עלול להוביל לתוצאות לא צפויות.
-
TEXT: הטקסט שרוצים לתרגם להטמעה וקטורית.