시맨틱 검색 및 검색 증강 생성 수행

이 튜토리얼에서는 원격 모델 AI.GENERATE_EMBEDDING 함수와 함께 사용하여 BigQuery 테이블에 텍스트 임베딩을 생성합니다. 그런 다음 벡터 색인 을 만들어 임베딩의 색인을 생성하여 검색 성능을 개선합니다.

임베딩과 함께 VECTOR_SEARCH 함수 를 사용하여 유사한 텍스트를 검색합니다. 벡터 검색은 텍스트와 같은 지정된 항목을 나타내는 고차원의 숫자 벡터인 임베딩을 사용하여 유사한 객체를 비교하는 기법입니다.

마지막으로 검색 증강 생성(RAG) 을(를) AI.GENERATE_TEXT 함수로 텍스트를 생성하여 수행합니다. RAG는 검색과 데이터베이스와 같은 정보 검색 시스템의 강점과 생성형 대규모 언어 모델(LLM)의 기능을 결합한 AI 프레임워크입니다. 데이터와 세상의 지식을 LLM 언어 능력과 결합하여 보다 정확하고 특정한 니즈와 관련성이 높은 최신 상태의 그라운딩된 생성을 제공합니다.

이 튜토리얼에서는 Google 특허 검색 Research 공개 데이터 세트의 데이터를 사용합니다.

목표

  • Gemini Enterprise Agent Platform 임베딩 모델을 통해 BigQuery ML 원격 모델을 만듭니다.
  • 원격 모델을 AI.GENERATE_EMBEDDING 함수와 함께 사용하여 BigQuery 테이블의 텍스트에서 임베딩을 생성합니다.
  • 검색 성능을 개선하기 위해 임베딩의 색인을 생성하는 벡터 색인을 만듭니다.
  • 임베딩과 함께 VECTOR_SEARCH 함수를 사용하여 유사한 텍스트를 검색합니다.
  • AI.GENERATE_TEXT 함수로 텍스트를 생성하고 벡터 검색 결과를 사용하여 프롬프트 입력을 보강하고 결과를 개선하여 RAG를 수행합니다.

비용

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

  • BigQuery ML: You incur costs for the data that you process in BigQuery.
  • Gemini Enterprise Agent Platform: You incur costs for calls to the Agent Platform service that's represented by the remote model.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.

신규 Google Cloud 사용자는 무료 체험판을 사용할 수 있습니다.

자세한 내용은 다음 가격 책정 페이지를 참조하세요.

시작하기 전에

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

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

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

    프로젝트 선택기로 이동

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

  3. BigQuery, Cloud Storage, Gemini Enterprise Agent Platform 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"
  }
}

텍스트 임베딩 생성을 위한 원격 모델 만들기

이 섹션에서는 호스팅된 Agent Platform 텍스트 임베딩 생성 모델을 나타내는 원격 모델을 만듭니다. 모델을 만들 때는 DEFAULT 연결 을 사용하여 Text embeddings API 를 호출하여 text-embedding-005 모델을 사용하여 텍스트 임베딩을 가져옵니다. 기본 연결이 없는 경우 CREATE MODEL 문이 연결을 만듭니다.

텍스트 임베딩 모델을 만들려면 다음 단계를 따르세요.

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

    BigQuery로 이동

  2. 모델을 만들려면 이 명령어를 쿼리 편집기에 붙여넣은 다음 실행을 클릭합니다.

    CREATE OR REPLACE MODEL `bqml_tutorial.embedding_model`
      REMOTE WITH CONNECTION DEFAULT
      OPTIONS (ENDPOINT = 'text-embedding-005');

    쿼리가 완료되는 데 몇 초가 걸리며, 완료되면 탐색기 창을 통해 모델 embedding_model에 액세스할 수 있습니다.

    다음과 같은 확인 메시지가 표시됩니다. Successfully created model named embedding_model.

텍스트 임베딩 생성

AI.GENERATE_EMBEDDING 함수를 사용하여 특허 검색 초록에서 텍스트 임베딩을 생성한 후 BigQuery 테이블에 작성하여 이를 검색할 수 있게 합니다.

Agent Platform LLM 할당량 또는 서비스 사용 불가로 인해 AI.GENERATE_EMBEDDING 함수 를 사용한 임베딩 생성이 실패할 수 있습니다. 실패하면 쿼리 결과의 status 열에 오류 세부정보가 반환됩니다.

