대규모 테이블의 자동 벡터 임베딩 생성 및 관리

전체 테이블 열에 대한 벡터 임베딩을 생성하고 관리할 수 있으므로 대규모 벡터 임베딩 생성을 위한 확장 가능한 솔루션을 제공합니다. 이 솔루션은 다음을 비롯한 텍스트 콘텐츠에 대한 시맨틱 검색 및 검색 증강 생성 (RAG)을 지원하는 데 특히 유용합니다.

  • 새 테이블의 초기 벡터 임베딩 생성
  • 대량의 데이터를 가져온 후 임베딩 생성
  • 중요한 데이터 변경 후 임베딩 새로고침
  • 점진적으로 임베딩 유지

자동 벡터 임베딩 이해

AlloyDB의 자동 벡터 임베딩은 데이터의 벡터 임베딩 생성 및 유지보수를 자동화하는 확장 가능한 방법을 제공합니다. 새 텍스트나 업데이트된 텍스트마다 임베딩을 수동으로 생성하는 대신 자동 벡터 임베딩을 구성하여 이 프로세스를 처리할 수 있습니다. 이는 시맨틱 검색, 검색 증강 생성 (RAG), 기타 AI 기반 기능을 위해 최신 임베딩을 사용하는 애플리케이션에 특히 유용합니다.

자동 벡터 임베딩을 사용하면 다음 작업을 할 수 있습니다.

  • 전체 테이블의 임베딩 초기화: 단일 명령어로 테이블 열의 모든 기존 데이터에 대한 임베딩을 생성합니다.
  • 삽입 동기화: 소스 데이터가 변경되면 삽입을 자동으로 업데이트하여 AI 애플리케이션이 항상 최신 정보를 바탕으로 작동하도록 합니다.
  • 대규모 임베딩 생성: 수백만 개의 행이 있는 대규모 테이블의 임베딩을 효율적으로 생성합니다.
  • 각 임베딩 열에 대해 관리 함수를 호출하여 동일한 테이블에 있는 여러 열의 임베딩을 구성하고 관리합니다.

이 기능은 벡터 임베딩 생성 및 유지관리의 복잡성을 추상화하여 AI 애플리케이션의 개발 및 유지관리를 간소화합니다.

시작하기 전에

큰 테이블의 벡터 임베딩을 생성하고 관리하려면 다음을 수행하세요.

  • psql 또는 PostgreSQL용 AlloyDB Studio를 사용하여 postgres 사용자로 데이터베이스에 연결합니다.
  • google_ml_integration 확장 프로그램이 설치되어 있는지 확인합니다.
  • google_ml_integration.enable_model_support 플래그가 on으로 설정되어 있는지 확인합니다.
  • google_ml_integration 확장 프로그램이 버전 1.5.2 이상이고 google_ml_integration.enable_faster_embedding_generation 플래그가 on으로 설정되어 있는지 확인합니다.

    다음 명령어를 사용하여 확장 프로그램 버전을 확인합니다.

    SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
    

    확장 프로그램을 업데이트해야 하는 경우 ALTER EXTENSION google_ml_integration UPDATE; 명령어를 사용합니다.

  • AlloyDB 데이터베이스에서 임베딩을 생성하려면 먼저 AlloyDB에서 Vertex AI를 사용하도록 구성해야 합니다. 자세한 내용은 Vertex AI와 데이터베이스 통합을 참고하세요.

  • 자동 삽입 생성 관리 및 모니터링을 위해, 사용자에게는 기본적으로 google_ml.embed_gen_progressgoogle_ml.embed_gen_settings 테이블에 대한 Select 액세스 권한이 있습니다.

    사용자가 자동 삽입 생성을 관리하도록 하려면 google_ml.embed_gen_progressgoogle_ml.embed_gen_settings 테이블에 INSERT, UPDATE, DELETE 권한을 부여하세요.

    GRANT INSERT, UPDATE, DELETE ON google_ml.embed_gen_progress TO 'USER_NAME';
    

    다음을 바꿉니다.

    • USER_NAME: 권한이 부여된 사용자의 이름
  • 사용하는 PostgreSQL 클라이언트에서 AUTOCOMMITON로 설정되어 있는지 확인합니다.

  • 사용하는 임베딩 모델에 자동 벡터 임베딩을 위한 할당량이 충분한지 확인합니다. 할당량이 부족하면 자동 삽입 작업이 느려지거나 실패할 수 있습니다. 예를 들어 Vertex AI 임베딩 모델의 한도는 다음과 같습니다.

    • 텍스트 임베딩 한도: 각 요청에는 최대 250개의 입력 텍스트를 포함할 수 있으며, 각 입력 텍스트마다 1개의 임베딩이 생성됩니다. 요청당 최대 20,000개 토큰까지 허용됩니다. 각 입력 텍스트의 처음 2,048개 토큰만 임베딩을 계산하는 데 사용됩니다.
    • 분당 요청 수:

      • base_model : text-embedding : 1500
      • base_model : gemini-embedding : 100000
    • Gemini 임베딩 모델 토큰 한도: RPM 할당량에 의해 주로 제한되는 다른 임베딩 모델과 달리 Gemini 임베딩 모델 시리즈는 프로젝트당 분당 5,000,000개의 토큰으로 제한됩니다.

