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

במדריך הזה נסביר איך לבצע חיפוש דמיון בהטמעות שמאוחסנות בטבלאות 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. בדף לבחירת הפרויקט במסוף Cloud de Confiance , בוחרים פרויקט ב- Cloud de Confiance או יוצרים אותו.

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים

    כניסה לדף לבחירת הפרויקט

  2. מוודאים שהחיוב מופעל בפרויקט Cloud de Confiance .

  3. מפעילים את BigQuery API.

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

    להפעלת ה-API

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

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

  1. במסוף Cloud de Confiance , עוברים לדף BigQuery.

    לדף BigQuery

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

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

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

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

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

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

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

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

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

  1. יוצרים את הטבלה patents שמכילה הטמעות של פטנטים, על סמך קבוצת משנה של מערך הנתונים הציבורי של Google פטנטים:

    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 אינדקס הווקטורים בעמודה embedding_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. במסוף Cloud de Confiance , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.