אופטימיזציה של עלויות השימוש בפונקציית AI באמצעות זיקוק מודלים
במאמר הזה מוסבר איך להשתמש במצב האופטימלי של פונקציות AI מנוהלות ב-BigQuery. אתם יכולים להשתמש במצב אופטימלי כדי לעבד מערכי נתונים גדולים שמכילים אלפים, או אפילו מיליארדים, של שורות עם צריכת טוקנים של מודל שפה גדול (LLM) וזמן אחזור של שאילתות שקטנים משמעותית בהשוואה להסקת מסקנות רגילה של LLM לכל שורה. האופטימיזציה הזו חלה רק על הפונקציות AI.IF ו-AI.CLASSIFY.
כדי להבין טוב יותר את צריכת הטוקנים, אפשר לראות את מספר הטוקנים שמשמשים לשאילתה בGoogle Cloud מסוףGoogle Cloud . כדי להעריך את השימוש הזה לפני שמריצים שאילתה, משתמשים בפונקציה AI.COUNT_TOKENS.
בדוגמה הבאה מוצג שימוש בפונקציה AI.IF במצב אופטימלי כדי לזהות מאמרי חדשות על אסונות טבע, באמצעות text-embedding-005 כמודל ההטמעה:
SELECT
title,
body,
AI.IF(
('The following news story is about a natural disaster: ', body),
embeddings => AI.EMBED(body, endpoint => 'text-embedding-005', task_type => 'CLASSIFICATION').result,
-- Optional, 'MINIMIZE_COST' is the default when embeddings are provided.
optimization_mode => 'MINIMIZE_COST'
) AS is_natural_disaster
FROM
`bigquery-public-data.bbc_news.fulltext`;
הארגומנט optimization_mode => 'MINIMIZE_COST' מפעיל את המצב האופטימלי. זו הגדרת ברירת המחדל כשמספקים הטמעות, ולכן אפשר להשמיט את הארגומנט הזה.
בדוגמה הזו, ההטמעות נוצרות תוך כדי תנועה. בפועל, מומלץ לממש הטמעות כדי שאפשר יהיה לעשות בהן שימוש חוזר.
איך פועל מצב אופטימלי
הפונקציות המנוהלות של AI, AI.IF ו-AI.CLASSIFY, בדרך כלל קוראות למודל שפה גדול (LLM) מרוחק עבור כל שורה במערך הנתונים. כשמשתמשים במצב אופטימלי, מערכת BigQuery מאמנת באופן אוטומטי מודל קל משקל ומזוקק במהלך ביצוע השאילתה.
כך מתבצע התהליך:

