בדף הזה מוסבר איך משתמשים ב-API של הטמעת טקסט ב-Gemini Enterprise Agent Platform כדי ליצור, לאחסן ולעדכן הטמעות טקסט של נתונים שמאוחסנים במסדי נתונים של Spanner בניב GoogleSQL ובניב PostgreSQL.
הטמעת טקסט היא ייצוג וקטורי של נתוני טקסט, והיא משמשת בדרכים רבות למציאת פריטים דומים. אתם משתמשים בהם בכל פעם שאתם מבצעים חיפוש ב-Google או רואים המלצות כשאתם קונים באינטרנט. כשיוצרים הטמעות טקסט, מקבלים ייצוגים וקטוריים של טקסט בשפה טבעית כמערכים של מספרים בנקודה צפה (floating point). כלומר, כל הטקסט שהזנתם מקבל ייצוג מספרי. באמצעות השוואה בין המרחק המספרי בין הייצוגים הווקטוריים של שני קטעי טקסט, אפליקציה יכולה לקבוע את הדמיון בין הטקסט או האובייקטים שמיוצגים על ידי הטקסט.
באמצעות ה-API להטמעת טקסט של Agent Platform, אתם יכולים ליצור הטמעת טקסט באמצעות AI גנרטיבי. במדריך הזה תשתמשו במודל הטמעת הטקסט של Agent Platform כדי ליצור הטמעות טקסט לנתונים שמאוחסנים ב-Spanner.
מידע נוסף על הטמעות טקסט ומודלים נתמכים זמין במאמר יצירת הטמעות טקסט.
מטרה
במדריך הזה תלמדו איך:
- רושמים מודל הטמעת טקסט של Agent Platform בסכימה של Spanner באמצעות הצהרות DDL.
- מפנים למודל הרשום באמצעות שאילתות SQL כדי ליצור הטמעות מנתונים שמאוחסנים ב-Spanner.
תמחור
במדריך הזה משתמשים ברכיבים של Google Cloud, והשימוש בהם כרוך בתשלום, כולל:
- Spanner
- Agent Platform
למידע נוסף על העלויות של Spanner, קראו את דף התמחור של Spanner.
למידע נוסף על העלויות של Agent Platform, קראו את דף התמחור של Agent Platform.
יצירה ואחסון של הטמעות טקסט
בהתאם למודל שבו אתם משתמשים, יכול להיות שייקח קצת זמן ליצור הטמעות. בעומסי עבודה שרגישים יותר לביצועים, השיטה המומלצת היא להימנע מיצירת הטמעות בעסקאות קריאה וכתיבה. במקום זאת, צריך ליצור את ההטמעות בטרנזקציה לקריאה בלבד באמצעות דוגמאות ה-SQL הבאות.
GoogleSQL
רישום מודל של הטמעות טקסט ב-Spanner
ב-GoogleSQL, צריך לרשום מודל לפני שמשתמשים בו עם הפונקציה ML.PREDICT. כדי לרשום את מודל הטמעת הטקסט של Agent Platform במסד נתונים של Spanner, מריצים את הצהרת ה-DDL הבאה:
CREATE MODEL MODEL_NAME
INPUT(
content STRING(MAX),
-- Optional: For models that support specifying task type.
task_type STRING(MAX),
)
OUTPUT(
embeddings
STRUCT<
statistics STRUCT<truncated BOOL, token_count FLOAT64>,
values ARRAY<FLOAT64>>
)
REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/PROJECT/locations/LOCATION/publishers/google/models/$MODEL_NAME'
);
מחליפים את מה שכתוב בשדות הבאים:
-
MODEL_NAME: השם של מודל הטמעת הטקסט ב-Agent Platform -
PROJECT: הפרויקט שמארח את נקודת הקצה של Agent Platform -
LOCATION: המיקום של נקודת הקצה של Agent Platform
Spanner מעניק הרשאות מתאימות באופן אוטומטי. אם לא, צריך לבדוק את בקרת הגישה לנקודת הקצה של המודל.
אי אפשר לגלות ולאמת סכימות במודלים של AI גנרטיבי. צריך לספק סעיפי INPUT ו-OUTPUT שתואמים לסכימת המודלים. הסכימה המלאה של מודל הטמעת הטקסט מופיעה במאמר קבלת הטמעות טקסט.
יצירת הטמעות טקסט
כדי ליצור הטמעות, מעבירים קטע טקסט ישירות לפונקציה ML.PREDICT באמצעות ה-SQL הבא:
SELECT embeddings.values
FROM ML.PREDICT(
MODEL MODEL_NAME,
(SELECT "A product description" as content)
);
כדי ליצור הטמעות לנתונים שמאוחסנים בטבלה, משתמשים ב-SQL הבא:
SELECT id, embeddings.values
FROM ML.PREDICT(
MODEL MODEL_NAME,
(SELECT id, description as content FROM Products)
);
כדי לציין את סוג המשימה ואת מידות הפלט:
UPDATE Products p
SET description_embedding = (
SELECT embeddings.values
FROM ML.PREDICT(
MODEL MODEL_NAME,
(SELECT p.description as content, "RETRIEVAL_DOCUMENT" as task_type),
STRUCT(768 AS outputDimensionality)
));
SELECT p.product_id, p.name, p.description, COSINE_DISTANCE(
p.description_embedding,
(
SELECT embeddings.values
FROM ML.PREDICT(
MODEL MODEL_NAME,
(SELECT @user_query as content, "RETRIEVAL_QUERY" as task_type),
STRUCT(768 AS outputDimensionality)
)
)
) AS distance
FROM Products p
ORDER BY distance
LIMIT 5;
אחסון הטמעות טקסט
אחרי שיוצרים את ההטמעות בעסקה לקריאה בלבד, מאחסנים אותן ב-Spanner כדי שאפשר יהיה לנהל אותן באמצעות הנתונים התפעוליים. כדי לאחסן את ההטמעות, משתמשים בטרנזקציית קריאה-כתיבה.
בעומסי עבודה שפחות רגישים לביצועים, אפשר ליצור ולהוסיף הטמעות באמצעות ה-SQL הבא בעסקת קריאה-כתיבה.
הציון של vector_length הוא אופציונלי לאחסון הטמעות, מומלץ לחיפוש KNN ונדרש לאינדקסים של וקטורים. מחליפים את VECTOR_LENGTH במאפיין הפלט של המודל, למשל 3072 או 768, או משמיטים את vector_length אם העמודה מאחסנת וקטורים של מאפיינים משתנים:
CREATE TABLE Products(
id INT64 NOT NULL,
description STRING(MAX),
embeddings ARRAY<FLOAT32>(vector_length=>VECTOR_LENGTH),
) PRIMARY KEY(id);
INSERT INTO Products (id, description, embeddings)
SELECT @Id, @Description, embeddings.values
FROM ML.PREDICT(
MODEL MODEL_NAME,
(SELECT @Description as content)
);
PostgreSQL
יצירת הטמעות טקסט
כדי ליצור הטמעות, מעבירים קטע טקסט ישירות לפונקציה spanner.ML_PREDICT_ROW באמצעות ה-SQL הבא:
SELECT
spanner.ML_PREDICT_ROW(
'projects/PROJECT/locations/LOCATION/publishers/google/models/$MODEL_NAME',
'{"instances": [{"content": "A product description"}]}'::jsonb
) ->'predictions'->0->'embeddings'->'values';
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT: הפרויקט שמארח את נקודת הקצה של Agent Platform -
LOCATION: המיקום של נקודת הקצה של Agent Platform -
MODEL_NAME: השם של מודל הטמעת הטקסט ב-Agent Platform
כדי ליצור הטמעות לנתונים שמאוחסנים בטבלה, משתמשים ב-SQL הבא:
SELECT id, spanner.ML_PREDICT_ROW(
'projects/PROJECT/locations/LOCATION/publishers/google/models/$MODEL_NAME',
JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', description))))
) -> 'predictions'->0->'embeddings'->'values'
FROM Products;
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT: הפרויקט שמארח את נקודת הקצה של Agent Platform -
LOCATION: המיקום של נקודת הקצה של Agent Platform -
MODEL_NAME: השם של מודל הטמעת הטקסט ב-Agent Platform
כדי לציין את סוג המשימה ואת מידות הפלט:
UPDATE Products p
SET description_embedding = spanner.float64_array(
spanner.ML_PREDICT_ROW(
'projects/PROJECT/locations/LOCATION/publishers/google/models/$MODEL_NAME',
JSONB_BUILD_OBJECT(
'instances', JSONB_BUILD_ARRAY(
JSONB_BUILD_OBJECT(
'content', p.description,
'task_type', 'RETRIEVAL_DOCUMENT'
)
),
'parameters', JSONB_BUILD_OBJECT('outputDimensionality', 768)
)
)->'predictions'->0->'embeddings'->'values'
);
SELECT p.product_id, p.name, p.description, spanner.COSINE_DISTANCE(
p.description_embedding,
spanner.float64_array(
spanner.ML_PREDICT_ROW(
'projects/PROJECT/locations/LOCATION/publishers/google/models/$MODEL_NAME',
JSONB_BUILD_OBJECT(
'instances', JSONB_BUILD_ARRAY(
JSONB_BUILD_OBJECT(
'content', $1,
'task_type', 'RETRIEVAL_QUERY'
)
),
'parameters', JSONB_BUILD_OBJECT('outputDimensionality', 768)
)
)->'predictions'->0->'embeddings'->'values'
)
) AS distance
FROM Products p
ORDER BY distance
LIMIT 5;
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT: הפרויקט שמארח את נקודת הקצה של Agent Platform -
LOCATION: המיקום של נקודת הקצה של Agent Platform -
MODEL_NAME: השם של מודל הטמעת הטקסט ב-Agent Platform
אחסון הטמעות טקסט
אחרי שיוצרים את ההטמעות בעסקה לקריאה בלבד, מאחסנים אותן ב-Spanner כדי שאפשר יהיה לנהל אותן באמצעות הנתונים התפעוליים. כדי לאחסן את ההטמעות, משתמשים בטרנזקציית קריאה-כתיבה.
בעומסי עבודה שפחות רגישים לביצועים, אפשר ליצור ולהוסיף הטמעות באמצעות ה-SQL הבא בעסקת קריאה-כתיבה.
הציון של VECTOR LENGTH הוא אופציונלי לאחסון הטמעות, מומלץ לחיפוש KNN ונדרש לאינדקסים של וקטורים. מחליפים את VECTOR_LENGTH במאפיין הפלט של המודל, למשל 3072 או 768, או משמיטים את VECTOR LENGTH אם העמודה מאחסנת וקטורים של מאפיינים משתנים:
CREATE TABLE Products (
id INT8 NOT NULL,
description TEXT,
embeddings REAL[] VECTOR LENGTH VECTOR_LENGTH,
PRIMARY KEY(id)
);
INSERT INTO Products (id, description, embeddings)
SELECT @Id, @Description, spanner.FLOAT32_ARRAY(spanner.ML_PREDICT_ROW(
'projects/PROJECT/locations/LOCATION/publishers/google/models/$MODEL_NAME',
JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', @Description)))
) -> 'predictions'->0->'embeddings'->'values'
));
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT: הפרויקט שמארח את נקודת הקצה של Agent Platform -
LOCATION: המיקום של נקודת הקצה של Agent Platform -
MODEL_NAME: השם של מודל הטמעת הטקסט ב-Agent Platform
עדכון הטמעות הטקסט
כדי לעדכן את ההטמעות או להטמיע נתונים בזמן אמת, משתמשים בהצהרה UPDATE (GoogleSQL ו-PostgreSQL).
כדי לעדכן את הטבלה Products בדוגמה הקודמת, משתמשים ב-SQL הבא:
GoogleSQL
UPDATE Products
SET
description = @description,
embeddings = (SELECT embeddings.values
FROM ML.PREDICT(MODEL MODEL_NAME, (SELECT @description as content))
)
WHERE id = @id;
מחליפים את מה שכתוב בשדות הבאים:
-
MODEL_NAME: השם של מודל הטמעת הטקסט ב-Agent Platform
PostgreSQL
UPDATE
Products
SET
description = $1,
embeddings = spanner.FLOAT32_ARRAY(
spanner.ML_PREDICT_ROW(
'projects/PROJECT/locations/LOCATION/publishers/google/models/$MODEL_NAME',
JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', $1)))
) -> 'predictions'->0->'embeddings'->'values')
WHERE
id = $2;
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT: הפרויקט שמארח את נקודת הקצה של Agent Platform -
LOCATION: המיקום של נקודת הקצה של Agent Platform -
MODEL_NAME: השם של מודל הטמעת הטקסט ב-Agent Platform
המאמרים הבאים
- איך משתמשים בחיפוש וקטורי ב-Agent Platform כדי לחפש פריטים דומים מבחינה סמנטית.
- בקורס המזורז שלנו בנושא הטמעות תוכלו לקרוא מידע נוסף על למידת מכונה והטמעות.
- מידע נוסף על מודלים להטמעת טקסט ב-Agent Platform