자율 임베딩 생성

으로 문의하세요.

이 문서에서는 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')
      # Alternatively, you can use the syntax for a built-in model.
      # AI.EMBED(description, model => 'embeddinggemma-300m')
    ) 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');

시작하기 전에

테이블에서 자율 임베딩 생성을 사용 설정하려면 필요한 권한과 연결이 있어야 하며 프로젝트에 Vertex AI API를 사용 설정해야 합니다.

필요한 역할

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

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

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

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

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

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

자동으로 생성된 임베딩 열 만들기

새 테이블 내에서 자동으로 생성된 임베딩 열을 만들거나 기존 테이블에 추가할 수 있습니다.

자동으로 생성된 임베딩 열이 있는 테이블 만들기

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

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 |
          model => MODEL
        })
    )
    STORED OPTIONS (asynchronous = TRUE)
);

다음을 바꿉니다.

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

    MODEL 매개변수를 지정하면 데이터가 BigQuery에 유지되고 슬롯이 임베딩을 만드는 데 사용됩니다. 데이터가 Vertex AI로 전송되지 않으며 Vertex AI에서 요금이 발생하지 않습니다.

기존 테이블에 자동으로 생성된 임베딩 열 추가

`ALTER TABLE ADD COLUMN statement`를 사용하여 기존 테이블에 자동으로 생성된 임베딩 열을 추가할 수도 있습니다.

ALTER TABLE DATASET_ID.TABLE
  ADD COLUMN 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)
;

테이블이 생성되거나 변경된 직후 또는 소스 열에서 데이터를 업데이트한 후에 백그라운드 임베딩 생성 작업이 시작됩니다.

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

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')
      # Alternatively, you can use the syntax for a built-in model.
      # AI.EMBED(description, model => 'embeddinggemma-300m')
    ) 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 함수 호출이 표시됩니다.

문제 해결

생성된 임베딩 열에는 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;

비용 추적

자율 임베딩 생성 비용은 다음과 같은 카테고리로 분류됩니다.

BigQuery 백그라운드 DML 비용

생성된 임베딩은 백그라운드 DML 작업을 사용하여 테이블에 기록됩니다. 기본적으로 BigQuery는 주문형 슬롯을 사용하여 이러한 작업을 처리합니다. 테이블의 프로젝트는 DML 주문형 결제 모델에 따라 청구됩니다.

또는 예측 가능하고 일관된 성능을 보장하기 위해 예약을 만들고 job_type을(를) BACKGROUND(으)로 설정할 수 있습니다. 백그라운드 예약이 있으면 BigQuery는 이를 사용하여 백그라운드 DML 작업을 실행합니다. 백그라운드 예약은 백그라운드 DML 작업의 슬롯 시간 사용량에 대해 청구됩니다.

Vertex AI 비용

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

  1. Cloud Billing에서 결제 보고서를 봅니다.
  2. 필터를 사용하여 결과를 구체화합니다.

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

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

    키를 bigquery_ml_job으로 설정하고 값을 임베딩 작업의 작업 ID로 설정합니다. 모든 백그라운드 임베딩 작업에는 gc_ 프리픽스가 붙습니다.

일부 요금이 Cloud Billing에 표시되는 데 최대 24시간이 걸릴 수 있습니다.

제한사항

  • 각 테이블은 자동으로 생성된 임베딩 열을 최대 하나 지원합니다.
  • 동시 DML 작업으로 인해 임베딩 생성이 지연되고 일시적으로 실패할 수 있습니다. 성능을 개선하고 비용을 절감하려면 데이터를 일괄 처리하고 DML 업데이트를 자주 실행하지 않는 것이 좋습니다.
  • BigQuery Storage Write API를 사용하여 데이터를 수집하는 경우 임베딩 생성이 시작되기 전에 약간의 지연이 있을 수 있습니다.
  • 콘솔, Google Cloud `bq show` 명령어 또는 ddl `ddl` 필드를 사용하여 테이블의 스키마를 볼 때 열이 자동으로 생성된다는 표시가 없습니다.bq showINFORMATION_SCHEMA.TABLES
  • 생성된 임베딩 열이 있는 테이블의 복사본, 클론 또는 스냅샷을 만들면 데이터만 복사됩니다. 생성 구성은 새 테이블에 적용되지 않으며 새 테이블의 소스 열을 업데이트해도 새 임베딩이 생성되지 않습니다.
  • 스냅샷에서 자율 임베딩 생성이 사용 설정된 테이블을 복원하면 임베딩 생성 구성이 복원되지 않습니다.
  • SQL을 사용해서만 생성된 임베딩 열을 만들 수 있습니다. bq mk 또는 bq update 명령어를 사용하여 생성된 임베딩 열을 만들 수 없습니다.
  • 생성된 열의 소스 열은 STRING 열이어야 합니다.
  • 생성된 임베딩 열을 만든 후에는 다음과 같은 제한사항이 적용됩니다.

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

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

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

  • `VECTOR_SEARCH` 또는 `AI.SEARCH`와 같은 검색 함수를 호출하면 기본 테이블에 임베딩이 없는 행이 검색 중에 건너뜁니다.VECTOR_SEARCHAI.SEARCH

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

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

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

다음 단계