자율 임베딩 생성

이 문서에서는 데이터에 자율 임베딩 생성을 사용하여 BigQuery가 소스 열을 기반으로 테이블의 임베딩 열을 유지하도록 하는 방법을 설명합니다. 소스 열에서 데이터를 추가하거나 수정하면 BigQuery는 Vertex AI 임베딩 모델을 사용하여 해당 데이터의 임베딩 열을 자동으로 생성하거나 업데이트합니다. 소스 데이터가 정기적으로 업데이트될 때 BigQuery에서 삽입을 유지하도록 하려는 경우에 유용합니다.

임베딩은 검색 증강 생성 (RAG)과 같은 최신 생성형 AI 애플리케이션에 유용하지만 생성, 관리, 쿼리가 복잡할 수 있습니다. 자율 임베딩 생성을 사용하여 유사성 검색 및 기타 생성형 AI 애플리케이션에 사용할 임베딩을 생성, 유지, 쿼리하는 프로세스를 간소화할 수 있습니다.

예를 들어 다음과 유사한 쿼리를 사용하여 자율 임베딩 생성 기능이 사용 설정된 테이블을 만들고, 데이터를 삽입한 다음, 시맨틱 검색을 실행할 수 있습니다.

CREATE TABLE mydataset.products (
  name STRING,
  description STRING,
  description_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
    GENERATED ALWAYS AS (
      AI.EMBED(description, connection_id => 'us.example_connection',
        endpoint => 'text-embedding-005'))
    STORED OPTIONS( asynchronous = TRUE ));

# Values in the description_embedding column are automatically generated.
INSERT INTO mydataset.products (name, description) VALUES
  ("Super slingers"), ("An exciting board game for the whole family"), ...;

SELECT * FROM AI.SEARCH(TABLE mydataset.products, 'description', "A really fun toy");

시작하기 전에

테이블에서 자율 삽입 생성을 사용 설정하려면 필요한 권한과 연결이 있어야 합니다.

필요한 역할

자체 포함 생성 기능을 사용 설정하는 데 필요한 권한을 얻으려면 관리자에게 다음 IAM 역할을 부여해 달라고 요청하세요.

  • 연결 리소스를 사용하려면 다음을 충족해야 합니다. 연결에 대한 BigQuery 연결 사용자 (roles/bigquery.connectionUser)
  • 테이블을 만들려면 테이블에 대한 BigQuery 데이터 편집자 (roles/bigquery.dataEditor)가 필요합니다.
  • Vertex AI 엔드포인트에 호스팅된 모델에 액세스할 수 있도록 연결의 서비스 계정에 다음 역할을 부여합니다. Vertex AI 사용자 (roles/aiplatform.user) 연결이 있는 프로젝트

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

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

연결 만들기 및 서비스 계정에 권한 부여

표에서 자율 임베딩 생성을 사용 설정하려면 Cloud 리소스 연결을 만들어야 합니다. 그런 다음 연결을 만들 때 생성된 서비스 계정에 Vertex AI 사용자 역할(roles/aiplatform.user)을 부여합니다.

자율 임베딩 생성을 사용하여 테이블 만들기

자율 임베딩 생성을 사용하여 CREATE TABLE에서 AI.EMBED 함수를 사용하여 임베딩을 생성할 수 있습니다.

CREATE TABLE DATASET_ID.TABLE (
  [COLUMN, ...]
  STRING_COL STRING,
  EMBEDDING_COL_NAME STRUCT<result ARRAY<FLOAT64>, status STRING>
    GENERATED ALWAYS AS (
      AI.EMBED(
        STRING_COL,
        connection_id => CONNECTION_ID,
        endpoint => ENDPOINT)
    )
    STORED OPTIONS (asynchronous = TRUE)
);

다음을 바꿉니다.

  • DATASET_ID: 테이블을 만들 데이터 세트의 이름입니다.
  • TABLE: 자율 임베딩 생성을 만들 테이블의 이름입니다.
  • COLUMN, ...: 자동 삽입할 열 외에 테이블에 포함해야 하는 열입니다.
  • STRING_COL: 자동으로 삽입할 STRING 열의 이름입니다.
  • EMBEDDING_COL_NAME: 자동으로 생성된 임베딩 열의 이름입니다.
  • CONNECTION_ID: 사용할 연결의 이름이 포함된 STRING 값입니다(예: my_project.us.example_connection). 테이블을 만드는 프로젝트에서 연결의 서비스 계정에 Vertex AI 사용자 역할을 부여해야 합니다.
  • ENDPOINT: 텍스트 임베딩 모델에 사용할 지원되는 Vertex AI 텍스트 임베딩 모델 엔드포인트를 지정하는 STRING 값입니다. 지정하는 엔드포인트 값에는 모델 버전(예: text-embedding-005)이 포함되어야 합니다. URL 대신 모델 이름을 지정하면 BigQuery ML이 모델을 자동으로 식별하고 모델의 전체 엔드포인트를 사용합니다.