- דגימה ותיוג: BigQuery בוחר דגימה מייצגת קטנה של הנתונים שלכם ומפעיל את Gemini כדי לספק תוויות.
- אימון מודל מזוקק: מודל מזוקק מקומי מאומן בדיוק בזמן באמצעות התוויות והטמעות הנתונים של ה-LLM כמאפיינים.
- בדיקת איכות: מערכת BigQuery מעריכה את רמת הדיוק של המודל המזוקק בהשוואה לתוצאות של ה-LLM. כברירת מחדל, אם המודל המזוקק לא עומד בסף האיכות הנדרש, השאילתה נכשלת ומוצגת שגיאה שמסבירה למה המודל נפסל. אם איכות המודל מקובלת, יכול להיות ש-BigQuery עדיין יחזור ל-LLM המרוחק בשורות ספציפיות כדי לשמור על איכות עקבית, או בשורות שחסרים בהן הטבעות תקפות.
- הסקת מסקנות: המודל המזוקק מעבד את רוב השורות, ומצמצם באופן משמעותי את מספר הקריאות ל-Gemini.
מגבלות
המגבלות הבאות חלות על מצב אופטימלי:
- מספר השורות המינימלי: כדי להבטיח שיש מספיק נתונים לאימון המודל, הקלט לפונקציית ה-AI צריך להכיל כ-3,000 שורות.
- סוגי נתונים: בהנחיות שמפנות לכמה עמודות, האופטימיזציה תומכת רק בעמודות מסוג מחרוזת.
- סיווג עם כמה תוויות:
AI.CLASSIFYעםoutput_mode => 'multi'לא נתמך במצב אופטימלי. - תמיכה בפונקציות: רק הפונקציות
AI.IFו-AI.CLASSIFYתומכות במצב אופטימלי. עם זאת, כשמשתמשים במצב אופטימלי עםAI.CLASSIFY, יכול להיות שהשאילתות ייכשלו אם איכות המודל המזוקק לא מספיקה. - יחס השגיאות: הארגומנט
max_error_ratioלא נתמך במצב אופטימלי.
לפני שמתחילים
כדי לקבל את ההרשאות שנדרשות להרצת פונקציות AI מנוהלות ב-BigQuery, אפשר לעיין במאמר בנושא הגדרת הרשאות לפונקציות של AI גנרטיבי שקוראות למודלים גדולים של שפה (LLM) בפלטפורמת הסוכנים של Gemini Enterprise.
בחירת מודל הטמעה
כדי להשתמש במצב אופטימלי, צריך לחשב הטבעות של הנתונים ולספק אותן לפונקציית ה-AI. כדי שלעמודות הקלט יהיו הטמעות משויכות, בכל השורות צריכים להיות ממדים עקביים של הטמעות, והן צריכות להיווצר על ידי אותו מודל הטמעה.
כדי לקבל את האיזון הטוב ביותר בין עלות, איכות ויכולת התאמה, מומלץ לחשב את ההטמעות של הנתונים באמצעות מודל הטמעה, כמו text-embedding-005 או הטמעות Gemini למשימות באנגלית או בכמה שפות. לנתונים מולטי-מודאליים (טקסט ותמונות), משתמשים במודל הטמעה מולטי-מודאלי כמו multimodalembedding@001.
יצירת הטמעות
אפשר לחשב הטמעות של הנתונים באמצעות יצירה אוטונומית שמנוהלת על ידי BigQuery, או ליצור את עמודות ההטמעה באופן ידני.
בקטעים הבאים מוסבר איך להשתמש בשתי הגישות עם הפונקציות AI.CLASSIFY ו-AI.IF.
יצירה אוטונומית של הטמעה
אם אתם משתמשים ביצירה אוטונומית של הטמעות, מערכת BigQuery משתמשת בהטמעות באופן אוטומטי כשמתבצעת קריאה ל-AI.IF או ל-AI.CLASSIFY. זו הגישה המומלצת, אבל היא מוגבלת לעמודה אחת של הטמעה לכל טבלה.
בדוגמה הבאה נוצרת טבלה עם עמודה של הטמעה שנוצרה באופן אוטונומי, באמצעות text-embedding-005 כמודל ההטמעה, ולאחר מכן נעשה שימוש בפונקציה AI.CLASSIFY כדי לסווג את הנתונים:
-- Create a table with an autonomously generated embedding column
CREATE TABLE my_dataset.bbc_news (
title STRING,
body STRING,
body_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
GENERATED ALWAYS AS (
AI.EMBED(
body,
connection_id => '<my_connection_id>',
task_type => 'CLASSIFICATION',
endpoint => 'text-embedding-005')
) STORED
OPTIONS(asynchronous = TRUE)
);
-- Insert data into the table
INSERT INTO my_dataset.bbc_news (title, body)
SELECT title, body FROM `bigquery-public-data.bbc_news.fulltext`;
-- Run the optimized query.
-- Wait for the background job to finish generating embeddings before running.
SELECT
title,
body,
AI.CLASSIFY(
body,
categories => ['tech', 'sport', 'business', 'other']
) AS category
FROM
my_dataset.bbc_news;
הגדרה ידנית של עמודות
אם יש לכם עמודה קיימת של הטמעה, מציינים אותה בארגומנט embeddings של AI.IF או AI.CLASSIFY. אפשר ליצור את זה באמצעות הפונקציה AI.EMBED.
בדוגמה הבאה מוצג איך ליצור טבלה עם עמודה של הטמעה באמצעות text-embedding-005 כמודל ההטמעה, ואז להשתמש בעמודה הזו בשאילתת AI.CLASSIFY:
-- Create a table with an embedding column
CREATE TABLE my_dataset.bbc_news AS
SELECT
title,
body,
AI.EMBED(
body,
endpoint => 'text-embedding-005',
task_type => 'CLASSIFICATION'
).result AS body_embedding
FROM
`bigquery-public-data.bbc_news.fulltext`;
-- Run the optimized query
SELECT
title,
body,
AI.CLASSIFY(
body,
categories => ['tech', 'sport', 'business', 'other'],
embeddings => body_embedding,
) AS category
FROM
my_dataset.bbc_news;
אם ההנחיה מתייחסת לכמה עמודות, צריך לספק רשימה של שמות העמודות וההטמעות התואמות שלהן בארגומנט embeddings. לדוגמה:
embeddings => [('body', body_embedding), ('title', title_embedding)].
מעקב אחר אופטימיזציה של שאילתות
כדי לבדוק כמה שורות עברו אופטימיזציה במהלך ההרצה של השאילתה, אפשר לעיין בנתוני ההרצה ב Google Cloud מסוף או דרך ה-API:
המסוף
כדי לראות כמה שורות עברו אופטימיזציה ולצפות בהודעות מערכת לגבי סטטוס האופטימיזציה:
במסוף Google Cloud , עוברים לדף BigQuery.
בתפריט הניווט, לוחצים על Jobs explorer (סייר המשרות).
לוחצים על מזהה המשימה כדי להציג את החלונית פרטי המשימה.
לוחצים על הכרטיסייה פרטי המשימה ומציגים את המדדים והסטטוס בשדה אופטימיזציות של פונקציות AI גנרטיבי.

