모델 정제로 AI 함수 비용 최적화
이 문서에서는 BigQuery에서 관리형 AI 함수에 최적화된 모드를 사용하는 방법을 설명합니다. 최적화 모드를 사용하면 표준 행별 LLM 추론에 비해 대규모 언어 모델 (LLM) 토큰 소비와 쿼리 지연 시간이 크게 줄어든 수천 개 또는 수십억 개의 행이 포함된 대규모 데이터 세트를 처리할 수 있습니다. 이 최적화는 AI.IF 및 AI.CLASSIFY 함수에만 적용됩니다.
쿼리의 토큰 효율성을 최적화하는 대신 예산 초과를 방지하기 위해 총 토큰 소비량에 한도를 설정하려면 토큰 할당량으로 비용 제어를 참조하세요.
토큰 사용량을 더 잘 이해하려면Google Cloud 콘솔에서 쿼리에 사용된 토큰 수를 확인하면 됩니다. 쿼리를 실행하기 전에 이 사용량을 추정하려면 AI.COUNT_TOKENS 함수를 사용합니다.
다음 예시에서는 최적화 모드에서 AI.IF 함수를 사용하여 text-embedding-005를 임베딩 모델로 사용하여 자연재해에 관한 뉴스 기사를 식별하는 방법을 보여줍니다.
SELECT
title,
body,
AI.IF(
('The following news story is about a natural disaster: ', body),
embeddings => AI.EMBED(body, endpoint => 'text-embedding-005', task_type => 'CLASSIFICATION').result,
-- Optional, 'MINIMIZE_COST' is the default when embeddings are provided.
optimization_mode => 'MINIMIZE_COST'
) AS is_natural_disaster
FROM
`bigquery-public-data.bbc_news.fulltext`;
optimization_mode => 'MINIMIZE_COST' 인수는 최적화 모드를 사용 설정합니다. 임베딩이 제공될 때의 기본 설정이므로 이 인수를 생략할 수 있습니다.
이 예시에서는 임베딩이 즉시 생성됩니다. 실제로는 재사용할 수 있도록 임베딩을 구체화하는 것이 좋습니다.
최적화 모드 작동 방식
관리형 AI 함수인 AI.IF 및 AI.CLASSIFY는 일반적으로 데이터 세트의 모든 행에 대해 원격 LLM을 호출합니다. 최적화 모드를 사용하면 BigQuery가 쿼리 실행 중에 가볍고 정제된 모델을 자동으로 학습시킵니다.
프로세스는 다음과 같습니다.

