벡터 검색으로 임베딩 검색

이 튜토리얼에서는 유사성 검색을 사용하여 BigQuery 테이블에 저장된 임베딩에 대한 유사성 검색을 수행하는 방법을 보여줍니다.VECTOR_SEARCH

벡터 검색은 임베딩을 사용하여 유사한 객체를 비교하는 기술로, Google 검색, YouTube, Google Play를 비롯한 Google 제품을 지원하는 데 사용됩니다. 벡터 검색을 사용하여 대규모로 시맨틱 검색을 수행하거나 시맨틱 검색과 어휘 (키워드) 검색을 결합한 하이브리드 검색 을 수행할 수 있습니다. 벡터 검색과 함께 벡터 색인을 사용하면 역파일 색인(IVF) 및 ScaNN 알고리즘과 같은 기본 기술을 활용할 수 있습니다.

벡터 검색은 임베딩을 기반으로 빌드됩니다. 임베딩은 텍스트 또는 오디오 파일의 일부와 같이 특정 항목을 나타내는 고차원의 숫자 벡터입니다. 머신러닝 (ML) 모델은 임베딩을 사용하여 이러한 항목에 대한 시맨틱스를 인코딩함으로써 손쉽게 추론하고 비교할 수 있도록 합니다. 예를 들어 클러스터링, 분류, 추천 모델에서 일반적인 작업은 임베딩 공간에서 벡터 간 거리를 측정하여 의미론적으로 가장 유사한 항목을 찾는 것입니다.

목표

  • VECTOR_SEARCH 함수를 사용하여 BigQuery 테이블에 저장된 임베딩에 대한 유사성 검색을 수행합니다.
  • 벡터 색인을 사용하여 벡터 검색 성능을 개선합니다.
  • 벡터 색인을 사용하는 검색과 색인을 사용하지 않는 검색을 수행합니다.
  • 색인을 사용하는 검색 결과와 색인을 사용하지 않는 검색 결과를 비교하여 재현율을 평가합니다.

비용

VECTOR_SEARCH 함수는 BigQuery 컴퓨팅 가격 책정을 사용합니다. 주문형 또는 버전 가격 책정을 사용하여 유사성 검색에 대한 요금이 청구됩니다.

  • 주문형: 기본 테이블, 색인, 검색어에서 스캔한 바이트 수에 따라 요금이 청구됩니다.
  • 버전 가격 책정: 예약 버전 내에서 작업을 완료하는 데 필요한 슬롯에 대한 요금이 청구됩니다. 더 크고 복잡한 유사성 계산에는 더 많은 요금이 발생합니다.

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

시작하기 전에

  1. Google Cloud 콘솔의 프로젝트 선택기 페이지에서 프로젝트를 선택하거나 만듭니다. Google Cloud

    프로젝트를 선택하거나 만드는 데 필요한 역할

    • 프로젝트 선택: 프로젝트를 선택하는 데는 특정 IAM 역할이 필요하지 않습니다. 역할이 부여된 프로젝트를 선택할 수 있습니다.
    • 프로젝트 만들기: 프로젝트를 만들려면 resourcemanager.projects.create 권한이 포함된 프로젝트 생성자 역할 (roles/resourcemanager.projectCreator)이 필요합니다. 역할 부여 방법 알아보기.

    프로젝트 선택기로 이동

  2. 프로젝트에 결제가 사용 설정되어 있는지 확인합니다 Google Cloud .

  3. BigQuery API를 사용 설정합니다.

    API 사용 설정에 필요한 역할

    API를 사용 설정하려면 serviceusage.services.enable 권한이 필요합니다. 프로젝트를 만든 경우 소유자 역할 (roles/owner)을 통해 이 권한을 이미 보유하고 있을 가능성이 높습니다. 그렇지 않은 경우 서비스 사용량 관리자 역할 (roles/serviceusage.serviceUsageAdmin)을 통해 이 권한을 얻을 수 있습니다. 역할 부여 방법 알아보기

    API 사용 설정하기

필요한 역할

이 튜토리얼을 완료하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

데이터 세트 만들기

BigQuery 데이터 세트를 만들려면 다음 옵션 중 하나를 선택합니다.