표의 임베딩 초기화

자동 벡터 삽입을 관리하는 함수는 ai 스키마에서 사용할 수 있습니다. 이 스키마는 AlloyDB의 최신 AI 기능을 위한 인터페이스를 제공합니다.

ai.initialize_embeddings() SQL 함수를 사용하여 테이블의 콘텐츠 열에 대한 임베딩을 생성합니다. 차단 호출입니다.

  • 함수가 성공을 반환하면 벡터 삽입 생성은 완료된 것입니다.
  • 이 함수는 모델 할당량 오류와 같은 일시적인 문제를 자동으로 복구하려고 시도합니다. 복구 시도가 실패한 경우에만 실패가 반환됩니다. 요청이 크기 제한을 초과하게 하는 잘못 구성된 batch_size와 같은 지속적인 문제의 경우 또는 작업을 수동으로 취소한 경우 호출을 수동으로 다시 실행해야 합니다.

이 함수는 Google 제공 모델(예: Vertex AI의 text-embedding-005)과 등록한 맞춤 모델을 지원합니다.

임베딩을 생성하기 전에 테이블에 content_embeddings 열을 만듭니다. 이 열에는 일반적으로 vector(DIMENSION) 유형과 DEFAULT NULL 값이 있습니다.

ALTER TABLE user_reviews ADD COLUMN IF NOT EXISTS content_embeddings vector(768) DEFAULT NULL;

일괄 생성 실행

기본적으로 AlloyDB는 일괄 처리를 사용하여 단일 요청으로 여러 텍스트 입력의 임베딩을 생성하므로 효율성이 향상됩니다. 특정 배치 크기를 제공하지 않으면 AlloyDB에서 자동으로 결정된 기본값을 적용합니다.

힌트 배치 크기

ai.initialize_embeddingsbatch_size 매개변수를 사용하면 직접 지원되는 모델에 대해 선호하는 배치 크기를 제안하여 AlloyDB의 쿼리 최적화 도구를 안내할 수 있습니다. AlloyDB는 모델 한도 또는 할당량에 따라 이 크기를 동적으로 줄일 수 있지만 힌트는 쿼리 실행 계획에 영향을 미칩니다.

CALL ai.initialize_embeddings(
    model_id => 'text-embedding-005',
    table_name => 'user_reviews',
    content_column => 'content',
    embedding_column => 'content_embeddings',
    batch_size => 50
);

일괄 지원이 포함된 맞춤 임베딩 모델 사용