백그라운드 삽입 생성 작업은 테이블이 생성된 직후 또는 소스 열의 데이터를 업데이트한 후에 시작됩니다.

임베딩 생성 진행 상황을 추적하려면 다음과 유사한 쿼리를 사용하면 됩니다.

SELECT
  COUNT(*) AS total_num_rows,
  COUNTIF(description_embedding IS NOT NULL
          AND description_embedding.status = '') AS total_num_generated_embeddings
FROM
  PROJECT_ID.DATASET_ID.TABLE;

임베딩으로 테이블을 만든 후 자동으로 생성된 임베딩이 포함된 STRUCT 열에 벡터 색인을 만들 수 있습니다.

다양한 제품을 판매하는 대형 소매업체라고 가정해 보겠습니다. 제품 이름과 설명이 포함된 표가 있으며 고객이 찾고 있는 제품을 찾을 수 있도록 지원하고 싶습니다. 다음 쿼리는 제품 설명의 시맨틱 검색을 지원하기 위해 자율 임베딩 생성을 설정하는 방법을 보여줍니다.

먼저 데이터 세트를 만듭니다.

CREATE SCHEMA mydataset;

다음으로 자동 임베딩 생성이 사용 설정된 테이블을 만들어 제품 정보를 저장합니다. 자동으로 생성된 열의 이름은 description_embedding이며 description 열을 기반으로 합니다.

# Create a table of products and descriptions with a generated embedding column.
CREATE TABLE mydataset.products (
  name STRING,
  description STRING,
  description_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
    GENERATED ALWAYS AS (AI.EMBED(
      description,
      connection_id => 'us.example_connection',
      endpoint => 'text-embedding-005'
    ))
    STORED OPTIONS( asynchronous = TRUE )
);

다음 쿼리는 일부 제품 이름과 설명을 테이블에 삽입합니다. description_embedding 값은 자동으로 생성되므로 지정하지 않습니다.

# Insert product descriptions into the table.
# The description_embedding column is automatically updated.
INSERT INTO mydataset.products (name, description) VALUES
  ("Lounger chair", "A comfortable chair for relaxing in."),
  ("Super slingers", "An exciting board game for the whole family."),
  ("Encyclopedia set", "A collection of informational books.");

선택적으로 테이블에 벡터 색인을 만들어 검색 속도를 높일 수 있습니다. 벡터 색인에는 3개 이상의 행이 필요하므로 다음 쿼리에서는 추가 데이터를 삽입했다고 가정합니다. 데이터를 삽입할 때마다 description_embedding 열이 자동으로 업데이트됩니다.

CREATE VECTOR INDEX my_index
ON mydataset.products(description_embedding)
OPTIONS(index_type = 'IVF');

마지막으로 AI.SEARCH 함수를 사용하여 제품에서 재미있는 장난감을 시맨틱 검색할 수 있습니다.

# Search for products that are fun to play with.
SELECT base.name, base.description, distance
FROM AI.SEARCH(TABLE mydataset.products, 'description', "A really fun toy");

/*------------------+----------------------------------------------+----------------------+
 | name             | description                                  | distance             |
 +------------------+----------------------------------------------+----------------------+
 | Super slingers   | An exciting board game for the whole family. | 0.80954913893618929  |
 | Lounger chair    | A comfortable chair for relaxing in.         | 0.938933930620146    |
 | Encyclopedia set | A collection of informational books.         | 1.1119297739353384   |
 +------------------+----------------------------------------------+----------------------*/

자동으로 생성된 삽입 열에 대한 정보 가져오기

열이 자동 생성된 삽입 열인지 확인하려면 INFORMATION_SCHEMA.COLUMNS를 쿼리합니다.

다음 쿼리는 자동으로 생성된 모든 삽입 열에 관한 정보를 보여줍니다.

SELECT *
FROM PROJECT_ID.DATASET_ID.INFORMATION_SCHEMA.COLUMNS
WHERE is_generated = 'ALWAYS';

generation_expression 필드에는 열에서 임베딩을 생성하는 데 사용되는 AI.EMBED 함수 호출이 표시됩니다.

자체 예약 사용

기본적으로 BigQuery는 주문형 슬롯을 사용하여 생성된 삽입 열을 유지하는 데 필요한 처리를 처리합니다. 예측 가능하고 일관된 성능을 보장하기 위해 선택적으로 예약을 만들고 job_typeBACKGROUND로 설정할 수 있습니다. 백그라운드 예약이 있으면 BigQuery는 이를 사용하여 생성된 삽입 열을 유지합니다.

문제 해결

생성된 삽입 열에는 resultstatus이라는 두 필드가 포함됩니다. BigQuery가 테이블의 특정 행에 대한 삽입을 생성하려고 할 때 오류가 발생하면 result 필드는 NULL이고 status 필드는 오류를 설명합니다. 예를 들어 소스 열이 NULL이면 result 삽입도 NULL이고 상태는 NULL value is not supported for embedding generation입니다.