- 샘플링 및 라벨 지정: BigQuery는 데이터의 작은 대표 샘플을 선택하고 Gemini를 호출하여 라벨을 제공합니다.
- 정제된 모델 학습: LLM 라벨과 데이터 임베딩을 특성으로 사용하여 로컬 정제 모델이 적시에 학습됩니다.
- 품질 검사: BigQuery는 LLM 결과와 비교하여 정제된 모델의 정확성을 평가합니다. 기본적으로 정제된 모델이 필수 품질 기준을 충족하지 못하면 모델이 삭제된 이유를 설명하는 오류와 함께 쿼리가 실패합니다. 모델의 품질이 허용 가능한 수준인 경우에도 BigQuery는 일관된 품질을 유지하기 위해 특정 행에 대해 원격 LLM으로 대체하거나 유효한 임베딩이 없는 행에 대해 원격 LLM으로 대체할 수 있습니다.
- 추론: 정제된 모델이 대부분의 행을 처리하므로 Gemini 호출 수가 크게 줄어듭니다.
제한사항
최적화 모드에는 다음과 같은 제한사항이 있습니다.
- 최소 행 수: 모델 학습에 충분한 데이터를 확보하려면 AI 함수에 대한 입력에 약 3,000개의 행이 포함되어야 합니다.
- 데이터 유형: 여러 열을 참조하는 프롬프트의 경우 문자열 열만 최적화에 지원됩니다.
- 다중 라벨 분류:
output_mode => 'multi'가 있는AI.CLASSIFY는 최적화 모드에서 지원되지 않습니다. - 함수 지원:
AI.IF및AI.CLASSIFY함수만 최적화 모드를 지원합니다. 하지만AI.CLASSIFY에서 최적화 모드를 사용할 때 정제된 모델 품질이 충분하지 않으면 쿼리가 실패할 수 있습니다. - 오류 비율:
max_error_ratio인수는 최적화 모드에서 지원되지 않습니다.
시작하기 전에
BigQuery에서 관리형 AI 함수를 실행하는 데 필요한 권한을 얻으려면 Gemini Enterprise Agent Platform LLM을 호출하는 생성형 AI 함수에 대한 권한 설정을 참조하세요.
임베딩 모델 선택
최적화 모드를 사용하려면 데이터의 임베딩을 계산하여 AI 함수에 제공해야 합니다. 입력 열에 연결된 임베딩이 있으려면 모든 행에 일관된 임베딩 차원이 있어야 하며 동일한 임베딩 모델에서 생성되어야 합니다.
최적의 비용 품질과 확장성을 위해 영어 또는 다국어 태스크에 text-embedding-005 또는 Gemini 임베딩과 같은 임베딩 모델을 사용하여 데이터의 임베딩을 컴퓨팅하는 것이 좋습니다. 멀티모달 데이터 (텍스트 및 이미지)의 경우 Gemini Embedding 2 (gemini-embedding-2)와 같은 멀티모달 임베딩 모델을 사용하는 것이 좋습니다.
임베딩 생성
BigQuery에서 관리하는 자율 생성을 사용하거나 임베딩 열을 수동으로 만들어 데이터의 임베딩을 계산할 수 있습니다.
다음 섹션에서는 AI.CLASSIFY 및 AI.IF 함수를 사용하여 두 가지 접근 방식을 모두 사용하는 방법을 설명합니다.
자율 임베딩 생성
자율 임베딩 생성을 사용하는 경우 BigQuery는 AI.IF 또는 AI.CLASSIFY가 호출될 때 임베딩을 자동으로 사용합니다. 이 방법은 권장되는 접근 방식이지만 테이블당 임베딩 열이 하나로 제한됩니다.
다음 예시에서는 text-embedding-005를 임베딩 모델로 사용하여 자동으로 생성된 임베딩 열이 있는 테이블을 만든 후 AI.CLASSIFY 함수를 사용하여 데이터를 분류합니다.
-- Create a table with an autonomously generated embedding column
CREATE TABLE my_dataset.bbc_news (
title STRING,
body STRING,
body_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
GENERATED ALWAYS AS (
AI.EMBED(
body,
connection_id => '<my_connection_id>',
task_type => 'CLASSIFICATION',
endpoint => 'text-embedding-005')
) STORED
OPTIONS(asynchronous = TRUE)
);
-- Insert data into the table
INSERT INTO my_dataset.bbc_news (title, body)
SELECT title, body FROM `bigquery-public-data.bbc_news.fulltext`;
-- Run the optimized query.
-- Wait for the background job to finish generating embeddings before running.
SELECT
title,
body,
AI.CLASSIFY(
body,
categories => ['tech', 'sport', 'business', 'other']
) AS category
FROM
my_dataset.bbc_news;
수동 열 사양
기존 임베딩 열이 있는 경우 AI.IF 또는 AI.CLASSIFY의 embeddings 인수에 지정합니다. AI.EMBED 함수를 사용하여 이를 생성할 수 있습니다.
다음 예시에서는 text-embedding-005를 임베딩 모델로 사용하여 임베딩 열이 있는 테이블을 만든 후 AI.CLASSIFY 쿼리에서 해당 열을 사용하는 방법을 보여줍니다.
-- Create a table with an embedding column
CREATE TABLE my_dataset.bbc_news AS
SELECT
title,
body,
AI.EMBED(
body,
endpoint => 'text-embedding-005',
task_type => 'CLASSIFICATION'
).result AS body_embedding
FROM
`bigquery-public-data.bbc_news.fulltext`;
-- Run the optimized query
SELECT
title,
body,
AI.CLASSIFY(
body,
categories => ['tech', 'sport', 'business', 'other'],
embeddings => body_embedding,
) AS category
FROM
my_dataset.bbc_news;
프롬프트가 여러 열을 참조하는 경우 embeddings 인수에 열 이름 목록과 해당 임베딩을 제공합니다. 예를 들면 embeddings => [('body', body_embedding), ('title', title_embedding)]입니다.
쿼리 최적화 모니터링
쿼리 실행 중에 최적화된 행 수를 확인하려면 Google Cloud 콘솔에서 또는 API를 통해 실행 통계를 확인하면 됩니다.
콘솔
최적화된 행 수와 최적화 상태에 대한 시스템 메시지를 보려면 다음을 수행합니다.
Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.
탐색 메뉴에서 작업 탐색기를 클릭합니다.
작업 ID를 클릭하여 작업 세부정보 창을 봅니다.
작업 정보 탭을 클릭하고 생성형 AI 함수 최적화 필드에서 측정항목과 상태를 확인합니다.

