במסמך הזה מוסבר איך להשתמש בהטמעות מאוחסנות כדי ליצור אינדקסים ולשאילת הטמעות. מידע נוסף על אחסון הטמעות זמין במאמר אחסון הטמעות של וקטורים.
אפשר ליצור אינדקסים של ScaNN, IVF, IVFFlat ו-HNSW באמצעות AlloyDB.
לפני שמתחילים
לפני שמתחילים ליצור אינדקסים, צריך לוודא שמתקיימים התנאים המוקדמים הבאים.
וקטורים של הטמעה מתווספים לטבלה במסד הנתונים של AlloyDB.
הגרסה של התוסף
vector0.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, a
תוסף PostgreSQL שפותח על ידי Google ומיישם
אינדקס יעיל של שכן קרוב שמבוסס על [the ScaNN
algorithm](https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md).
האינדקס ScaNN הוא אינדקס קוונטיזציה מבוסס-עץ לאחזור
חיפוש השכן הקרוב ביותר. הוא מאפשר לבנות אינדקסים מהר יותר וליצור
הזיכרון שבשימוש בהשוואה ל-HNSW. בנוסף, הוא מספק QPS מהיר יותר ב-
השוואה ל-HNSW על סמך עומס העבודה.
טבלה במסד הנתונים של AlloyDB. אם מנסים ליצור אינדקס ScaNN
בטבלה ריקה או בטבלה מחולקת למחיצות, יכול להיות שתיתקלו בבעיות. למידע נוסף
מידע על השגיאות שנוצרו זמין במאמר פתרון בעיות באינדקס ScaNN.
עץ עם שתי רמות 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לקוונטיזציה מבוססת-עץ עם שלוש רמות.
אחרי שיוצרים את האינדקס, אפשר להריץ שאילתות חיפוש של השכן הקרוב ביותר
להשתמש באינדקס לפי ההוראות שבקטע [יצירת אינדקס של שכנים קרובים
שאילתה עם הטקסט שצוין](#query).
פרמטרי האינדקס צריכים להיות מוגדרים כך שיהיה איזון נכון בין QPS לבין
למידע נוסף על כוונון האינדקס של ScaNN, אפשר לעיין במאמר בנושא [כוונון אינדקס של ScaNN
index](/alloydb/omni/containers/15.7.0/docs/ai/tune-indexes).
כדי ליצור את האינדקס הזה בעמודת הטמעה שמשתמשת בסוג הנתונים 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 ב-Vector
functions](https://github.com/pgvector/pgvector?tab=readme-ov-file#vector-functions).
כדי לראות את התקדמות ההוספה לאינדקס, משתמשים בתצוגה pg_stat_progress_create_index:
SELECT * FROM pg_stat_progress_create_index;
בעמודה phase מוצג המצב הנוכחי של יצירת האינדקס, ובעמודה
השלב building index: tree training נעלם אחרי שיוצרים את האינדקס.
כדי לשפר את האינדקס כדי להשיג איזון בין יעד ההחזרה לבין QPS, אפשר לעיין במאמר בנושא שיפור אינדקס של ScaNN.
ניתוח הטבלה עם האינדקס
אחרי שיוצרים את האינדקס ScaNN, מריצים את הפקודה ANALYZE כדי לעדכן את הנתונים הסטטיסטיים לגבי הנתונים.
ANALYZE TABLE;
הרצת שאילתה
אחרי שמאחסנים ומבצעים אינדוקס של הטמעות במסד הנתונים, אפשר להתחיל
שליחת שאילתות באמצעות [pgvector query
פונקציונליות](https://github.com/pgvector/pgvector#querying). אי אפשר להריץ
שאילתות חיפוש בכמות גדולה באמצעות התוסף 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 nearest-neighbor operator, <-> for L2 distance, to find the database rows with the
הכי דומים מבחינה סמנטית.
מכיוון ש-embedding() מחזירה מערך real, צריך להגדיר במפורש את
embedding() call to 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: הטקסט שרוצים לתרגם להטמעה וקטורית.