ביצוע חיפוש דמיון וקטורי באמצעות 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

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