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

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

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

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

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

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

  • מגדירים את Data Connect בפרויקט.

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

הגדרה

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

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

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

  1. מגדירים מכונה מקומית של PostgreSQL.
  2. מקצים לעצמכם את תפקיד ה-IAM של משתמש Vertex AI.
  3. מגדירים את Application Default Credentials של Google Cloud בסביבה.
  4. מתקינים את התוסף pgvector במכונה המקומית של PostgreSQL.
  5. מפעילים את התוסף באמצעות CREATE EXTENSION vector לפי ההוראות במאגר pgvector.

שילוב עם IDX

  1. מגדירים את סביבת העבודה של IDX באמצעות התבנית של Data Connect.
  2. מקצים לעצמכם את תפקיד ה-IAM של משתמש Vertex AI.
  3. מפעילים את התוסף באמצעות CREATE EXTENSION vector לפי ההוראות במאגר pgvector.

עיצוב הסכימה

כדי לבצע חיפוש וקטורים, מוסיפים לשרטוט שדה חדש מסוג 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)
 // ...
}

יצירת הטמעות (embeddings) ואחזור שלהן

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

מוטציות

יצירה ואחסון של הטמעה באמצעות Data Connect

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

mutation createMovie($movieData: Movie_Data! @pick(fields: ["title", "genre", "description"])) {
  movie_insert(data: {
    ...movieData,
    descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $movieData.description}
  })
}

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

mutation updateDescription($id: String!, $description: String!) {
  movie_update(id: $id, data: {
    description: $description,
    descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $description}
  })
}

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

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

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

// Use the response

שאילתות

אחזור הטמעות של וקטורים באמצעות שאילתה כמו זו: שימו לב שהערך descriptionEmbedding שהשאילתה מחזירה הוא מערך של מספרים שגופים (floats), שבדרך כלל לא קריאים לבני אדם. לכן, ערכות SDK שנוצרו באמצעות Data Connect לא תומכות בהחזרת הערך הזה ישירות.

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

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

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

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

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

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

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

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

קריאה לשאילתת הדמיון

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

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

const response = await searchMovieDescriptionUsingL2similarity({ query });

// Use the response

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

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

אחסון הטמעה בהתאמה אישית

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

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

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

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

מבצעים את אותה פעולה כדי לאחזר הטמעות של מונחי חיפוש ולהעביר אותן ל-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
      }
  }

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

פריסה של הסכימה והמחבר

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

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

firebase deploy --only dataconnect

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

תחביר חיפוש של Vector

תוספי סכימה

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

ב-Data 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

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

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

method: COSINE|INNER_PRODUCT|L2

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

within: float

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

where: FDC filter condition

מדריך לסכמות, לשאילתות ולמוטציות

limit: int

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