ברוכים הבאים לחיפוש הדמיון לפי וקטור של 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 מקומי
- מגדירים מכונה מקומית של PostgreSQL.
- מקצים לעצמכם את תפקיד ה-IAM של משתמש Vertex AI.
- מגדירים את Application Default Credentials של Google Cloud בסביבה.
- מתקינים את התוסף
pgvector
במכונה המקומית של PostgreSQL. - מפעילים את התוסף באמצעות
CREATE EXTENSION vector
לפי ההוראות במאגרpgvector
.
שילוב עם IDX
- מגדירים את סביבת העבודה של IDX באמצעות התבנית של Data Connect.
- מקצים לעצמכם את תפקיד ה-IAM של משתמש Vertex AI.
- מפעילים את התוסף באמצעות
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
מספר התוצאות שיש להחזיר.