חיפוש הטמעות באמצעות חיפוש וקטורי

במדריך הזה נסביר איך לבצע חיפוש דמיון בהטמעות שמאוחסנות בטבלאות BigQuery באמצעות הפונקציה VECTOR_SEARCH, ואופציונלית באמצעות אינדקס וקטורי.

כשמשתמשים ב-VECTOR_SEARCH עם אינדקס וקטורי, VECTOR_SEARCH משתמש בשיטה Approximate Nearest Neighbor כדי לשפר את הביצועים של החיפוש הווקטורי, אבל בתמורה לכך הוא מצמצם את ההחזרה של התוצאות, ולכן מחזיר תוצאות משוערות יותר. בלי אינדקס וקטורי,‏ VECTOR_SEARCH משתמש בחיפוש בכוח כדי למדוד את המרחק של כל רשומה.

ההרשאות הנדרשות

כדי להפעיל את המדריך הזה, אתם צריכים את ההרשאות הבאות לניהול זהויות והרשאות גישה (IAM):

  • כדי ליצור מערך נתונים, צריך את ההרשאה bigquery.datasets.create.
  • כדי ליצור טבלה, צריך את ההרשאות הבאות:

    • bigquery.tables.create
    • bigquery.tables.updateData
    • bigquery.jobs.create
  • כדי ליצור אינדקס וקטורי, אתם צריכים הרשאת bigquery.tables.createIndex בטבלה שבה אתם יוצרים את האינדקס.

  • כדי להסיר אינדקס וקטורי, צריך הרשאה bigquery.tables.deleteIndex בטבלה שבה מסירים את האינדקס.

כל אחד מהתפקידים הבאים ב-IAM שהוגדרו מראש כולל את ההרשאות שנדרשות לעבודה עם אינדקסים של וקטורים:

  • בעלים של נתונים ב-BigQuery‏ (roles/bigquery.dataOwner)
  • עריכה של נתוני BigQuery‏ (roles/bigquery.dataEditor)

עלויות

הפונקציה VECTOR_SEARCH משתמשת בתמחור של BigQuery Compute. אתם מחויבים על חיפוש דמיון לפי תמחור לפי דרישה או לפי מהדורות.

  • על פי דרישה: אתם מחויבים על כמות הבייטים שנסרקו בטבלת הבסיס, באינדקס ובשאילתת החיפוש.
  • תמחור מהדורות: אתם מחויבים על המשבצות שנדרשות להשלמת העבודה במהדורה שהזמנתם. חישובים גדולים ומורכבים יותר של דמיון כרוכים בחיובים גבוהים יותר.

מידע נוסף זמין במאמר תמחור ב-BigQuery.

לפני שמתחילים

  1. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

יצירת מערך נתונים

יוצרים מערך נתונים ב-BigQuery:

  1. נכנסים לדף BigQuery במסוף Google Cloud .

    לדף BigQuery

  2. בחלונית Explorer, לוחצים על שם הפרויקט.

  3. לוחצים על הצגת פעולות > יצירת מערך נתונים.

    יוצרים מערך נתונים שיכיל את האובייקטים שמשמשים במדריך.

  4. בדף Create dataset, מבצעים את הפעולות הבאות:

    • בשדה Dataset ID (מזהה מערך הנתונים), מזינים vector_search.

    • בקטע Location type, בוחרים באפשרות במספר אזורים ואז באפשרות US (multiple regions in United States).

      מערכי הנתונים הציבוריים מאוחסנים בUS מספר אזורים. כדי לפשט את התהליך, כדאי לאחסן את מערך הנתונים באותו מיקום.

    • משאירים את שאר הגדרות ברירת המחדל כמו שהן ולוחצים על Create dataset (יצירת מערך נתונים).

יצירת טבלאות בדיקה

  1. יוצרים את הטבלה 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;
  2. יוצרים את הטבלה patents2 שמכילה הטמעה של פטנט כדי למצוא את השכנים הקרובים ביותר ל:

    CREATE TABLE vector_search.patents2 AS
    SELECT * FROM `patents-public-data.google_patents_research.publications`
    WHERE publication_number = 'KR-20180122872-A';

יצירת אינדקס וקטורי

  1. יוצרים את אינדקס הווקטור 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');
  2. ממתינים כמה דקות עד ליצירת אינדקס הווקטור, ואז מריצים את השאילתה הבאה ומוודאים שהערך של 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 עם ערכי ארגומנטים שונים, לשמור את התוצאות בטבלאות ואז להשוות בין התוצאות.

הסרת המשאבים

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.