벡터 검색으로 임베딩 검색

이 튜토리얼에서는 VECTOR_SEARCH 함수와 선택적으로 벡터 색인을 사용하여 BigQuery 테이블에 저장된 임베딩을 검색하는 방법을 보여줍니다.

필수 권한

이 튜토리얼을 실행하려면 다음 Identity and Access Management(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)

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

  • BigQuery: You incur costs for index storage and data processing in BigQuery.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

자세한 내용은 BigQuery 가격 책정을 참조하세요.

시작하기 전에

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery API.

    Enable the API

데이터 세트 만들기

BigQuery 데이터 세트를 만듭니다.

  1. Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery 페이지로 이동

  2. 탐색기 창에서 프로젝트 이름을 클릭합니다.

  3. 작업 보기 > 데이터 세트 만들기를 클릭합니다.

    데이터 세트 만들기

  4. 데이터 세트 만들기 페이지에서 다음을 수행합니다.

    • 데이터 세트 IDvector_search를 입력합니다.

    • 위치 유형에 대해 멀티 리전을 선택한 다음 US(미국 내 여러 리전)를 선택합니다.

      공개 데이터 세트는 US 멀티 리전에 저장됩니다. 편의상 같은 위치에 데이터 세트를 저장합니다.

    • 나머지 기본 설정은 그대로 두고 데이터 세트 만들기를 클릭합니다.

테스트 테이블 만들기

  1. 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. patents 테이블의 embeddings_v1 열에 my_index 벡터 색인을 만듭니다.

    CREATE VECTOR INDEX my_index ON vector_search.patents(embedding_v1)
    OPTIONS(distance_type='COSINE', index_type='IVF', ivf_options='{"num_lists": 1000}');
  2. 벡터 색인이 생성될 때까지 몇 분 정도 기다린 후 다음 쿼리를 실행하고 coverage_percentage 값이 100인지 확인합니다.

    SELECT * FROM vector_search.INFORMATION_SCHEMA.VECTOR_INDEXES;

색인과 함께 VECTOR_SEARCH 함수 사용

벡터 색인을 만들어 채운 후 VECTOR_SEARCH 함수를 사용하여 patents2 테이블의 embedding_v1 열에서 임베딩의 가장 가까운 이웃을 찾습니다. 이 쿼리는 검색에 벡터 색인을 사용하므로 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 함수를 사용하여 patents2 테이블의 embedding_v1 열에서 임베딩의 최근접 이웃을 찾습니다. 이 쿼리는 검색에 벡터 색인을 사용하지 않으므로 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.