ביצוע חיפוש דמיון וקטורי באמצעות Vertex AI

ברוכים הבאים לחיפוש לפי דמיון וקטורי של Firebase SQL Connect – הטמעה של חיפוש סמנטי ב-Firebase שמשולב עם Google Vertex AI.

בבסיס התכונה הזו נמצאים הטמעות וקטוריות, שהן מערכים של מספרים עם נקודה עשרונית שמייצגים את המשמעות הסמנטית של טקסט או מדיה. על ידי הפעלת חיפוש של השכן הקרוב ביותר באמצעות הטמעת וקטור קלט, אפשר למצוא את כל התוכן שדומה מבחינה סמנטית. ‫SQL Connect משתמשת בתוסף pgvector של PostgreSQL כדי להפעיל את היכולת הזו.

החיפוש הסמנטי המתקדם הזה יכול לשמש בתרחישי שימוש כמו מנועי המלצות ומנועי חיפוש. הוא גם רכיב מרכזי ביצירה עם שליפה משופרת בתהליכי עבודה של AI גנרטיבי. במאמרי העזרה של Vertex AI אפשר לקבל מידע נוסף.

אתם יכולים להסתמך על התמיכה המובנית של SQL Connect ביצירת הטבעות וקטוריות באופן אוטומטי באמצעות Vertex AI Embeddings API, או להשתמש ב-API הזה כדי ליצור אותן באופן ידני.

דרישות מוקדמות

  • הגדרה של SQL Connect לפרויקט.

  • מפעילים את Vertex AI APIs.

הגדרה

אתם יכולים לבחור בין תהליך פיתוח מקומי (אם אתם מפתחי אתרים, Kotlin Android או iOS) לבין תהליך IDX (למפתחי אתרים). אתם יכולים להשתמש במסד נתונים מקומי או בפרויקט הייצור שלכם SQL Connect ובמופע Cloud SQL שלו ל-PostgreSQL לצורך פיתוח.

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

שילוב עם PostgreSQL מקומי

  1. מגדירים מכונת PostgreSQL מקומית.

  2. מקצים לעצמכם את תפקיד המשתמש ב-Vertex AI ב-IAM.

  3. בסביבה שלכם, מגדירים Google Cloud Application Default Credentials.

  4. במכונת PostgreSQL המקומית, מתקינים את התוסף pgvector.

  5. מפעילים את התוסף באמצעות CREATE EXTENSION vector לפי ההוראות במאגר pgvector repository.

שילוב עם IDX

  1. מגדירים את סביבת העבודה ב-IDX באמצעות התבנית SQL Connect.

  2. מקצים לעצמכם את תפקיד המשתמש ב-Vertex AI ב-IAM.

  3. מפעילים את התוסף באמצעות CREATE EXTENSION vector לפי ההוראות במאגר pgvector repository.

עיצוב הסכימה

כדי לבצע חיפוש וקטורי, מוסיפים שדה חדש מסוג Vector לסכימה. לדוגמה, אם רוצים לבצע חיפוש סמנטי באמצעות תיאורי סרטים, מוסיפים שדה להחזקת הטמעות וקטוריות שמשויכות לתיאור הסרט. בסכימה הזו, descriptionEmbedding נוסף כדי לאחסן הטמעות וקטוריות בשדה description.