더 심각한 오류가 발생하면 임베딩 생성이 중단될 수 있습니다. 이 경우 백그라운드 작업에 대해 INFORMATION_SCHEMA.JOBS를 쿼리하고 error_result 필드의 정보를 확인할 수 있습니다. 백그라운드 삽입 작업의 작업 ID에는 gc_가 접두사로 붙습니다. 예를 들어 다음 쿼리는 오류 결과가 NULL이 아닌 모든 백그라운드 작업을 추출합니다.

SELECT * FROM `region-REGION.INFORMATION_SCHEMA.JOBS` j
WHERE EXISTS (
  SELECT 1
  FROM unnest(j.referenced_tables) t
  WHERE
    j.project_id = 'PROJECT_ID'
    AND t.dataset_id = 'DATASET_ID'
    AND t.table_id = 'TABLE'
)
AND starts_with(job_id, 'gc')
AND error_result IS NOT NULL
ORDER BY j.creation_time DESC;

비용 추적

자율 임베딩 생성은 Vertex AI에 요청을 전송하며, 이로 인해 비용이 발생할 수 있습니다. 백그라운드 삽입 작업으로 발생한 Vertex AI 비용을 추적하려면 다음 단계를 따르세요.

  1. Cloud Billing에서 결제 보고서를 확인합니다.
  2. 필터를 사용하여 결과를 상세검색합니다.

    서비스에서 Vertex AI를 선택합니다.

  3. 특정 작업의 요금을 확인하려면 라벨로 필터링합니다.

    키를 bigquery_ml_job로 설정하고 값을 삽입 작업의 작업 ID로 설정합니다. 백그라운드 삽입 작업에는 모두 gc_ 접두사가 있습니다.

일부 청구 항목이 Cloud Billing에 표시되는 데 최대 24시간이 걸릴 수 있습니다.

제한사항

  • 각 테이블은 자동으로 생성된 삽입 열을 최대 하나 지원합니다.
  • Google Cloud 콘솔, bq show 명령어 또는 INFORMATION_SCHEMA.TABLES 뷰의 ddl 필드를 사용하여 테이블의 스키마를 볼 때 열이 자동으로 생성된다는 표시가 없습니다.
  • ALTER TABLE ADD COLUMN를 사용하여 기존 테이블에 생성된 삽입 열을 추가할 수는 없습니다.
  • 생성된 삽입 열이 있는 테이블의 복사본, 클론 또는 스냅샷을 만들면 데이터만 복사됩니다. 생성 구성은 새 테이블에 적용되지 않으며 새 테이블의 소스 열을 업데이트해도 새로운 삽입이 생성되지 않습니다.
  • 자율 임베딩 생성이 사용 설정된 테이블을 스냅샷에서 복원하면 임베딩 생성 구성이 복원되지 않습니다.
  • SQL을 사용해서만 생성된 삽입 열을 만들 수 있습니다. bq mk 또는 bq update 명령어를 사용하여 생성된 삽입 열을 만들 수 없습니다.
  • 생성된 열의 소스 열은 STRING 열이어야 합니다.
  • 생성된 삽입 열을 만든 후에는 다음 제한사항이 적용됩니다.

    • 소스 열은 삭제하거나 이름을 바꿀 수 없지만 생성된 삽입 열은 삭제하거나 이름을 바꿀 수 있습니다. 삽입 열을 삭제하면 소스 열을 삭제하거나 이름을 바꿀 수 있습니다.
    • 소스 열 또는 생성된 삽입 열의 데이터 유형은 변경할 수 없습니다.
  • 자동으로 생성된 임베딩 열의 기본값을 지정할 수 없습니다.

  • 다음 메서드를 사용하여 생성된 임베딩 열에 직접 쓸 수는 없습니다.

    • DML
    • 스트리밍 쓰기
    • bq insert
    • bq copy -a
  • 생성된 임베딩 열이 있는 테이블은 정책 태그와 같은 열 수준 보안 정책을 지원하지 않습니다.

  • VECTOR_SEARCH 또는 AI.SEARCH과 같은 검색 함수를 호출하면 기본 테이블에서 임베딩이 누락된 행은 검색 중에 건너뜁니다.

  • 자율 임베딩 생성이 사용 설정된 테이블에는 파티션을 나눈 벡터 색인을 만들 수 없습니다.

  • 자동으로 생성된 임베딩 열에 벡터 색인을 만들면 행의 80% 이상에서 임베딩이 생성된 후에 색인 학습이 시작됩니다. 다음 쿼리를 사용하여 테이블의 임베딩 중 생성된 임베딩의 비율을 확인할 수 있습니다.

    SELECT
      COUNTIF(description_embedding IS NOT NULL
      AND description_embedding.status = '') * 100.0 / COUNT(*) AS percent
    FROM PROJECT_ID.DATASET_ID.TABLE;
    

다음 단계