BigQuery의 대체 텍스트 임베딩 생성 방법은 사전 학습된 TensorFlow 모델을 사용하여 텍스트 임베딩 튜토리얼을 참조하세요.

텍스트 임베딩을 생성하려면 이 명령어를 쿼리 편집기에 붙여넣은 다음 실행을 클릭합니다.

  CREATE OR REPLACE TABLE bqml_tutorial.embeddings AS
  SELECT * FROM AI.GENERATE_EMBEDDING(
    MODEL bqml_tutorial.embedding_model,
    (
      SELECT *, abstract AS content
      FROM patents-public-data.google_patents_research.publications
      WHERE LENGTH(abstract) > 0 AND LENGTH(title) > 0 AND country = 'Singapore'
    )
  )
  WHERE LENGTH(status) = 0;
  

이 쿼리가 완료되는 데 몇 분이 걸립니다. 다음과 같은 확인 메시지가 표시됩니다:This statement created a new table named embeddings.

벡터 색인 만들기

임베딩 열에 벡터 색인을 만들면 해당 열에서 수행되는 벡터 검색은 근사 최근접 이웃 검색 기법을 사용합니다. 이 기법은 벡터 검색 성능을 개선하고 더 나은 근사치의 결과를 반환하지만 재현율은 감소합니다.

벡터 색인을 만들려면 CREATE VECTOR INDEX 데이터 정의 언어 (DDL) 문을 사용합니다. 색인을 사용할 수 있는지 확인하려면 INFORMATION_SCHEMA.VECTOR_INDEXES 를 쿼리하여 coverage_percentage 열 값이 0보다 크고 last_refresh_time 열 값이 NULL이 아닌지 확인합니다.

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

  1. 벡터 색인을 만들려면 이 명령어를 쿼리 편집기에 붙여넣은 다음 실행을 클릭합니다.

    CREATE OR REPLACE VECTOR INDEX my_index
    ON `bqml_tutorial.embeddings`(embedding)
    OPTIONS(index_type = 'IVF',
      distance_type = 'COSINE',
      ivf_options = '{"num_lists":500}');

    다음과 같은 확인 메시지가 표시됩니다. The vector index creation on table bqml_tutorial.embeddings was initiated. Please query bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES to check the progress of the index.

    벡터 색인을 만드는 데는 일반적으로 몇 초 정도 걸립니다. 벡터 색인이 비동기식으로 채워지는 데 2~3분이 더 걸립니다.

  2. 색인을 사용할 준비가 되었는지 확인하려면 이 명령어를 쿼리 편집기에 붙여넣은 다음 실행을 클릭합니다.

    SELECT table_name, index_name, index_status,
    coverage_percentage, last_refresh_time, disable_reason
    FROM `PROJECT_ID.bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES`;

    PROJECT_ID를 프로젝트 ID로 바꿉니다.

    쿼리를 실행한 후 결과의 index_status 열에 색인이 ACTIVE로 표시되고 coverage_percentage 값이 100이면 색인을 사용할 수 있습니다.

벡터 색인을 사용하여 텍스트 유사성 검색 수행

VECTOR_SEARCH 함수 를 사용하여 텍스트 쿼리에서 생성된 임베딩과 일치하는 관련 특허를 검색합니다.

top_k 인수는 반환할 일치 항목 수를 결정합니다. 이 경우에는 5입니다. fraction_lists_to_search 옵션은 검색할 벡터 색인 목록의 비율을 결정합니다. 만든 벡터 색인에는 500개의 목록이 있으므로 이 벡터 검색이 이러한 목록 중 5개를 검사함을 나타내는 fraction_lists_to_search.01이 있습니다. 여기에 표시된 대로 fraction_lists_to_search 값이 낮으면 재현율이 낮고 성능이 빨라집니다.

벡터 색인 목록에 관한 자세한 내용은 num_lists 벡터 색인 옵션을 참조하세요.

이 쿼리에서 임베딩을 생성하는 데 사용하는 모델은 비교하려는 테이블에서 임베딩을 생성하는 데 사용하는 모델과 동일해야 하며 그렇지 않으면 검색 결과가 정확하지 않습니다.