type Movie @table {
 id: ID! @col(name: "movie_id") @default(id: ID! @col(name: "movie_id") @default(expr: "uuidV4()")
 title: String!
 description: String
 descriptionEmbedding: Vector! @col(size:768)
 // ...
}

יצירה ואחזור של הטמעות

SQL Connect כולל תמיכה משולבת בהטמעות וקטוריות עם ערך השרת _embed. ההנחיה הזו גורמת ל-SQL Connect ליצור הטמעות וקטוריות על ידי קריאה פנימית לממשקי ה-API של הטמעות ב-Vertex AI. _embed אפשר להשתמש בערך השרת גם במוטציות וגם בשאילתות.

מוטציות

יצירה ושמירה של הטמעה באמצעות SQL Connect

באפליקציית החיפוש הווקטורי, כדאי לבקש ליצור הטמעות ברגע שמוסיפים רשומות למסד הנתונים. הנה createMovie מוטציה שמוסיפה רשומה של סרט לטבלת Movie ומעבירה גם תיאור של סרט עם הטמעה מוגדרת model.

mutation createMovie($title: String!, $description: String!) {
  movie_insert(data: {
    title: $title,
    description: $description,
    descriptionEmbedding_embed: {model: "text-embedding-005", text: $description}
  })
}

במקרים מסוימים, יכול להיות שתרצו לעדכן את תיאור הסרט ואת ההטמעה שלו.

mutation updateDescription($id: String!, $description: String!) {
  movie_update(id: $id, data: {
    description: $description,
    descriptionEmbedding_embed: {model: "text-embedding-005", text: $description}
  })
}

כדי להתקשר למוטציה האחרונה מלקוח:

import { updateMovieDescription } from 'lib/dataconnect-sdk/';

await updateMovieDescription({ id: movieId, description: description});

// Use the response

שאילתות

מאחזרים הטמעות וקטוריות באמצעות שאילתה כמו זו שבהמשך. שימו לב שהערך descriptionEmbedding שמוחזר על ידי השאילתה הוא מערך של מספרים עשרוניים, שבדרך כלל לא קל לקרוא אותו. לכן, ערכי ה-SDK שנוצרו לא תומכים בהחזרה ישירה של הערך.SQL Connect

אפשר להשתמש בהטמעות וקטוריות שמוחזרות כדי לבצע חיפוש דמיון, כמו שמתואר בקטע הבא.

query getMovieDescription($id: String!) @auth(level: PUBLIC) {
 movie(id: $id)
   id
   description
   descriptionEmbedding
}

ביצוע חיפוש דמיון

עכשיו אפשר לבצע חיפוש של דמיון.

לכל שדה Vector,‏ SQL Connect יוצר פונקציית GraphQL שמיישמת את חיפוש הדמיון. שם הפונקציה שנוצרת הוא ${pluralType}_${vectorFieldName}_similarity. הפונקציה תומכת בכמה פרמטרים, כמו שמוצג בדוגמאות הבאות וברשימת ההפניות.

אפשר להגדיר פונקציית GraphQL שמפעילה את חיפוש הדמיון. כמו שצוין למעלה, ערך השרת _embed מכוון את SQL Connect ליצור את הטמעות הווקטורים באמצעות ממשקי ה-API של הטמעות של Vertex AI. במקרה הזה, ליצור הטמעות של מחרוזת החיפוש שמשמשת להשוואה עם הטמעות של תיאורי סרטים.

בדוגמה הזו, חיפוש הדמיון יחזיר עד 5 סרטים שהתיאור שלהם הכי קרוב מבחינה סמנטית לשאילתת הקלט. קבוצת התוצאות ממוינת בסדר עולה לפי המרחק – מהקרוב ביותר לרחוק ביותר.

query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
    movies_descriptionEmbedding_similarity(
      compare_embed: {model: "text-embedding-005", text: $query},
      where: {content: {ne: "No info available for this movie."}}, limit: 5)
      {
        id
        title
        description
      }
  }

שינוי שאילתת הדמיון

ערכי ברירת המחדל של פרמטרים לחיפוש כמו method ו-within מתאימים לרוב תרחישי השימוש. עם זאת, אם אתם מבחינים שהשאילתה מחזירה תוצאות שאין ביניהן דמיון רב מדי, או שהיא לא מחזירה תוצאות שאתם רוצים לכלול, נסו לשנות את הפרמטרים האלה.

כדי למצוא ערך מתאים ל-within, אפשר להוסיף את _metadata.distance לשדות שנבחרו כדי לראות מה המרחק של כל תוצאה מווקטור השאילתה. על סמך הערכים של distance שמוחזרים, אפשר להגדיר את הפרמטר within. רק תוצאות עם מרחק קטן מהערך של within ייכללו:

query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
    movies_descriptionEmbedding_similarity(
      compare_embed: {model: "text-embedding-005", text: $query},
      within: 2,
      where: {content: {ne: "No info available for this movie."}}, limit: 5)
      {
        id
        title
        description
        _metadata {
          distance
        }
      }
  }

אפשר גם להתנסות בפונקציות שונות של מרחק על ידי הגדרת הפרמטר method.

query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
    movies_descriptionEmbedding_similarity(
      compare_embed: {model: "text-embedding-005", text: $query},
      within: .5,
      method: COSINE,
      where: {content: {ne: "No info available for this movie."}}, limit: 5)
      {
        id
        title
        description
        _metadata {
          distance
        }
      }
  }

שימו לב: שיטות שונות מחזירות ערכים שונים מאוד למרחק. אם הגדרתם within, תצטרכו לשנות את הערך הזה שוב אחרי שתשנו את method.

הפעלת שאילתת הדמיון

כדי להתקשר לחיפוש דמיון מקוד לקוח:

import { searchMovieDescriptionUsingL2similarity} from 'lib/dataconnect-sdk';

const response = await searchMovieDescriptionUsingL2similarity({ query });

// Use the response

שימוש בהטמעות בהתאמה אישית

SQL Connect מאפשר גם לעבוד עם הטמעות ישירות בתור SQL Connects במקום להשתמש בערך השרת _embed כדי ליצור אותן.Vector

שמירת הטמעה בהתאמה אישית

באמצעות Vertex Embeddings API, מציינים מודל התאמה ומבקשים תוצאות הטמעה של המימד הנכון.

לאחר מכן, מעבירים את מערך המספרים העשרוניים שמוחזר ל-Vector כדי להעביר אותו לפעולת העדכון לצורך אחסון.

mutation updateDescription($id: String!, $description: String!, $descriptionEmbedding: Vector!) {
  movie_update(id: $id, data: {
    // title, genre...
    description: $description,
    descriptionEmbedding: $descriptionEmbedding
  })
}

ביצוע חיפוש דמיון באמצעות הטמעות בהתאמה אישית

מבצעים את אותה פעולה כדי לאחזר הטמעות של מונחי חיפוש ומבצעים המרה (cast) שלהם ל-Vectors.

לאחר מכן, קוראים לשאילתת _similarity כדי לבצע כל חיפוש.

query searchMovieDescriptionUsingL2Similarity($compare: Vector!, $within: Float, $excludesContent: String, $limit: Int) @auth(level: PUBLIC) {
    movies_descriptionEmbedding_similarity(
      compare: $compare,
      method: L2,
      within: $within,
      where: {content: {ne: $excludesContent}}, limit: $limit)
      {
        id
        title
        description
      }
  }

פריסה בסביבת הייצור

פריסת הסכימה והמחבר

השלב האחרון באיטרציה טיפוסית של SQL Connect הוא פריסת הנכסים בסביבת הייצור.

כשפורסים סכימה שמכילה סוגים של Vector ב-Cloud SQL באמצעות הפקודה firebase deploy, ה-CLI של Firebase מבצע את השלבים הנדרשים כדי להפעיל יצירת הטמעה מבוססת-Vertex AI במופע Cloud SQL.

firebase deploy --only dataconnect

אם רוצים להפעיל תמיכה בהטמעה במופע Cloud SQL באופן ידני, או אם נתקלים בשגיאה ב-CLI, צריך לפעול לפי ההוראות האלה.

תחביר של חיפוש וקטורי

תוספי סכימה

סוג הנתונים SQL Connect של Vector ממופה לסוג vector של PostgreSQL, כפי שמוגדר בתוסף pgvector. סוג הנתונים vector של pgvector מאוחסן כמערך של מספרים ממשיים עם דיוק יחיד ב-PostgreSQL.

ב-SQL Connect, הסוג Vector מיוצג כמערך של מספרים ב-JSON. הקלטים עוברים המרה למערך של ערכי float32. אם ההמרה נכשלת, מוצגת שגיאה.

משתמשים בפרמטר size של התגית @col כדי להגדיר את המידות של הווקטור.

type Question @table {
    text: String!
    category: String!
    textEmbedding: Vector! @col(size: 768)
}

האופרטור size נתמך רק בסוגי הערכים Vector. פעולות Vector, כמו חיפוש דמיון, מחייבות שכל ה-Vector יהיו בעלי אותו מספר ממדים.

directive @col(
  # … existing args
  """
  Defines a fixed column size for certain scalar types.

  - For Vector, size is required.
  - For all other types, size is currently unsupported and hence supplying it will result in a schema error.
  """
  size: Int
) on FIELD_DEFINITION

ערך השרת של שאילתות ומוטציות _embed

_embed

ערך השרת הזה מנחה את שירות SQL Connect ליצור ולאחסן הטמעות באמצעות Vertex AI Embedding APIs. אפשר להשתמש בערך השרת הזה גם בשאילתות וגם במוטציות.

פרמטרים לחיפוש דמיון

method: COSINE|INNER_PRODUCT|L2

פונקציית המרחק שמשמשת לחיפוש שכנים קרובים. האלגוריתמים שנתמכים כרגע הם קבוצת משנה של אלגוריתמי החיפוש של pgvector.

within: float

מגבלה על המרחק שבו מתבצע חיפוש השכן הקרוב ביותר.

where: FDC filter condition

אפשר לעיין במדריך בנושא סכימות, שאילתות ומוטציות.

limit: int

מספר התוצאות שיוחזרו.