יצירת אינדקס HNSW

בחירת גרסה של מאמר העזרה:

בדף הזה מוסבר איך להשתמש בהטמעות מאוחסנות כדי ליצור אינדקסים ולשאול הטמעות באמצעות אינדקס HNSW ב-AlloyDB Omni. מידע נוסף על אחסון הטמעה זמין במאמר אחסון הטמעות של וקטורים.

לפני שמתחילים

לפני שמתחילים ליצור אינדקסים, צריך לוודא שמתקיימים התנאים המוקדמים הבאים.

יצירת אינדקס 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.

המאמרים הבאים