SQL을 사용하여 ML 예측 생성

이 페이지에서는 Spanner 데이터베이스에서 머신러닝(ML) 예측을 생성하는 방법을 보여줍니다. ML 예측은 GoogleSQL 및 PostgreSQL 데이터베이스에서 모두 작동합니다.

Spanner Vertex AI 통합은 GoogleSQL용 ML.PREDICT 함수 또는 PostgreSQL용 spanner.ML_PREDICT_ROW 함수를 호출하여 예측을 생성하는 기능을 제공합니다. Spanner Vertex AI 통합에 대한 자세한 내용은 Spanner Vertex AI 통합 개요를 참조하세요.

시작하기 전에

Spanner 인스턴스에서 예측을 생성하려면 먼저 데이터베이스를 준비하고 모델을 선택해야 합니다.

Vertex AI 엔드포인트에 대한 Spanner Vertex AI 통합의 액세스 구성

Spanner는 Spanner가 첫 번째 MODEL DDL 문을 실행할 때 자동으로 서비스 에이전트를 만들고 필요한 권한을 부여합니다. Spanner 데이터베이스와 Vertex AI 엔드포인트가 모두 동일한 프로젝트에 있는 경우 추가 설정이 필요하지 않습니다.

Spanner 프로젝트에 Spanner 서비스 에이전트 계정이 없으면 다음 명령어를 실행하여 만듭니다.

gcloud beta services identity create --service=spanner.googleapis.com --project={PROJECT}`

단일 역할 부여에 설명된 단계에 따라 Vertex AI 프로젝트의 Spanner 서비스 에이전트 계정인 service-PROJECT_ID@gcp-sa-spanner.iam.gserviceaccount.comSpanner API Service Agent 역할을 부여합니다.

모델 선택

ML.PREDICT(GoogleSQL의 경우) 또는 spanner.ML_PREDICT_ROW(PostgreSQL의 경우) 함수를 사용할 때 ML 모델의 위치를 지정해야 합니다. 선택한 모델은 다음 중 하나일 수 있습니다.

Spanner Vertex AI 통합에 대한 자세한 내용은 Spanner Vertex AI 통합 작동 방식을 참조하세요.

예측 생성

선택한 모델의 유형에 따라 예측 생성 단계가 달라집니다.

Vertex AI Model Garden에서 모델 사용

Vertex AI Model Garden의 모델을 사용하여 예측을 생성하려면 Model Garden에서 모델을 선택합니다.

GoogleSQL

ML.PREDICT()와 함께 모델을 사용하려면 먼저 CREATE MODEL 문을 사용하여 모델을 등록해야 합니다.

CREATE MODEL 'MODEL_NAME'
INPUT (INPUT_COLUMN_NAME INPUT_COLUMN_TYPE)
OUTPUT (OUTPUT_COLUMN_NAME OUTPUT_COLUMN_TYPE)
REMOTE
OPTIONS (
  endpoint = '//aiplatform.googleapis.com/projects/PROJECT_ID/locations/LOCATION_ID/publishers/google/models/model_id'
);

다음을 바꿉니다.

  • MODEL_NAME: 모델에 지정할 이름

  • INPUT_COLUMN_NAME: 입력 열의 이름. 예를 들어 gemini-pro 모델을 사용하는 경우 입력 열 이름은 prompt입니다.

  • INPUT_COLUMN_TYPE: INPUT_COLUMN_NAME의 데이터 유형

  • OUTPUT_COLUMN_NAME: 출력 열의 이름. 예를 들어 gemini-pro 모델을 사용하는 경우 출력 열 이름은 content입니다.

  • OUTPUT_COLUMN_TYPE: OUTPUT_COLUMN_NAME의 데이터 유형

  • PROJECT_ID: Google Cloud 프로젝트의 ID

  • REGION_ID: 모델이 있는 Google Cloud 리전의 ID(예: us-central1)

  • MODEL_ID: 사용할 ML 모델의 ID(예: gemini-pro)

    모델에 대한 자세한 내용은 생성형 AI를 위한 모델 API 참조를 확인하세요.

Model Garden에서 선택한 모델과 함께 ML.PREDICT GoogleSQL 함수를 사용하여 예측을 생성합니다.

SELECT * FROM ML.PREDICT(
  MODEL `MODEL_NAME`,
  `INPUT_RELATION`[, `PARAMETERS`])

다음을 바꿉니다.

  • MODEL_NAME: 모델에 지정할 이름

    모델에 대한 자세한 내용은 생성형 AI를 위한 모델 API 참조를 확인하세요.

  • INPUT_RELATION: TABLE table_name 또는 ML 예측을 실행할 데이터를 제공하는 테이블 또는 서브 쿼리

  • PARAMETERS: model_id에서 지원하는 매개변수가 포함된 STRUCT

SAFE.ML.PREDICT를 사용하여 예측 오류 대신 null을 반환할 수도 있습니다. 이는 일부 실패한 예측이 허용되는 대규모 쿼리를 실행하는 경우에 유용합니다.

PostgreSQL

Model Garden에서 선택한 모델과 함께 ML_PREDICT_ROW PostgreSQL 함수를 사용하여 예측을 생성합니다.

SELECT spanner.ml_predict_row(
  'projects/PROJECT_ID/locations/REGION_ID/publishers/google/models/MODEL_ID'::text,
  '{
    "instances": [ INSTANCES ],
    "parameters": { PARAMETERS }
   }'::jsonb);

다음을 바꿉니다.

  • PROJECT_ID: Google Cloud 프로젝트의 ID

  • REGION_ID: 모델이 있는 Google Cloud 리전의 ID(예: us-central1)

  • MODEL_ID: 사용할 ML 모델의 ID(예: gemini-pro)

    모델에 대한 자세한 내용은 생성형 AI를 위한 모델 API 참조를 확인하세요.

  • INSTANCES: JSON 형식의 예측 호출의 입력

  • PARAMETERS: JSON 형식의 예측 호출의 매개변수(선택사항)

이 쿼리는 JSON 응답을 생성합니다. 모델의 JSON 응답 메시지에 대한 자세한 내용은 PredictResponse를 참조하세요.

Vertex AI 모델 엔드포인트 사용

Spanner Vertex AI 통합에서 학습되었거나 다운로드된 모델을 사용하려면 Vertex AI에 모델을 배포해야 합니다. Vertex AI의 엔드포인트에 모델을 배포하는 방법에 대한 자세한 내용은 엔드포인트에 모델 배포를 참조하세요.

GoogleSQL

Vertex AI 엔드포인트의 모델과 함께 ML.PREDICT GoogleSQL 함수를 사용하여 예측을 생성합니다. ML.PREDICT()와 함께 모델을 사용하려면 먼저 CREATE MODEL 문을 사용하여 모델을 등록해야 합니다. 배포된 각 모델에는 고유한 스키마가 있습니다. 다음은 분류 및 회귀 개요의 스키마 예시입니다.

CREATE MODEL MyClassificationModel
INPUT (
  length FLOAT64,
  material STRING(MAX),
  tag_array ARRAY<STRING(MAX)>
)
OUTPUT (
  scores ARRAY<FLOAT64>,
  classes ARRAY<STRING(MAX)>
)
REMOTE
OPTIONS (
  endpoint = '//aiplatform.googleapis.com/projects/PROJECT/locations/LOCATION/endpoints/ENDPOINT_ID'
)

다음을 바꿉니다.

  • PROJECT_ID: Google Cloud 프로젝트의 ID

  • LOCATION: 모델이 있는 Google Cloud 리전의 ID(예: us-central1)

  • ENDPOINT_ID: 사용할 ML 모델의 ID(예: gemini-pro)

    모델에 대한 자세한 내용은 생성형 AI를 위한 모델 API 참조를 확인하세요.

Model Garden에서 선택한 모델과 함께 ML.PREDICT GoogleSQL 함수를 사용하여 예측을 생성합니다.

SELECT * FROM ML.PREDICT(
  `MODEL_ID`,
  `INPUT_RELATION`[, `PARAMETERS`])

다음을 바꿉니다.

  • MODEL_ID: 사용할 ML 모델의 ID

  • INPUT_RELATION: ML 예측을 실행할 테이블 또는 서브 쿼리

  • PARAMETERS: model_name에서 지원하는 매개변수가 포함된 STRUCT

이 쿼리는 모델의 모든 출력 열과 입력 관계의 모든 열이 포함된 관계를 생성합니다.

PostgreSQL

Vertex AI 엔드포인트의 모델과 함께 ML.PREDICT PostgreSQL 함수를 사용하여 예측을 생성합니다.

  SELECT spanner.ml_predict_row(
    'projects/PROJECT_ID/locations/REGION_ID/endpoints/ENDPOINT_ID'::text,
    '{
      "instances": [ INSTANCES ],
      "parameters": { PARAMETERS }
      }'::jsonb);
  ```