텍스트 유사성 검색을 수행하려면 이 명령어를 쿼리 편집기에 붙여넣은 다음 실행을 클릭합니다.

  SELECT query.query, base.publication_number, base.title, base.abstract
  FROM VECTOR_SEARCH(
    TABLE bqml_tutorial.embeddings, 'embedding',
    (
    SELECT embedding, content AS query
    FROM AI.GENERATE_EMBEDDING(
    MODEL bqml_tutorial.embedding_model,
    (SELECT 'improving password security' AS content))
    ),
    top_k => 5, options => '{"fraction_lists_to_search": 0.01}');
  

출력은 다음과 비슷합니다.

+-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+
|            query            | publication_number |                       title                     |                      abstract                   |
+-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+
| improving password security | SG-120868-A1       | Data storage device security method and a...    | Methods for improving security in data stora... |
| improving password security | SG-10201610585W-A  | Passsword management system and process...      | PASSSWORD MANAGEMENT SYSTEM AND PROCESS ...     |
| improving password security | SG-148888-A1       | Improved system and method for...               | IMPROVED SYSTEM AND METHOD FOR RANDOM...        |
| improving password security | SG-194267-A1       | Method and system for protecting a password...  | A system for providing security for a...        |
| improving password security | SG-120868-A1       | Data storage device security...                 | Methods for improving security in data...       |
+-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+

텍스트 생성을 위한 원격 모델 만들기

호스팅된 Agent Platform 텍스트 생성 모델을 나타내는 원격 모델을 만들려면 이 명령어를 쿼리 편집기에 붙여넣은 다음 실행을 클릭합니다.

  CREATE OR REPLACE MODEL bqml_tutorial.text_model
    REMOTE WITH CONNECTION DEFAULT
    OPTIONS (ENDPOINT = 'gemini-2.5-flash');
  

다음과 같은 확인 메시지가 표시됩니다. Successfully created model named text_model.

벡터 검색 결과로 보강된 텍스트 생성

`AI.GENERATE_TEXT` 함수AI.GENERATE_TEXT를 사용하여 텍스트를 생성하기 위해 프롬프트로 검색 결과를 제공합니다.

벡터 검색 결과를 보강하려면 이 명령어를 쿼리 편집기에 붙여넣은 다음 실행을 클릭합니다.

  SELECT result AS generated, prompt
  FROM AI.GENERATE_TEXT(
    MODEL bqml_tutorial.text_model,
    (
      SELECT CONCAT(
        'Propose some project ideas to improve user password security using the context below: ',
        STRING_AGG(
          FORMAT("patent title: %s, patent abstract: %s", base.title, base.abstract),
          ',\n')
        ) AS prompt,
      FROM VECTOR_SEARCH(
        TABLE bqml_tutorial.embeddings, 'embedding',
        (
          SELECT embedding, content AS query
          FROM AI.GENERATE_EMBEDDING(
            MODEL bqml_tutorial.embedding_model,
            (SELECT 'improving password security' AS content)
          )
        ),
      top_k => 5, options => '{"fraction_lists_to_search": 0.01}')
    ),
    STRUCT(600 AS max_output_tokens));
  

출력은 다음과 비슷합니다.

+------------------------------------------------+------------------------------------------------------------+
|            generated                           | prompt                                                     |
+------------------------------------------------+------------------------------------------------------------+
| These patents suggest several project ideas to | Propose some project ideas to improve user password        |
| improve user password security.  Here are      | security using the context below: patent title: Active     |
| some, categorized by the patent they build     | new password entry dialog with compact visual indication   |
| upon:                                          | of adherence to password policy, patent abstract:          |
|                                                | An active new password entry dialog provides a compact     |
| **I. Projects based on "Active new password    | visual indication of adherence to password policies. A     |
| entry dialog with compact visual indication of | visual indication of progress towards meeting all          |
| adherence to password policy":**               | applicable password policies is included in the display    |
|                                                | and updated as new password characters are being...        |
+------------------------------------------------+------------------------------------------------------------+

삭제

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

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

    리소스 관리로 이동

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

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

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

    BigQuery로 이동

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

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

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

  5. 왼쪽 창에서 연결 을 클릭합니다.

  6. __default_cloudresource_connection__ 연결에서 작업 열기 > 삭제 를 클릭합니다.

  7. 연결 삭제 대화상자에서 delete를 입력한 다음 삭제 를 클릭하여 확인합니다.

다음 단계