일괄 처리를 지원하는 맞춤 모델 또는 외부 지원 모델을 사용하려면 일괄 변환 함수를 정의하고 모델을 만들 때 model_batch_in_transform_fnmodel_batch_out_transform_fn로 지정하세요. initialize_embeddings 호출에서 batch_size를 지정할 수도 있습니다. 일괄 처리를 지원하는 모델의 경우 성능 향상을 위해 batch_size을 1보다 큰 값으로 사용하는 것이 좋습니다.

  1. 맞춤 모델의 입력, 출력, 배치 변환 함수를 정의합니다.

    -- Scalar input transform functions
    CREATE OR REPLACE FUNCTION acme_text_input_transform(model_id TEXT, input TEXT) RETURNS JSON;
    CREATE OR REPLACE FUNCTION acme_text_output_transform(model_id TEXT, model_output JSON) RETURNS real[];
    CREATE OR REPLACE FUNCTION acme_generate_headers(model_id TEXT, input TEXT) RETURNS JSON;
    -- Batch input transform functions
    CREATE OR REPLACE FUNCTION acme_text_batch_input_transform(model_id TEXT, input TEXT[]) RETURNS JSON;
    CREATE OR REPLACE FUNCTION acme_text_batch_output_transform(model_id TEXT, model_output JSON) RETURNS real[][];
    
  2. 모델을 만들려면 일괄 변환 함수를 지정하세요.

    CALL
      ai.create_model(
        model_id => 'custom-embedding-model',
        model_request_url => 'https://acme.com/models/text/embeddings/v1',
        model_type => 'text_embedding',
        model_in_transform_fn => 'acme_text_input_transform',
        model_out_transform_fn => 'acme_text_output_transform',
        generate_headers_fn => 'acme_generate_headers',
        model_batch_in_transform_fn => 'acme_text_batch_input_transform',
        model_batch_out_transform_fn => 'acme_text_batch_output_transform'
      );
    
  3. 맞춤 모델로 벡터 임베딩을 생성합니다.

    CALL
      ai.initialize_embeddings(
        model_id => 'custom-embedding-model',
        table_name => 'user_reviews',
        content_column => 'content',
        embedding_column => 'content_embeddings',
        batch_size => 10
    );
    

일괄 처리를 기본적으로 지원하지 않는 맞춤 모델과 함께 자동 임베딩 기능을 사용할 수도 있습니다. 이렇게 하려면 배치 변환 함수 model_batch_in_transform_fnmodel_batch_out_transform_fn를 정의해야 합니다. 배치되지 않은 모델의 경우 입력 배열에서 한 번에 하나의 입력을 처리하도록 이러한 함수를 정의합니다. 이 모델에 대해 ai.initialize_embeddings를 호출할 때 batch_size1로 설정합니다.

증분 방식으로 임베딩 새로고침

삽입을 새로고침하면 입력 콘텐츠 열의 최신 값을 기반으로 재생성됩니다.

일관성과 성능을 제어할 수 있도록 AlloyDB는 증분 임베딩 새로고침을 위한 다양한 모드를 지원합니다. ai.initialize_embeddings()에서 incremental_refresh_mode enum 인수를 사용하여 모드를 선택할 수 있습니다. 가능한 모드는 다음과 같습니다.

  • transactional: 콘텐츠 열을 업데이트하는 트랜잭션의 일부로 임베딩이 새로고침됩니다. 이 프로세스는 콘텐츠 열이 업데이트될 때 데이터베이스 트리거와 유사한 메커니즘을 사용하여 삽입을 자동으로 생성하는 경우가 많으며, 오버헤드를 발생시키고 업데이트 작업을 느리게 할 수 있습니다. 도입된 오버헤드는 트랜잭션 의미 체계를 유지하고 삽입이 콘텐츠와 동기화되도록 하기 위한 절충안입니다. 이 모드는 모델의 스칼라 변환 함수를 사용하므로 모델을 만들 때 model_in_transform_fnmodel_out_transform_fn를 정의해야 합니다. transactional 모드를 사용하려면 테이블에 대한 소유자 역할이 있어야 합니다.

    CALL
      ai.initialize_embeddings(
        model_id => 'text-embedding-005',
        table_name => 'user_reviews',
        content_column => 'content',
        embedding_column => 'content_embeddings',
        batch_size => 10,
        incremental_refresh_mode => 'transactional'
    );
    
  • none: 기본 모드입니다. 이 모드에서는 AlloyDB가 임베딩을 자동으로 업데이트하지 않습니다. 증분 변경사항에 대한 추적이 없으므로 ai.refresh_embeddings() 함수를 호출하면 전체 표의 삽입이 재생성됩니다. 이 모드는 전체 제어 기능을 제공합니다.

테이블의 모든 임베딩 새로고침

테이블에 대해 ai.initialize_embeddings()를 성공적으로 실행한 후 ai.refresh_embeddings() 함수를 사용하여 임베딩을 재생성할 수 있습니다. 새로고침 작업을 사용하여 초기 initialize_embeddings 호출 중에 동시에 수정된 행의 삽입을 업데이트하거나 주기적인 전체 새로고침을 실행할 수 있습니다.