Replace the following:
  • PROJECT_ID: 모델이 있는 Google Cloud 프로젝트의 ID

  • REGION_ID: 모델이 있는 Google Cloud 리전의 ID(예: us-central1)

  • ENDPOINT_ID: 모델 엔드포인트의 ID

  • INSTANCES: JSON 형식의 예측 호출의 입력

  • PARAMETERS: JSON 형식의 예측 호출의 매개변수(선택사항)

이 쿼리는 JSON 응답을 생성합니다. 모델의 JSON 응답 메시지에 대한 자세한 내용은 PredictResponse를 참조하세요.

ML 함수를 사용하여 예측을 생성하는 예시

다음 예시에서는 Model Garden의 gemini-pro 모델을 사용하여 인수로 제공되는 짧은 프롬프트를 기반으로 텍스트를 생성합니다. 이 모델은 Spanner에서 Gemini의 일부로 제공됩니다.

GoogleSQL

gemini-pro 모델 등록

CREATE MODEL GeminiPro
INPUT (prompt STRING(MAX))
OUTPUT (content STRING(MAX))
REMOTE
OPTIONS (
  endpoint = '//aiplatform.googleapis.com/projects/PROJECT/locations/LOCATION/publishers/google/models/gemini-pro',
  default_batch_size = 1
);

다음을 바꿉니다.

  • PROJECT: 프로젝트 ID
  • LOCATION: Vertex AI를 사용하는 리전

모델 실행

SELECT content
FROM ML.PREDICT(
  MODEL GeminiPro,
  (SELECT "Is 7 a prime number?" AS prompt),
  STRUCT(256 AS maxOutputTokens, 0.2 AS temperature, 40 as topK, 0.95 AS topP)
);

예상 출력

예상되는 결과는 다음과 같습니다.

+--------------------+
| content            |
+--------------------+
| "Yes"              |
+--------------------+

PostgreSQL

모델 실행

select spanner.ml_predict_row(
  '{
    "endpoint": "projects/PROJECT_ID/locations/us-central1/publishers/google/models/gemini-pro",
    "default_batch_size": 1
   }'::jsonb,
  '{
    "instances":[{"prompt": "Is 7 a prime number?"}],
    "parameters":{"maxOutputTokens":256, "topK": 40, "topP":0.96, "temperature":0.2}
    }'
);

예상 출력

예상되는 결과는 다음과 같습니다.

+--------------------+
| content            |
+--------------------+
| "Yes"              |
+--------------------+