Vertex AI 텍스트 임베딩 가져오기

텍스트 임베딩은 텍스트 데이터의 벡터 표현이며 다양한 방식으로 비슷한 항목을 찾는 데 사용됩니다. Google 검색을 완료하거나 온라인 쇼핑을 하며 추천 항목을 확인할 때마다 상호작용합니다. 텍스트 임베딩을 만들면 자연어 텍스트의 벡터 표현을 부동 소수점 숫자 배열로 얻을 수 있습니다. 즉, 모든 입력 텍스트에 숫자 표현이 할당됩니다. 두 텍스트의 벡터 표현 간 숫자 거리를 비교하여 애플리케이션이 텍스트 또는 텍스트로 표시된 객체 간의 유사성을 확인할 수 있습니다.

Vertex AI 텍스트 임베딩 API를 사용하면 생성형 AI로 텍스트 임베딩을 만들 수 있습니다. 이 튜토리얼에서는 Spanner와 Vertex AI 임베딩 모델(예: textembedding-gecko 모델)에 저장된 데이터에 텍스트 임베딩을 생성할 수 있습니다.

임베딩에 대해 자세히 알아보려면 텍스트 임베딩 가져오기를 참고하세요.

목표

이 튜토리얼에서는 다음을 수행하는 방법을 알아봅니다.

  • DDL 문을 사용하여 Spanner 스키마에 Vertex AI textembedding-gecko 모델을 등록합니다.
  • SQL 쿼리를 사용하여 등록된 모델을 참조하여 Spanner에 저장된 데이터에서 임베딩을 생성합니다.

비용

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

  • Spanner
  • Vertex AI

Spanner 비용에 대한 자세한 내용은 Spanner 가격 책정 페이지를 참조하세요.

Vertex AI 비용에 대한 자세한 내용은 Vertex AI 가격 책정 페이지를 참조하세요.

텍스트 임베딩 생성 및 저장

사용하는 모델에 따라 임베딩을 생성하는 데 시간이 걸릴 수 있습니다. 보다 성능에 민감한 워크로드의 경우에는 읽기-쓰기 트랜잭션에서 임베딩을 생성하지 않는 것이 좋습니다. 대신 다음 SQL 예시를 사용해서 읽기 전용 트랜잭션에서 임베딩을 생성합니다.

GoogleSQL

Spanner에 텍스트 임베딩 모델 등록

GoogleSQL에서는 ML.PREDICT 함수와 함께 사용하기 전에 모델을 등록해야 합니다. Spanner 데이터베이스에 textembedding-gecko 모델을 등록하려면 다음 DDL 실행합니다.

CREATE MODEL MODEL_NAME
INPUT(content STRING(MAX))
OUTPUT(
  embeddings
    STRUCT<
      statistics STRUCT<truncated BOOL, token_count FLOAT64>,
      values ARRAY<FLOAT64>>
)
REMOTE OPTIONS (
  endpoint = '//aiplatform.googleapis.com/projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION'
);

다음을 바꿉니다.

  • MODEL_NAME: 임베딩 모델의 이름입니다.
  • PROJECT: Vertex AI 엔드포인트를 호스팅하는 프로젝트
  • LOCATION: Vertex AI 엔드포인트 위치
  • MODEL_VERSION: textembedding-gecko 임베딩 모델의 버전

Spanner는 적절한 권한을 자동으로 부여합니다. 그렇지 않을 경우 모델 엔드포인트 액세스 제어를 검토하세요.

생성형 AI 모델에서는 스키마 검색 및 검증을 사용할 수 없습니다. 모델 스키마와 일치하는 INPUTOUTPUT 절을 제공해야 합니다. Gecko 모델의 전체 스키마는 텍스트 임베딩 가져오기를 참조하세요.

텍스트 임베딩 생성

임베딩을 생성하려면 다음 SQL을 사용해서 ML.PREDICT 함수에 직접 텍스트 일부를 전달합니다.

SELECT embeddings.values
FROM ML.PREDICT(
  MODEL MODEL_NAME,
  (SELECT "A product description" as content)
);

테이블에 저장된 데이터에 대해 임베딩을 생성하려면 다음 SQL을 사용합니다.

SELECT id, embeddings.values
FROM ML.PREDICT(
  MODEL MODEL_NAME,
  (SELECT id, description as content FROM Products)
);

텍스트 임베딩 저장

