חיפוש הטמעות באמצעות חיפוש וקטורי
במדריך הזה נסביר איך לבצע חיפוש דמיון בהטמעות שמאוחסנות בטבלאות BigQuery באמצעות הפונקציה VECTOR_SEARCH, ואופציונלית באמצעות אינדקס וקטורי.
כשמשתמשים ב-VECTOR_SEARCH עם אינדקס וקטורי, VECTOR_SEARCH משתמש בשיטה Approximate Nearest Neighbor כדי לשפר את הביצועים של החיפוש הווקטורי, אבל בתמורה לכך הוא מצמצם את ההחזרה של התוצאות, ולכן מחזיר תוצאות משוערות יותר. בלי אינדקס וקטורי, VECTOR_SEARCH משתמש בחיפוש בכוח כדי למדוד את המרחק של כל רשומה.
ההרשאות הנדרשות
כדי להפעיל את המדריך הזה, אתם צריכים את ההרשאות הבאות לניהול זהויות והרשאות גישה (IAM):
- כדי ליצור מערך נתונים, צריך את ההרשאה
bigquery.datasets.create. כדי ליצור טבלה, צריך את ההרשאות הבאות:
bigquery.tables.createbigquery.tables.updateDatabigquery.jobs.create
כדי ליצור אינדקס וקטורי, אתם צריכים הרשאת
bigquery.tables.createIndexבטבלה שבה אתם יוצרים את האינדקס.כדי להסיר אינדקס וקטורי, צריך הרשאה
bigquery.tables.deleteIndexבטבלה שבה מסירים את האינדקס.
כל אחד מהתפקידים הבאים ב-IAM שהוגדרו מראש כולל את ההרשאות שנדרשות לעבודה עם אינדקסים של וקטורים:
- בעלים של נתונים ב-BigQuery (
roles/bigquery.dataOwner) - עריכה של נתוני BigQuery (
roles/bigquery.dataEditor)
עלויות
הפונקציה VECTOR_SEARCH משתמשת בתמחור של BigQuery Compute.
אתם מחויבים על חיפוש דמיון לפי תמחור לפי דרישה או לפי מהדורות.
- על פי דרישה: אתם מחויבים על כמות הבייטים שנסרקו בטבלת הבסיס, באינדקס ובשאילתת החיפוש.
תמחור מהדורות: אתם מחויבים על המשבצות שנדרשות להשלמת העבודה במהדורה שהזמנתם. חישובים גדולים ומורכבים יותר של דמיון כרוכים בחיובים גבוהים יותר.
מידע נוסף זמין במאמר תמחור ב-BigQuery.
לפני שמתחילים
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the BigQuery API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
יצירת מערך נתונים
יוצרים מערך נתונים ב-BigQuery:
נכנסים לדף BigQuery במסוף Google Cloud .
בחלונית Explorer, לוחצים על שם הפרויקט.
לוחצים על הצגת פעולות > יצירת מערך נתונים.

בדף Create dataset, מבצעים את הפעולות הבאות:
בשדה Dataset ID (מזהה מערך הנתונים), מזינים
vector_search.בקטע Location type, בוחרים באפשרות במספר אזורים ואז באפשרות US (multiple regions in United States).
מערכי הנתונים הציבוריים מאוחסנים ב
USמספר אזורים. כדי לפשט את התהליך, כדאי לאחסן את מערך הנתונים באותו מיקום.משאירים את שאר הגדרות ברירת המחדל כמו שהן ולוחצים על Create dataset (יצירת מערך נתונים).
יצירת טבלאות בדיקה
יוצרים את הטבלה
patentsשמכילה הטמעות של פטנטים, על סמך קבוצת משנה של מערך הנתונים הציבורי של Google Patents:CREATE TABLE vector_search.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;
יוצרים את הטבלה
patents2שמכילה הטמעה של פטנט כדי למצוא את השכנים הקרובים ביותר ל:CREATE TABLE vector_search.patents2 AS SELECT * FROM `patents-public-data.google_patents_research.publications` WHERE publication_number = 'KR-20180122872-A';
יצירת אינדקס וקטורי
יוצרים את אינדקס הווקטור
my_indexבעמודהembeddings_v1של הטבלהpatents:CREATE OR REPLACE VECTOR INDEX my_index ON vector_search.patents(embedding_v1) STORING(publication_number, title) OPTIONS(distance_type='COSINE', index_type='IVF');
ממתינים כמה דקות עד ליצירת אינדקס הווקטור, ואז מריצים את השאילתה הבאה ומוודאים שהערך של
coverage_percentageהוא100:SELECT * FROM vector_search.INFORMATION_SCHEMA.VECTOR_INDEXES;
שימוש בפונקציה VECTOR_SEARCH עם אינדקס
אחרי שיוצרים את אינדקס הווקטור ומאכלסים אותו, משתמשים בפונקציה VECTOR_SEARCH
כדי למצוא את השכן הקרוב ביותר להטמעה בעמודה embedding_v1 בטבלה patents2. השאילתה הזו משתמשת באינדקס הווקטורי בחיפוש, ולכן VECTOR_SEARCH משתמשת בשיטת השכן הקרוב המשוער כדי למצוא את השכן הקרוב ביותר להטמעה.
משתמשים בפונקציה VECTOR_SEARCH עם אינדקס:
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 vector_search.patents, 'embedding_v1', TABLE vector_search.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 מוצא את השכן הקרוב ביותר המדויק של ההטמעה.
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 vector_search.patents, 'embedding_v1', TABLE vector_search.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 | +--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+
הערכת היכולת להיזכר
כשמבצעים חיפוש וקטורי עם אינדקס, מתקבלות תוצאות משוערות, אבל ההחזרה מצטמצמת. אפשר לחשב את ההחזרה על ידי השוואה בין התוצאות שמוחזרות מחיפוש וקטורי עם אינדקס לבין חיפוש וקטורי עם כוח גס. במערך הנתונים הזה, הערך publication_number מזהה באופן ייחודי פטנט, ולכן הוא משמש להשוואה.
WITH approx_results AS ( SELECT query.publication_number AS query_publication_number, base.publication_number AS base_publication_number FROM VECTOR_SEARCH( TABLE vector_search.patents, 'embedding_v1', TABLE vector_search.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 vector_search.patents, 'embedding_v1', TABLE vector_search.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
אם ההחזרה נמוכה מהרצוי, אפשר להגדיל את הערך של fraction_lists_to_search, אבל זה עלול להגדיל את זמן האחזור ואת השימוש במשאבים. כדי לכוונן את החיפוש הווקטורי, אפשר להריץ כמה פעמים את VECTOR_SEARCH עם ערכי ארגומנטים שונים, לשמור את התוצאות בטבלאות ואז להשוות בין התוצאות.
הסרת המשאבים
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.