새로고침 함수는 초기 호출의 설정을 재사용하므로 테이블과 삽입 열만 지정하면 됩니다. 선택사항인 batch_size를 제공하여 기본값을 재정의할 수도 있습니다.

CALL ai.refresh_embeddings(
    table_name => 'user_reviews',
    embedding_column => 'content_embeddings',
    batch_size => 50  -- Optional override
);

벡터 임베딩 생성 중에 테이블 데이터 사용

ai.initialize_embeddings()는 실행되는 세션의 차단 호출이지만 다른 연결은 테이블과 계속 작동할 수 있습니다. 자동 벡터 삽입 프로세스는 표준 행 수준 잠금이 포함된 일괄처리로 행을 업데이트합니다. 즉, 삽입 프로세스에서 업데이트하는 동일한 행을 수정하려고 하면 UPDATE 또는 DELETE과 같은 동시 DML 작업이 잠시 차단됩니다. 다른 연결의 쿼리는 차단되지 않습니다. initialize_embeddings는 동시에 수정된 행을 건너뜁니다. incremental_refresh_modenone인 경우 이러한 수정된 행의 삽입은 후속 새로고침이 호출될 때까지 업데이트되지 않습니다.

-- connection1 (starts embedding generation)
SELECT
  ai.initialize_embeddings(
    model_id => 'text-embedding-005',
    table_name => 'user_reviews',
    content_column => 'content',
    embedding_column => 'content_embeddings'
  );

-- connection2 (performs DMLs/queries without blocking)
INSERT INTO user_reviews(id, review_time, is_edited, content)
VALUES (48290, now(), false, 'I really liked the product functionality, but wish it came in orange color');

UPDATE user_reviews
SET is_edited = TRUE, content = 'Changing to 5 star. My issue is resolved by the support'
WHERE id = 700;

pg_cancel를 사용하여 initialize_embeddings를 취소하거나 내부 오류로 인해 initialize_embeddings가 실패하면 실패 상태가 반환됩니다. 성공적으로 생성된 벡터 삽입은 롤백되지 않습니다. 실패를 복구하고 벡터 삽입 생성을 완료하려면 먼저 ai.drop_embedding_config() 함수를 사용하여 구성을 정리한 다음 ai.initialize_embeddings() 호출을 다시 실행해야 합니다.

동시에 수정된 행의 삽입을 새로고침하려면 ai.initialize_embeddings 호출이 완료된 후 ai.refresh_embeddings를 호출합니다. 이 새로고침 호출은 전체 테이블의 삽입을 재생성합니다.

자동 벡터 임베딩 설정 삭제

특정 테이블과 임베딩 열 조합의 자동 벡터 임베딩 구성을 삭제해야 하는 경우 ai.drop_embedding_config() 함수를 사용합니다. 이 함수는 정리하거나 열의 임베딩 관리를 재구성할 때 유용할 수 있습니다.

CALL
  ai.drop_embedding_config(
    table_name => 'user_reviews',
    embedding_column => 'content_embeddings');

자동차에서 임베딩을 생성하는 예

이 섹션에서는 등록된 모델 엔드포인트를 사용하여 자동 모드에서 임베딩을 생성하는 예를 제공합니다.

OpenAI 임베딩 모델

OpenAI에서 제공하는 등록된 text-embedding-3-small 모델 엔드포인트를 사용하여 임베딩을 생성하려면 다음 문을 실행합니다.

CALL ai.initialize_embeddings(
    model_id => 'text-embedding-3-small',
    table_name => 'user_reviews',
    chunk_column => 'content',
    embedding_column => 'content_embeddings'
);

맞춤 임베딩 모델

자체 모델 또는 외부 지원 모델의 경우 입력 및 출력 변환 함수를 정의하고 ai.create_model에 등록해야 합니다. 자동 삽입 기능을 사용하려면 스칼라 변환 함수(예: acme_text_input_transform, acme_text_output_transform)와 일괄 변환 함수(예: acme_text_batch_input_transform, acme_text_batch_output_transform)를 모두 지정해야 합니다.

다음 단계