읽기 전용 트랜잭션에서 임베딩을 생성한 후 운영 데이터로 관리할 수 있도록 Spanner에 저장합니다. 임베딩을 저장하려면 읽기-쓰기 트랜잭션을 사용합니다.

성능에 덜 민감한 워크로드의 경우 읽기-쓰기 트랜잭션에서 다음 SQL로 임베딩을 생성하고 삽입할 수 있습니다.

CREATE TABLE Products(
  id INT64 NOT NULL,
  description STRING(MAX),
  embeddings ARRAY<FLOAT32>,
) PRIMARY KEY(id);
INSERT INTO Products (id, description, embeddings)
SELECT @Id, @Description, embeddings.values
FROM ML.PREDICT(
  MODEL MODEL_NAME,
  (SELECT @Description as content)
);

PostgreSQL

텍스트 임베딩 생성

임베딩을 생성하려면 다음 SQL을 사용해서 spanner.ML_PREDICT_ROW 함수에 직접 텍스트 일부를 전달합니다.

SELECT
  spanner.ML_PREDICT_ROW(
    'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
    '{"instances": [{"content": "A product description"}]}'::jsonb
  ) ->'predictions'->0->'embeddings'->'values';

다음을 바꿉니다.

  • PROJECT: Vertex AI 엔드포인트를 호스팅하는 프로젝트
  • LOCATION: Vertex AI 엔드포인트 위치
  • MODEL_VERSION: textembedding-gecko 임베딩 모델의 버전

테이블에 저장된 데이터에 대해 임베딩을 생성하려면 다음 SQL을 사용합니다.

SELECT id, spanner.ML_PREDICT_ROW(
    'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
    JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', description))))
  ) -> `predictions`->0->`embeddings`->`values``
FROM Products;

다음을 바꿉니다.

  • PROJECT: Vertex AI 엔드포인트를 호스팅하는 프로젝트
  • LOCATION: Vertex AI 엔드포인트 위치
  • MODEL_VERSION: textembedding-gecko 임베딩 모델의 버전

텍스트 임베딩 저장

읽기 전용 트랜잭션에서 임베딩을 생성한 후 운영 데이터로 관리할 수 있도록 Spanner에 저장합니다. 임베딩을 저장하려면 읽기-쓰기 트랜잭션을 사용합니다.

성능에 덜 민감한 워크로드의 경우 읽기-쓰기 트랜잭션에서 다음 SQL로 임베딩을 생성하고 삽입할 수 있습니다.

CREATE TABLE Products (
  id INT8 NOT NULL,
  description TEXT,
  embeddings REAL[],
  PRIMARY KEY(id)
);
INSERT INTO Products (id, description, embeddings)
SELECT @Id, @Description, spanner.FLOAT32_ARRAY(spanner.ML_PREDICT_ROW(
    'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
    JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', @Description)))
  ) -> 'predictions'->0->'embeddings'->'values'
));

다음을 바꿉니다.

  • PROJECT: Vertex AI 엔드포인트를 호스팅하는 프로젝트
  • LOCATION: Vertex AI 엔드포인트 위치
  • MODEL_VERSION: textembedding-gecko 임베딩 모델의 버전

텍스트 임베딩 업데이트

임베딩을 업데이트하거나 실시간으로 데이터를 수집하려면 UPDATE(GoogleSQLPostgreSQL) 문을 사용합니다.

이전 예시의 Products 테이블을 업데이트하려면 다음 SQL을 사용합니다.

GoogleSQL

UPDATE Products
SET
  description = @description,
  embeddings = (SELECT embeddings.values
                  FROM ML.PREDICT(MODEL MODEL_NAME, (SELECT @description as content))
              )
WHERE id = @id;

다음을 바꿉니다.

  • MODEL_NAME: 임베딩 모델의 이름

PostgreSQL

UPDATE
  Products
SET
  description = $1,
  embeddings = spanner.FLOAT32_ARRAY(
    spanner.ML_PREDICT_ROW(
      'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
      JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', $1)))
    ) -> 'predictions'->0->'embeddings'->'values')
WHERE
  id = $2;

다음을 바꿉니다.

  • PROJECT: Vertex AI 엔드포인트를 호스팅하는 프로젝트
  • LOCATION: Vertex AI 엔드포인트 위치
  • MODEL_VERSION: textembedding-gecko 임베딩 모델의 버전

다음 단계