במדריך הזה נסביר איך לבצע חיפוש דמיון בהטמעות שמאוחסנות בטבלאות ב-BigQuery, באמצעות הפונקציה VECTOR_SEARCH ואינדקס וקטורי.
חיפוש וקטורי הוא שיטה להשוואה בין אובייקטים דומים באמצעות הטמעות, והוא משמש להפעלת מוצרי Google, כולל חיפוש Google, YouTube ו-Google Play. אתם יכולים להשתמש בחיפוש וקטורי כדי לבצע חיפושים סמנטיים בקנה מידה נרחב, או לבצע חיפוש משולב שמשלב חיפוש סמנטי עם חיפוש לקסיקלי (מילת מפתח). כשמשתמשים באינדקסים וקטוריים עם חיפוש וקטורי, אפשר לנצל טכנולוגיות בסיסיות כמו הוספה לאינדקס של קובץ הפוך (IVF) ואלגוריתם ScaNN.
חיפוש וקטורי מבוסס על הטמעות. הטמעות הן וקטורים מספריים רב-ממדיים שמייצגים ישות נתונה, כמו קטע טקסט או קובץ אודיו. מודלים של למידת מכונה (ML) משתמשים בהטמעות כדי לקודד סמנטיקה של ישויות כאלה, כדי שיהיה קל יותר להבין אותן ולהשוות ביניהן. לדוגמה, פעולה נפוצה במודלים של אשכולות, סיווג והמלצות היא למדוד את המרחק בין וקטורים במרחב הטמעה כדי למצוא פריטים שהכי דומים מבחינה סמנטית.
מטרות
- מבצעים חיפוש דמיון בהטמעות שמאוחסנות בטבלאות ב-BigQuery באמצעות הפונקציה
VECTOR_SEARCH. - כדי לשפר את הביצועים של החיפוש הווקטורי, אפשר להשתמש באינדקס וקטורי.
- מבצעים חיפוש שמשתמש באינדקס וקטורי וחיפוש שלא משתמש באינדקס.
- כדי להעריך את יכולת השליפה, משווים בין תוצאות החיפושים עם אינדקס לבין תוצאות החיפושים בלי אינדקס.
עלויות
הפונקציה VECTOR_SEARCH משתמשת בתמחור המחשוב של BigQuery.
החיוב על חיפוש דמיון מתבצע לפי תמחור על פי דרישה או לפי מהדורות.
- על פי דרישה: החיוב הוא על כמות הבייטים שנסרקו במסד הנתונים הטבלאי, באינדקס ובשאילתת החיפוש.
תמחור לפי מהדורות: אתם מחויבים על המשבצות שנדרשות להשלמת המשימה במסגרת המהדורה של ההזמנה שלכם. חישובים גדולים ומורכבים יותר של דמיון כרוכים בחיובים גבוהים יותר.
לפני שמתחילים
-
בדף לבחירת הפרויקט במסוף Google Cloud , בוחרים פרויקט ב- Google Cloud או יוצרים אותו.
התפקידים שנדרשים כדי לבחור או ליצור פרויקט
- בחירת פרויקט: כדי לבחור פרויקט לא נדרש תפקיד IAM ספציפי – אתם יכולים לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד "יצירת פרויקטים" (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים?
-
מפעילים את BigQuery API, אם הוא עדיין לא מופעל.
התפקידים שנדרשים כדי להפעיל ממשקי API
כדי להפעיל ממשקי API, צריך את ההרשאה
serviceusage.services.enable. אם אתם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד "בעלים" (roles/owner). אחרת, אתם יכולים לקבל את ההרשאה הזו דרך התפקיד "אדמין בממשק 'שימוש בשירות'" (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים?
התפקידים הנדרשים
כדי לקבל את ההרשאות שדרושות להשלמת המדריך, בקשו מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:
-
יצירת מערכי נתונים, טבלאות ואינדקסים של וקטורים:
עריכה של נתוני BigQuery (
roles/bigquery.dataEditor) -
הפעלת משימות ב-BigQuery:
BigQuery Job User (
roles/bigquery.jobUser)
להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.
יצירת קבוצת נתונים
כדי ליצור מערך נתונים ב-BigQuery, בוחרים אחת מהאפשרויות הבאות:
המסוף
נכנסים לדף BigQuery במסוף Google Cloud .
בחלונית הימנית, לוחצים על Explorer:

אם החלונית הימנית לא מוצגת, לוחצים על Expand left pane כדי לפתוח אותה.
ב-Explorer, מרחיבים את הפרויקט ולוחצים על Datasets.
בדף Datasets, לוחצים על Create dataset.
בחלונית Create dataset:
בשדה Dataset ID, מזינים
bqml_tutorial.בקטע Data location (מיקום הנתונים), בוחרים באפשרות US (ארה"ב).
משאירים את שאר הגדרות ברירת המחדל כמו שהן.
לוחצים על Create dataset.
BQ
כדי ליצור קבוצת נתונים חדשה, משתמשים בפקודה bq mk --dataset.
יוצרים מערך נתונים בשם
bqml_tutorialומגדירים את מיקום הנתונים ל-US:bq mk --dataset \ --location=US \ --description "BigQuery ML tutorial dataset." \ bqml_tutorial
מוודאים שמערך הנתונים נוצר:
bq ls
API
מפעילים את השיטה datasets.insert עם משאב של מערך נתונים מוגדר:
{ "datasetReference": { "datasetId": "bqml_tutorial" } }
יצירת טבלאות לאחסון נתונים והטמעות
בקטע הזה יוצרים את הטבלה patents שמכילה הטמעות של פטנטים. ההטמעות מבוססות על קבוצת משנה של קבוצת הנתונים הציבורית של Google פטנטים. בנוסף, אתם יוצרים את הטבלה patents2 שמכילה הטמעת פטנט כדי למצוא את השכנים הקרובים ביותר.
כדי ליצור את הטבלאות:
כדי ליצור את הטבלה
patents, מדביקים את הקוד הבא בעורך השאילתות ולוחצים על Run:CREATE TABLE bqml_tutorial.patents AS SELECT * FROM `patents-public-data.google_patents_research.publications` WHERE ARRAY_LENGTH(embedding_v1) > 0 AND publication_number NOT IN ('KR-20180122872-A') LIMIT 1000000;
תקבלו הודעת אישור כמו זו:
This statement created a new table named patents.כדי ליצור את הטבלה
patents2שמכילה הטמעת פטנטים למציאת השכנים הקרובים ביותר, מדביקים את הקוד הבא בעורך השאילתות ולוחצים על Run:CREATE TABLE bqml_tutorial.patents2 AS SELECT * FROM `patents-public-data.google_patents_research.publications` WHERE publication_number = 'KR-20180122872-A';
תקבלו הודעת אישור כמו זו:
This statement created a new table named patents2.
יצירת אינדקס וקטורי
כשמשתמשים ב-VECTOR_SEARCH עם אינדקס וקטורי, VECTOR_SEARCH משתמש בשיטה Approximate Nearest Neighbor כדי לשפר את הביצועים של החיפוש הווקטורי, אבל זה בא על חשבון הפחתת האחזור, ולכן מוחזרות תוצאות משוערות יותר. בלי אינדקס וקטורי, VECTOR_SEARCH משתמש בחיפוש כוח גס כדי למדוד את המרחק לכל רשומה.
בקטע הזה יוצרים את האינדקס הווקטורי my_index בעמודה embedding_v1 בטבלה patents. לאחר מכן, מוודאים שהאינדקס זמין.
כדי ליצור את האינדקס הווקטורי:
כדי ליצור את אינדקס הווקטור
my_indexבעמודהembedding_v1של הטבלהpatents, מדביקים את הקוד הבא בעורך השאילתות ולוחצים על Run:CREATE OR REPLACE VECTOR INDEX my_index ON bqml_tutorial.patents(embedding_v1) STORING(publication_number, title) OPTIONS(distance_type='COSINE', index_type='IVF');
תקבלו הודעת אישור כמו זו:
The vector index creation on table bqml_tutorial.patents was initiated. Please query bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES to check the progress of the index.כדי לוודא שהאינדקס הווקטורי מוכן, מדביקים את הקוד הבא בעורך השאילתות ולוחצים על Run:
SELECT * FROM bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES;
בתוצאות השאילתה, מוודאים שהערך של
index_statusהואACTIVE, ושהערך שלcoverage_percentageהוא100. יכול להיות שיעברו כמה דקות עד שהמכשירcoverage_percentageיגיע ל-100.
שימוש בפונקציה VECTOR_SEARCH עם אינדקס
אחרי שיוצרים את אינדקס הווקטורים ומאכלסים אותו, משתמשים בפונקציה VECTOR_SEARCH כדי למצוא את השכן הקרוב ביותר להטמעה בעמודה embedding_v1 בטבלה patents2. השאילתה הזו משתמשת באינדקס הווקטורי בחיפוש, ולכן VECTOR_SEARCH משתמש בשיטת Approximate Nearest Neighbor כדי למצוא את השכן הקרוב ביותר של ההטמעה.
כדי להשתמש בפונקציה VECTOR_SEARCH עם אינדקס, מדביקים את הקוד הבא בעורך השאילתות ולוחצים על Run:
SELECT query.publication_number AS query_publication_number, query.title AS query_title, base.publication_number AS base_publication_number, base.title AS base_title, distance FROM VECTOR_SEARCH( TABLE bqml_tutorial.patents, 'embedding_v1', TABLE bqml_tutorial.patents2, top_k => 5, distance_type => 'COSINE', options => '{"fraction_lists_to_search": 0.005}');
התוצאות אמורות להיראות כך:
+--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+ | query_publication_number | query_title | base_publication_number | base_title | distance | +--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+ | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-106599080-B | A kind of rapid generation for keeping away big vast transfer figure based on GIS | 0.14471956347590609 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-114118544-A | Urban waterlogging detection method and device | 0.17472108931171348 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | KR-20200048143-A | Method and system for mornitoring dry stream using unmanned aerial vehicle | 0.17561990745619782 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | KR-101721695-B1 | Urban Climate Impact Assessment method of Reflecting Urban Planning Scenarios and Analysis System using the same | 0.17696129365559843 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-109000731-B | The experimental rig and method that research inlet for stom water chocking-up degree influences water discharged amount | 0.17902723269642917 | +--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+
שימוש בפונקציה VECTOR_SEARCH עם כוח גס
בקטע הזה משתמשים בפונקציה VECTOR_SEARCH כדי למצוא את השכן הקרוב ביותר להטמעה בעמודה embedding_v1 בטבלה patents2.
השאילתה הזו לא משתמשת באינדקס הווקטורי בחיפוש, ולכן VECTOR_SEARCH מוצא את השכן הקרוב ביותר המדויק של ההטמעה.
כדי להשתמש ב-VECTOR_SEARCH עם brute force, מדביקים את הקוד הבא בעורך השאילתות ולוחצים על Run:
SELECT query.publication_number AS query_publication_number, query.title AS query_title, base.publication_number AS base_publication_number, base.title AS base_title, distance FROM VECTOR_SEARCH( TABLE bqml_tutorial.patents, 'embedding_v1', TABLE bqml_tutorial.patents2, top_k => 5, distance_type => 'COSINE', options => '{"use_brute_force":true}');
התוצאות אמורות להיראות כך:
+--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+ | query_publication_number | query_title | base_publication_number | base_title | distance | +--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+ | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-106599080-B | A kind of rapid generation for keeping away big vast transfer figure based on GIS | 0.1447195634759062 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-114118544-A | Urban waterlogging detection method and device | 0.1747210893117136 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | KR-20200048143-A | Method and system for mornitoring dry stream using unmanned aerial vehicle | 0.17561990745619782 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | KR-101721695-B1 | Urban Climate Impact Assessment method of Reflecting Urban Planning Scenarios and Analysis System using the same | 0.17696129365559843 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-109000731-B | The experimental rig and method that research inlet for stom water chocking-up degree influences water discharged amount | 0.17902723269642928 | +--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+
הערכת הזיכרון
כשמבצעים חיפוש וקטורי עם אינדקס, מקבלים תוצאות משוערות, אבל האחזור מצטמצם. כדי לחשב את ה-recall, משווים בין התוצאות שמתקבלות מחיפוש וקטורי עם אינדקס לבין התוצאות שמתקבלות מחיפוש וקטורי עם כוח גס. הערך publication_number מזהה פטנט באופן ייחודי, ולכן הוא משמש להשוואה בשאילתה הבאה.
כדי להעריך את ה-recall, מדביקים את הקוד הבא בעורך השאילתות ולוחצים על Run:
WITH approx_results AS ( SELECT query.publication_number AS query_publication_number, base.publication_number AS base_publication_number FROM VECTOR_SEARCH( TABLE bqml_tutorial.patents, 'embedding_v1', TABLE bqml_tutorial.patents2, top_k => 5, distance_type => 'COSINE', options => '{"fraction_lists_to_search": 0.005}') ), exact_results AS ( SELECT query.publication_number AS query_publication_number, base.publication_number AS base_publication_number FROM VECTOR_SEARCH( TABLE bqml_tutorial.patents, 'embedding_v1', TABLE bqml_tutorial.patents2, top_k => 5, distance_type => 'COSINE', options => '{"use_brute_force":true}') ) SELECT a.query_publication_number, SUM(CASE WHEN a.base_publication_number = e.base_publication_number THEN 1 ELSE 0 END) / 5 AS recall FROM exact_results e LEFT JOIN approx_results a ON e.query_publication_number = a.query_publication_number GROUP BY a.query_publication_number;
התוצאות נראות כך:
+--------------------------+--------+ | query_publication_number | recall | +--------------------------+--------+ | KR-20180122872-A | 1.0 | +--------------------------+--------+
אם ה-recall נמוך מהרצוי, אפשר להגדיל את הערך של fraction_lists_to_search, אבל יכול להיות שזמן האחזור והשימוש במשאבים יגדלו. כדי לכוונן את החיפוש הווקטורי, אתם יכולים להריץ את VECTOR_SEARCH כמה פעמים עם ערכי ארגומנטים שונים, לשמור את התוצאות בטבלאות ואז להשוות בין התוצאות.
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים הנפרדים.
- במסוף Google Cloud , נכנסים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.
לחלופין, כדי לשמור את הפרויקט ולמחוק את המשאבים שבהם השתמשתם במדריך הזה:
נכנסים לדף BigQuery.
בחלונית הימנית, מרחיבים את הפרויקט ולוחצים על Datasets.
במערך הנתונים
bqml_tutorial, לוחצים על פתיחת הפעולות > מחיקה.בתיבת הדו-שיח Delete dataset, לוחצים על Delete כדי לאשר.