ברוכים הבאים לחיפוש דמיון וקטורי של Firebase Data Connect – הטמעה של חיפוש סמנטי ב-Firebase שמשולבת עם Google Vertex AI.
בבסיס התכונה הזו נמצאים הטמעות וקטוריות, שהן מערכים של מספרים עם נקודה צפה שמייצגים את המשמעות הסמנטית של טקסט או מדיה. אם מריצים חיפוש של השכן הקרוב ביותר באמצעות הטמעה של וקטור קלט, אפשר למצוא את כל התוכן שדומה מבחינה סמנטית. Data Connect משתמשת בתוסף של PostgreSQL
pgvector
כדי להפעיל את היכולת הזו.
החיפוש הסמנטי המתקדם הזה יכול להניב תרחישי שימוש כמו מנועי המלצות ומנועי חיפוש. בנוסף, הוא רכיב מרכזי בשליפה משופרת של דור בתהליכי עבודה של AI גנרטיבי. במאמרי העזרה של Vertex AI אפשר לקבל מידע נוסף.
אפשר להסתמך על התמיכה המובנית של Data Connect ביצירה אוטומטית של הטמעות וקטוריות באמצעות Vertex AI's Embeddings API, או להשתמש ב-API הזה כדי ליצור אותן באופן ידני.
דרישות מוקדמות
מגדירים את Data Connect לפרויקט.
מפעילים את ממשקי Vertex AI API.
הגדרה
אפשר לבחור בין תהליך פיתוח מקומי (אם אתם מפתחי אתרים, Kotlin Android או iOS) לבין תהליך IDX (למפתחי אתרים). אתם יכולים להשתמש במסד נתונים מקומי או בפרויקט Data Connect בסביבת הייצור ובמופע Cloud SQL ל-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)
// ...
}
יצירה ואחזור של הטמעות
Data Connect כולל תמיכה משולבת בהטמעות וקטוריות עם ערך השרת _embed
. ההנחיה הזו גורמת ל-Data Connect ליצור הטמעות וקטוריות באמצעות קריאה פנימית ל-Embedding APIs של Vertex AI. _embed
אפשר להשתמש בערך השרת גם במוטציות וגם בשאילתות.
מוטציות
יצירה ושמירה של הטמעה באמצעות Data Connect
באפליקציה לחיפוש וקטורי, כדאי לבקש שההטמעות ייווצרו ברגע שמוסיפים רשומות למסד הנתונים. בדוגמה הבאה 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
שמוחזר על ידי השאילתה הוא מערך של מספרים עשרוניים, שבדרך כלל לא קריא לבני אדם. לכן, ערך ה-ID הזה לא מוחזר ישירות על ידי ערכות ה-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 Embedding. במקרה הזה, ליצור הטבעות למחרוזת החיפוש שמשמשת להשוואה עם הטבעות של תיאורי סרטים.
בדוגמה הזו, חיפוש הדמיון יחזיר עד 5 סרטים שהתיאור שלהם הכי קרוב מבחינה סמנטית לשאילתת הקלט. קבוצת התוצאות ממוינת בסדר עולה לפי המרחק – מהקרוב ביותר לרחוק ביותר.
query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
movies_descriptionEmbedding_similarity(
compare_embed: {model: "textembedding-gecko@003", 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: "textembedding-gecko@003", 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: "textembedding-gecko@003", 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
שימוש בהטמעות בהתאמה אישית
Data Connect מאפשר גם לעבוד עם הטמעות ישירות כ-Vector
s
במקום להשתמש בערך השרת _embed
כדי ליצור אותן.
שמירת הטמעה בהתאמה אישית
באמצעות Vertex Embeddings API, מציינים מודל התאמה ומבקשים תוצאות של הטמעה בממד הנכון.
לאחר מכן, מבצעים Cast למערך הערכים שמוחזר מסוג float ל-Vector
כדי להעביר אותו לפעולת העדכון לצורך אחסון.
mutation updateDescription($id: String!, $description: String!, $descriptionEmbedding: Vector!) {
movie_update(id: $id, data: {
// title, genre...
description: $description,
descriptionEmbedding: $descriptionEmbedding
})
}
ביצוע חיפוש דמיון באמצעות הטמעות בהתאמה אישית
מבצעים את אותה פעולה כדי לאחזר הטמעות של מונחי חיפוש וממירים אותן ל-Vectors
.
לאחר מכן, קוראים לפונקציה _similarity
query כדי לבצע כל חיפוש.
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
, Firebase CLI מבצע את השלבים הנדרשים כדי להפעיל יצירת הטמעה מבוססת-Vertex AI במכונת CloudSQL.
firebase deploy --only dataconnect
אם רוצים להפעיל תמיכה בהטמעה במופע CloudSQL באופן ידני, או אם נתקלים בשגיאה ב-CLI, צריך לפעול לפי ההוראות האלה.
תחביר של חיפוש וקטורי
תוספי סכימה
סוג הנתונים Data Connect של Vector
ממופה לסוג 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 Embedding APIs. אפשר להשתמש בערך השרת הזה גם בשאילתות וגם במוטציות.
פרמטרים לחיפוש דומים
method: COSINE|INNER_PRODUCT|L2
פונקציית המרחק שמשמשת לחיפוש שכנים קרובים. האלגוריתמים הנתמכים כרגע הם קבוצת משנה של אלגוריתמים לחיפוש pgvector.
within: float
מגבלה על המרחק שבו מתבצע חיפוש השכן הקרוב ביותר.
where: FDC filter condition
אפשר לעיין במדריך בנושא סכימות, שאילתות ומוטציות.
limit: int
מספר התוצאות שיוחזרו.