בדף הזה מוסבר איך ליצור ולאחסן הטבעות וקטוריות על סמך מודל.
מידע נוסף זמין במאמר בנושא יצירת אפליקציות AI גנרטיבי באמצעות Cloud SQL.
בעזרת Cloud SQL אפשר להשתמש במודל הטמעה שמארח Vertex AI כדי לתרגם מחרוזת טקסט להטמעה, שהיא הייצוג של המודל של המשמעות הסמנטית של הטקסט הנתון כווקטור מספרי.
ב-Cloud SQL, הטמעות מיוצגות כמערכים של ערכי real. אתם יכולים להשתמש בהטמעות שנוצרו כקלט לפונקציות של התוסף pgvector.
לפני שמתחילים
חלק מהדרישות שונות בהתאם לשאלה אם רוצים להשתמש ב-Cloud SQL כדי ליצור הטמעות, או שרוצים רק לעבוד עם הטמעות שמאוחסנות במסד הנתונים ממקור אחר.
הגבלות אזוריות
כדי ליצור הטמעות של Vertex AI באמצעות Cloud SQL, המופע צריך להיות באזור שבו מודלים בסיסיים של AI גנרטיבי נתמכים.
מודלים של Vertex AI ש-Cloud SQL יכול להשתמש בהם להטמעות, text-embedding וgemini-embedding, נמצאים באזור הזה.
תוספים נדרשים למסד הנתונים
כדי לעבוד עם הטמעות, צריך להתקין את התוסף google_ml_integration במופע Cloud SQL. למודלים של Vertex AI, צריך להתקין גרסה 1.2 ומעלה. למודלים של צד שלישי או מודלים בהתאמה אישית, צריך להתקין את גרסה
1.4.2 ומעלה.
אם רוצים לאחסן את ההטמעות האלה ולהשתמש בפונקציות ובאופרטורים של וקטורים עם ההטמעות, צריך גם את התוסף pgvector.
שני התוספים האלה זמינים ב-Cloud SQL. אפשר להתקין אותם בכל מסד נתונים במופע. מידע נוסף זמין במאמר הגדרת תוספים ל-PostgreSQL.
הגדרת גישה למודלים
כדי ליצור הטמעות ממופע Cloud SQL, צריך להגדיר את Cloud SQL כך שיפעל עם מודל הטמעת טקסט.
כדי לעבוד עם מודל text-embedding או gemini-embedding מבוסס-ענן,
צריך לשלב את Cloud SQL עם Vertex AI.
הענקת גישה למשתמשי מסד נתונים ליצירת הטמעות
נותנים למשתמשי מסד הנתונים הרשאה להשתמש בפונקציה embedding כדי להריץ תחזיות:
מקשרים לקוח
psqlלמופע הראשי, כמו שמתואר במאמר קישור באמצעות לקוח psql.בשורת הפקודה
psql, מתחברים למסד הנתונים ומעניקים הרשאות:\c DB_NAME GRANT EXECUTE ON FUNCTION embedding TO USER_NAME;מחליפים את מה שכתוב בשדות הבאים:
DB_NAME: שם מסד הנתונים שרוצים להעניק לו הרשאות
USER_NAME: השם של המשתמש שרוצים להעניק לו הרשאות
יצירת הטמעות
ב-Cloud SQL יש פונקציה שמאפשרת לתרגם טקסט להטמעה וקטורית. אחר כך תוכלו לאחסן את ההטמעה הזו במסד הנתונים שלכם כנתוני וקטור, ואם תרצו, תוכלו להשתמש בפונקציות pgvector כדי להריץ עליהם שאילתות.
יצירת הטמעה
כדי ליצור הטמעה באמצעות Cloud SQL, משתמשים בפונקציה embedding
שמסופקת על ידי התוסף google_ml_integration:
SELECT embedding( 'MODEL_ID_WITH_VERSION', 'TEXT');
מחליפים את הפרטים הבאים:
MODEL_ID_WITH_VERSION: המזהה המוגדר במלואו של המודל שאליו רוצים לשלוח שאילתה.
אם אתם משתמשים ב-Vertex AI Model Garden, צריך לציין
text-embedding-004אוtext-multilingual-embedding-002. אלה המודלים מבוססי-הענן ש-Cloud SQL יכול להשתמש בהם להטמעות טקסט. מידע נוסף זמין במאמר בנושא הטמעות של טקסט.TEXT: הטקסט שרוצים לתרגם להטמעה וקטורית.
בדוגמה הבאה נעשה שימוש במודל text-embedding-004 כדי ליצור הטמעה על סמך מחרוזת מילולית שסופקה:
SELECT embedding( 'text-embedding-004', 'Cloud SQL is a managed, cloud-hosted SQL database service.');
שמירת הטמעה שנוצרה
הערך המוחזר של הפונקציה embedding() הוא מערך של ערכי real.
כדי לאחסן את הערך הזה בטבלה, מוסיפים עמודה real[]:
ALTER TABLE TABLE ADD COLUMN EMBEDDING_COLUMN real[DIMENSIONS];
מחליפים את הפרטים הבאים:
TABLE: שם הטבלה
EMBEDDING_COLUMN: השם של עמודת ההטמעה החדשה
DIMENSIONS: מספר המימדים שהמודל תומך בהם.
אם אתם משתמשים באחד ממודלי
text-embeddingעם Vertex AI, צריך לציין768.
אופציונלי: אם התקנתם את התוסף pgvector, תוכלו לאחסן הטבעות כערכים של vector:
ALTER TABLE TABLE ADD COLUMN EMBEDDING_COLUMN vector(DIMENSIONS);
אחרי שיוצרים עמודה לאחסון הטמעות, אפשר לאכלס אותה על סמך הערכים שכבר מאוחסנים בעמודה אחרת באותה טבלה:
UPDATE TABLE SET EMBEDDING_COLUMN = embedding('MODEL_ID_WITH_VERSION', SOURCE_TEXT_COLUMN);
מחליפים את הפרטים הבאים:
TABLE: שם הטבלה.
EMBEDDING_COLUMN: השם של עמודת ההטמעה.
MODEL_ID_WITH_VERSION: המזהה המוגדר במלואו של המודל שאליו רוצים לשלוח שאילתה.
אם אתם משתמשים ב-Vertex AI Model Garden, צריך לציין
text-embedding-004אוtext-multilingual-embedding-002. אלה המודלים מבוססי-הענן ש-Cloud SQL יכול להשתמש בהם להטמעות טקסט. מידע נוסף זמין במאמר בנושא הטמעות של טקסט.SOURCE_TEXT_COLUMN: שם העמודה שבה מאוחסן הטקסט. אתם מתרגמים את הטקסט הזה להטמעות.
הפקודה הקודמת פועלת גם בעמודות הטמעה של real[] וגם בעמודות הטמעה של vector. אם עמודת ההטמעה היא מסוג vector, Cloud SQL מבצע המרה (cast) של ערך ההחזרה של embedding() ממערך real לערך vector באופן מרומז.
בדוגמה הבאה נעשה שימוש במודל text-embedding-004 כדי לאכלס את העמודה messages.message_vector ב-embeddings על סמך התוכן של העמודה messages.message:
UPDATE messages SET message_vector = embedding( 'text-embedding-004', message);
שאילתה והטמעות של אינדקס באמצעות pgvector
התוסף pgvector PostgreSQL מאפשר לכם להשתמש באופרטורים ובפונקציות ספציפיים לווקטורים כשאתם מאחסנים, יוצרים אינדקס ומריצים שאילתות על הטמעות של טקסט במסד הנתונים.
ל-Cloud SQL יש אופטימיזציות משלו לעבודה עם pgvector, שמאפשרות ליצור אינדקסים שיכולים להאיץ שאילתות שכוללות הטמעות.
יצירת אינדקס של השכן הקרוב ביותר
pgvector תומך בחיפושים של השכן הקרוב המשוער (ANN) באמצעות אינדוקס.
כדי ליצור אינדקס HNSW, משתמשים בפונקציה hnsw, כמו בדוגמה הבאה:
CREATE INDEX ON TABLE
USING hnsw (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (m = M, ef_construction = EF_CONSTRUCTION);
מחליפים את הפרטים הבאים:
TABLE: הטבלה שאליה מוסיפים את האינדקס.
EMBEDDING_COLUMN: עמודה שמאחסנת נתוני
vector.DISTANCE_FUNCTION: פונקציית המרחק שבה יש להשתמש עם האינדקס הזה. צריך לבחור אחת מהאפשרויות:
מרחק L2:
vector_l2_opsמכפלה פנימית:
vector_ip_opsמרחק קוסינוס:
vector_cosine_ops
M (אופציונלי): המספר המקסימלי של חיבורים עם נקודות נתונים סמוכות בתרשים. מומלץ להגדיר טווח של 5 עד 48. ערך ברירת המחדל הוא 16.
EF_CONSTRUCTION (אופציונלי): גודל הרשימה שמכילה את המועמדים הכי קרובים במהלך מעבר הגרף כשיוצרים את האינדקס. ערכים גבוהים יותר גורמים לאלגוריתם לשקול יותר מועמדים, וכך מאפשרים ליצור אינדקס טוב יותר. גודל ברירת המחדל הוא 64.
כדי ליצור את האינדקס הזה בעמודת הטמעה שמשתמשת בסוג הנתונים real[] במקום vector, צריך להמיר את העמודה לסוג הנתונים vector:
CREATE INDEX ON TABLE
USING hnsw ((CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS))) DISTANCE_FUNCTION)
WITH (m = M, ef_construction = EF_CONSTRUCTION);
מחליפים את DIMENSIONS ברוחב הממדי של עמודת ההטמעה.
בקטע הבא מוצגת דוגמה לאינדקס כזה.
יצירת שאילתת השכן הקרוב ביותר עם טקסט נתון
אחרי שמאחסנים ומבצעים אינדוקס של הטמעות במסד הנתונים, אפשר להשתמש בכל pgvectorהפונקציות של שאילתות.
כדי למצוא את השכנים הסמנטיים הקרובים ביותר לחלק טקסט, משתמשים בפונקציה embedding() כדי לתרגם את הטקסט לווקטור. באותה שאילתה, מחילים את הווקטור הזה על אופרטור השכן הקרוב ביותר pgvector, <->, כדי למצוא את שורות מסד הנתונים עם ההטמעות הכי דומות מבחינה סמנטית.
מכיוון שהפונקציה embedding() מחזירה מערך real, צריך להמיר את הקריאה embedding() ל-vector כדי להשתמש בערכים האלה עם אופרטורים של pgvector.
SELECT RESULT_COLUMNS FROM TABLE
ORDER BY EMBEDDING_COLUMN
<-> embedding('MODEL_ID_WITH_VERSION', 'TEXT')::vector
LIMIT ROW_COUNT
מחליפים את הפרטים הבאים:
RESULT_COLUMNS: העמודות שיוצגו משורות דומות מבחינה סמנטית.
TABLE: הטבלה שמכילה את ההטמעה שאליה משווים את הטקסט.
EMBEDDING_COLUMN: העמודה שמכילה את ההטמעות המאוחסנות.
MODEL_ID_WITH_VERSION: המזהה המוגדר במלואו של המודל שאליו רוצים לשלוח שאילתה.
אם אתם משתמשים ב-Vertex AI Model Garden, צריך לציין
text-embedding-004אוtext-embedding-multilingual-002. אלה המודלים מבוססי-הענן ש-Cloud SQL יכול להשתמש בהם להטמעות טקסט. מידע נוסף זמין במאמר בנושא הטמעות של טקסט.TEXT: הטקסט שרוצים כדי למצוא את השכנים הסמנטיים הקרובים ביותר שמאוחסנים.
ROW_COUNT: מספר השורות שיש להחזיר. אם רוצים רק את ההתאמה היחידה הכי טובה, צריך לציין
1כערך של הפרמטר הזה.
כדי להריץ את השאילתה הזו עם עמודת הטמעה מאוחסנת שמשתמשת בסוג הנתונים real[] במקום vector, צריך להמיר את העמודה לסוג הנתונים vector:
SELECT RESULT_COLUMNS FROM TABLE
ORDER BY EMBEDDING_COLUMN::vector
<-> embedding('MODEL_ID_WITH_VERSION', 'TEXT')::vector
LIMIT ROW_COUNT
הגדרה מלאה של מזהה המודל כדי למנוע שגיאות
מומלץ מאוד להשתמש תמיד בגרסה יציבה של מודל ההטמעות שבחרתם ב-Cloud SQL. ברוב המודלים, המשמעות היא שצריך להגדיר גרסה באופן מפורש. לדוגמה, צריך להשתמש ב-gemini-embedding-001 במקום ב-gemini-embedding.
הפונקציה embedding() נקראת בלי לציין את גרסת המודל. זה תקין מבחינת התחביר, אבל לא יציב ועלול לגרום לשגיאות.
מידע נוסף על גרסאות המודלים הזמינות ב-Vertex AI זמין במאמר המודלים היציבים הכי חדשים.
גרסה נתונה של מודל Vertex AI תמיד מחזירה את אותה התשובה embedding() לקלט טקסט נתון. אם לא מציינים את גרסת המודל בקריאות להטמעה, יכול להיות שגרסה חדשה של המודל שפורסמה תשנה באופן פתאומי את הווקטור שמוחזר עבור קלט נתון. הדבר עלול לגרום לשגיאות או להתנהגות לא צפויה אחרת באפליקציות.