콘솔

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

    BigQuery로 이동

  2. 왼쪽 창에서 탐색기를 클릭합니다.

    강조 표시된 탐색기 창 버튼

    왼쪽 창이 표시되지 않으면 왼쪽 창 펼치기를 클릭하여 창을 엽니다.

  3. 탐색기에서 프로젝트를 펼친 다음 데이터 세트를 클릭합니다.

  4. 데이터 세트 페이지에서 데이터 세트 만들기 를 클릭합니다.

  5. 데이터 세트 만들기 창에서 다음을 수행합니다.

    • 데이터 세트 IDbqml_tutorial을 입력합니다.

    • 데이터 위치미국을 선택합니다.

    나머지 기본 설정은 그대로 둡니다.

  6. 데이터 세트 만들기 를 클릭합니다.

bq

새 데이터 세트를 만들려면 bq mk --dataset 명령어를 사용합니다.

  1. 데이터 위치가 US로 설정된 bqml_tutorial 데이터 세트를 만듭니다.

    bq mk --dataset \
      --location=US \
      --description "BigQuery ML tutorial dataset." \
      bqml_tutorial
  2. 데이터 세트가 생성되었는지 확인합니다.

    bq ls

API

정의된 데이터 세트 리소스를 사용하여 datasets.insert 메서드를 호출합니다.

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

데이터 및 임베딩을 저장할 테이블 만들기

이 섹션에서는 특허 임베딩이 포함된 patents 테이블을 만듭니다. 임베딩은 Google 특허 검색 공개 데이터 세트의 하위 집합을 기반으로 합니다. 또한 최근접 이웃을 찾기 위한 특허 임베딩이 포함된 patents2 테이블도 만듭니다.

테이블을 만들려면 다음 단계를 따르세요.

  1. patents 테이블을 만들려면 쿼리 편집기에 다음을 붙여넣고 실행을 클릭합니다.

    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.

  2. 최근접 이웃을 찾기 위한 특허 임베딩이 포함된 patents2 테이블을 만들려면 쿼리 편집기에 다음을 붙여넣고 실행을 클릭합니다.

    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근사 최근접 이웃 방법을 사용하여 벡터 검색 성능을 개선하고 재현율 을 줄여 더 나은 근사치의 결과를 반환합니다. 벡터 색인이 없으면 VECTOR_SEARCH무작위 대입 검색 을 사용하여 모든 레코드의 거리를 측정합니다.

이 섹션에서는 patents 테이블의 embedding_v1 열에 my_index 벡터 색인을 만듭니다. 그런 다음 색인이 사용 가능한지 확인합니다.

벡터 색인을 만들려면 다음 단계를 따르세요.

  1. patents 테이블의 embedding_v1 열에 my_index 벡터 색인을 만들려면 쿼리 편집기에 다음을 붙여넣고 실행을 클릭합니다.

    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.

  2. 벡터 색인이 준비되었는지 확인하려면 쿼리 편집기에 다음을 붙여넣고 실행을 클릭합니다.

    SELECT * FROM bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES;

    쿼리 결과에서 index_statusACTIVE이고 coverage_percentage 값이 100인지 확인합니다. coverage_percentage100에 도달하는 데 몇 분 정도 걸릴 수 있습니다.

색인과 함께 VECTOR_SEARCH 함수 사용

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

재현율 평가

색인을 사용하여 벡터 검색을 수행하면 대략적인 결과가 반환되지만 재현율이 낮아집니다. 벡터 검색에서 반환된 결과를 색인을 사용하는 벡터 검색 및 무작위 대입을 사용하는 벡터 검색과 비교하여 재현율을 계산할 수 있습니다. 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 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 |
+--------------------------+--------+

재현율이 원하는 값보다 낮으면 fraction_lists_to_search 값을 늘릴 수 있지만 지연 시간이 길어지고 리소스 사용량이 증가할 수 있습니다. 벡터 검색을 조정하려면 서로 다른 인수 값으로 VECTOR_SEARCH를 여러 번 실행해 보고 결과를 테이블에 저장한 후 결과를 비교하면 됩니다.

정리

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

  1. 콘솔 Google Cloud 에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력하고 종료 를 클릭하여 프로젝트를 삭제합니다.

또는 프로젝트를 유지하고 이 튜토리얼에서 사용된 리소스를 삭제하려면 다음 단계를 따르세요.

  1. BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 왼쪽 창에서 프로젝트를 펼친 다음 데이터 세트 를 클릭합니다.

  3. bqml_tutorial 데이터 세트에서 작업 열기 > 삭제를 클릭합니다.

  4. 데이터 세트 삭제 대화상자에서 삭제 를 클릭하여 확인합니다.

다음 단계