API
작업 메타데이터의 GenAIFunctionStats 객체에서 FunctionGenAiCostOptimizationStats를 확인합니다. 이 객체에는 최적화된 워크플로를 통해 추론된 행 수와 최적화 상태에 대한 유용한 정보를 제공하는 시스템 생성 메시지가 포함됩니다.
문제 해결
다음 섹션에서는 최적화 모드 사용 시 발생하는 일반적인 문제를 진단하고 해결하는 방법을 설명합니다.
데이터 크기가 너무 작음
문제: 모델 학습을 위한 데이터가 부족합니다. Fail to apply cost optimizations because the number of rows to process is too
small. 오류 메시지가 표시될 수 있습니다.
해결 방법: 입력 크기를 오류 메시지에 표시된 행 수 이상으로 늘리고 모든 행에 유효한 임베딩이 올바르게 생성되었는지 확인합니다.
일부 클래스에 샘플이 거의 없거나 없음
문제: 샘플링 단계에서 특정 카테고리 또는 케이스의 샘플 수가 부족하여 모델 학습이 불가능합니다.
AI.CLASSIFY함수의 경우Failed to apply cost optimizations because the random training sample did not contain enough examples of all categories.오류 메시지가 표시될 수 있습니다.AI.IF함수의 경우Failed to apply cost optimizations because the random training sample did not include enough examples of both true/false cases.오류 메시지가 표시될 수 있습니다.
해결책:
AI.CLASSIFY:AI.CLASSIFY함수 호출에서 드물거나 비어 있는 카테고리를 삭제합니다.- 드문 카테고리를 더 광범위한 카테고리로 그룹화하여 샘플 크기를 늘립니다.
OTHER카테고리를 사용하여 더 구체적인 카테고리에 포함되지 않는 항목을 그룹화할 수 있습니다. 하지만 카테고리 목록이 이미 완성된 경우OTHER를 추가하지 마세요. 이 용어는 모호하여 혼동을 일으킬 수 있습니다.
AI.IF:true및false케이스가 모두 입력 행에 잘 표시되도록 프롬프트의 필터 조건을 업데이트합니다. 거의 모든 행 또는 거의 없는 행과 일치하는 조건으로 인해 이 오류가 발생할 수 있습니다.
임베딩의 차원이 일관되지 않음
문제: 행 간 임베딩 차원이 일관되지 않습니다. Failed to apply cost optimizations because the
embeddings have inconsistent dimensions. 오류 메시지가 표시될 수 있습니다.
해결 방법: 모든 임베딩이 동일한 모델에서 생성되고 임베딩 벡터 길이가 동일한지 확인합니다. 다음과 유사한 SQL 쿼리를 사용하여 열의 임베딩 길이가 동일한지 확인할 수 있습니다.
SELECT ARRAY_LENGTH(body_embedding.result), COUNT(*)
FROM `PROJECT_ID.DATASET.TABLE_NAME`
GROUP BY 1;
프롬프트 복잡성이 너무 높음
문제: 정제된 모델이 높은 정확도 기준을 달성할 수 없습니다. 다음 오류 메시지 중 하나가 표시될 수 있습니다.
Fail to apply cost optimizations because the distilled model does not approximate LLM behavior well enough for some categories.Fail to apply cost optimization because the prompt complexity is too high.
해결책:
오류 메시지에 F1 점수가 낮은 카테고리가 나열되면 먼저 해당 카테고리에 집중합니다. 다른 카테고리와 명확하게 구분되도록 이름과 설명을 수정합니다.
파티션을 형성하는 카테고리 집합을 사용합니다. 카테고리가 최소한으로 겹치고 가능한 모든 입력을 포함하는지 확인합니다.
- 입력이 동시에 여러 카테고리에 속할 수 있는 중복 카테고리를 피합니다. 예를 들어
['terrible', 'bad', 'okay', 'good', 'excellent']와 같은 카테고리는 피하세요. - 카테고리가 적용되지 않는 공백이 없도록 합니다. 예를 들어 카테고리 목록
['bad', 'average']는 칭찬을 표현하는 리뷰를 포함하지 않습니다. 카테고리 간의 모호성을 해결하도록 LLM을 안내하는 카테고리 설명을 제공합니다. 예를 들면 다음과 같습니다.
AI.CLASSIFY( review, categories => [ ('terrible', 'Review where customer was not happy and the message indicates they will never try this product again'), ('bad', 'Review where customer was not happy but suggested improvements to the product'), ('okay', 'Review where customer was neutral about the product. Short reviews qualify for this category'), ('good', 'Review where customers were happy using this product but had minor critiques'), ('excellent', 'Review where customers were very happy using this product and will recommend others to try it too')], embeddings => review_embeddings)
- 입력이 동시에 여러 카테고리에 속할 수 있는 중복 카테고리를 피합니다. 예를 들어
text-embedding-005또는gemini-embedding-2와 같은 고급 임베딩 모델을 사용해 보세요.추가 디버깅 지원이 필요하면 bqml-feedback@google.com에 문의하세요.
LLM에서 처리한 행 수가 예상과 다름
문제: 쿼리 실행 통계에 따르면 정제된 모델 대신 원격 LLM에서 예상보다 많은 행이 처리되었습니다. 이는 다음과 같은 이유 때문일 수 있습니다.
- 정제된 모델이 학습되었지만 일부 행에 누락된 임베딩이 있습니다. 이러한 행은 원격 LLM에서 처리됩니다.
- 정제된 모델을 각 행에 적용할 수 없었으며 일관된 품질을 유지하기 위해 원격 LLM으로 대체해야 했습니다.
해결책: 데이터의 모든 행에 대해 임베딩이 올바르게 생성되고 유효한지 확인합니다. 문제가 지속되면 bqml-feedback@google.com에 문의하여 디버깅을 요청하세요.
자율 임베딩 열이 감지되지 않음
문제: BigQuery에서 자율 임베딩 열을 감지할 수 없습니다. 스크립트에서 임시 테이블을 사용하고 원본 테이블에 대한 참조가 손실된 경우에 발생할 수 있습니다.
해결 방법: embeddings 매개변수를 사용하여 자율 임베딩 열(예: embeddings => content_embedding.result)을 명시적으로 전달하여 비용 최적화를 트리거합니다.
다음 단계
- BigQuery의 생성형 AI에 대해 자세히 알아보세요.
- BigQuery에서 일일 할당량으로 생성형 AI 비용을 관리하는 방법을 자세히 알아보세요.
AI.IF함수 문서를 참조하세요.AI.CLASSIFY함수 문서를 참조하세요.