API
בודקים את FunctionGenAiCostOptimizationStats באובייקט GenAIFunctionStats של מטא-נתוני המשימה. האובייקט הזה כולל את מספר השורות שהוסקו באמצעות תהליך העבודה שעבר אופטימיזציה, והודעות שנוצרו על ידי המערכת ומספקות תובנות לגבי מצב האופטימיזציה.
פתרון בעיות
בקטעים הבאים מוסבר איך לאבחן ולפתור בעיות נפוצות בשימוש במצב אופטימלי.
גודל הנתונים קטן מדי
בעיה: אין מספיק נתונים לאימון המודל. יכול להיות שתופיע הודעת השגיאה הבאה: Fail to apply cost optimization because the data size is too
small.
פתרון: מגדילים את גודל הקלט לכ-3,000 שורות ומוודאים שנוצרו הטמעות תקינות לכל השורות.
יש מעט דוגמאות בכמה כיתות או שאין דוגמאות בכלל
בעיה: מספר הדגימות לא מספיק לקטגוריות מסוימות במהלך שלב הדגימה, ולכן אי אפשר לאמן את המודל. יכול להיות שתופיע הודעת השגיאה הבאה: Fail to apply cost optimization because some classes have
few or no samples.
הפתרון:
- מסירים קטגוריות ריקות או נדירות מקריאת הפונקציה
AI.CLASSIFY. - כדאי לקבץ קטגוריות נדירות לקטגוריה רחבה יותר כדי להגדיל את גודל המדגם. אפשר להשתמש בקטגוריה
OTHERכדי לקבץ פריטים שלא נכללים בקטגוריות ספציפיות יותר. עם זאת, אם רשימת הקטגוריות שלכם כבר מלאה, אל תוסיפו אתOTHERכי המונח הזה לא חד-משמעי ועלול לגרום לבלבול.
ההטמעות לא עקביות
הבעיה: חוסר עקביות בין ממדי ההטמעה בשורות שונות. יכול להיות שתופיע הודעת השגיאה הבאה: Fail to apply cost optimization
because the embeddings have inconsistent dimensions.
פתרון: מוודאים שההטמעות נוצרו על ידי אותו מודל ושוקטור ההטמעה זהה באורכו. אפשר להשתמש בשאילתת SQL דומה לזו שבהמשך כדי לבדוק שההטמעות בעמודה הן באורך זהה:
SELECT ARRAY_LENGTH(body_embedding.result), COUNT(*)
FROM `PROJECT_ID.DATASET.TABLE_NAME`
GROUP BY 1;
מורכבות ההנחיה גבוהה מדי
הבעיה: המודל המזוקק לא יכול להגיע לסף דיוק גבוה. יכול להיות שתופיע הודעת השגיאה הבאה: Fail to apply cost optimization
because the prompt complexity is too high.
הפתרון:
משתמשים בקבוצת קטגוריות שיוצרות חלוקה. חשוב לוודא שיש חפיפה מינימלית בין הקטגוריות ושהן מכסות את כל הקלטים האפשריים.
- כדאי להימנע מקטגוריות חופפות שבהן קלט יכול להשתייך לכמה קטגוריות בו-זמנית. לדוגמה, הימנעו מקטגוריות כמו
['terrible', 'bad', 'okay', 'good', 'excellent']. - חשוב להימנע ממצבים שבהם לא חלות קטגוריות. לדוגמה, הרשימה של הקטגוריות
['bad', 'average']לא כוללת ביקורת שמביעה שבח. כדי להנחות את ה-LLM לפתור אי בהירות בין קטגוריות, צריך לספק תיאורים של הקטגוריות. לדוגמה:
AI.CLASSIFY( review, categories => [ ('terrible', 'Review where customer was not happy and the message indicates they will never try this product again'), ('bad', 'Review where customer was not happy but suggested improvements to the product'), ('okay', 'Review where customer was neutral about the product. Short reviews qualify for this category'), ('good', 'Review where customers were happy using this product but had minor critiques'), ('excellent', 'Review where customers were very happy using this product and will recommend others to try it too')], embeddings => review_embeddings)
- כדאי להימנע מקטגוריות חופפות שבהן קלט יכול להשתייך לכמה קטגוריות בו-זמנית. לדוגמה, הימנעו מקטגוריות כמו
אפשר לנסות מודלים מתקדמים יותר להטמעה, כמו
text-embedding-005אוmultimodalembedding.לקבלת עזרה נוספת בניפוי באגים, אפשר לפנות לכתובת bqml-feedback@google.com.
מספר לא צפוי של שורות שעובדו על ידי ה-LLM
בעיה: נתוני הביצוע של השאילתה מראים שמספר גבוה באופן לא צפוי של שורות עובד על ידי מודל LLM מרוחק במקום על ידי המודל המזוקק. יכולות להיות לכך כמה סיבות:
- המודל המזוקק אומן בהצלחה, אבל בחלק מהשורות חסרים וקטורי הטמעה. השורות האלה מעובדות על ידי מודל שפה גדול (LLM) מרוחק.
- לא הייתה אפשרות להחיל את המודל המזוקק על כל שורה, והיה צורך לחזור למודל השפה הגדול המרוחק כדי לשמור על איכות עקבית.
פתרון: מוודאים שההטמעות נוצרות בצורה תקינה ותקפות לכל השורות בנתונים. אם הבעיה נמשכת, אפשר לפנות אל bqml-feedback@google.com כדי לקבל עזרה בניפוי באגים.
לא זוהתה עמודה של הטמעה אוטונומית
בעיה: מערכת BigQuery לא מצליחה לזהות עמודה של הטמעה אוטונומית. המצב הזה יכול לקרות אם הסקריפט משתמש בטבלה זמנית, וההפניה לטבלה המקורית אבדה.
פתרון: משתמשים בפרמטר embeddings כדי להעביר באופן מפורש עמודת הטמעה אוטונומית – למשל embeddings => content_embedding.result – שמפעילה אופטימיזציה של העלויות.
המאמרים הבאים
- מידע נוסף על AI גנרטיבי ב-BigQuery
- אפשר לעיין במסמכי העזרה של הפונקציה
AI.IF. - אפשר לעיין במסמכי העזרה של הפונקציה
AI.CLASSIFY.