AI 함수를 사용하여 지능형 SQL 쿼리 실행

이 페이지에서는 AI 함수에서 제공하는 AI 기반 SQL 연산자를 사용하여 쿼리하는 방법을 설명합니다. 필터, ai.rank, ai.generate 연산자에 ai.if를 사용하여 자연어를 SQL 쿼리와 결합할 수 있습니다.

이 페이지의 안내를 사용하려면 AlloyDB를 이해하고 생성형 AI 개념에 익숙해야 합니다.

AlloyDB AI는 ai 스키마를 예약하고 만듭니다.

시작하기 전에

SQL 연산자에서 자연어를 사용하기 전에 다음을 수행하세요.

Vertex AI와 통합 및 확장 프로그램 설치

  1. Vertex AI 모델에 대한 사용자 액세스 권한을 구성합니다.
  2. 최신 버전의 google_ml_integration이 설치되어 있는지 확인합니다.
    1. 설치된 버전을 확인하려면 다음 명령어를 실행합니다.

              SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
              extversion 
              ------------
              1.5.2
              (1 row)
            
    2. 확장 프로그램이 설치되지 않았거나 설치된 버전이 1.5.2 이전이면 확장 프로그램을 업데이트합니다.

              CREATE EXTENSION IF NOT EXISTS google_ml_integration;
              ALTER EXTENSION google_ml_integration UPDATE;
            

      위 명령어를 실행할 때 문제가 발생하거나 위 명령어를 실행한 후에도 확장 프로그램이 1.5.2 버전으로 업데이트되지 않으면 Google Cloud 지원팀에 문의하세요.

  3. AlloyDB AI 쿼리 엔진 기능을 사용하려면 google_ml_integration.enable_ai_query_engine 플래그를 true로 설정합니다.

    SQL

    1. 현재 세션에 AI 쿼리 엔진을 사용 설정합니다.
                    SET google_ml_integration.enable_ai_query_engine = true;
                    
    2. 세션 간에 특정 데이터베이스 기능을 사용 설정합니다.
                    ALTER DATABASE DATABASE_NAME SET google_ml_integration.enable_ai_query_engine = 'on';
                    
    3. 세션과 데이터베이스 전반에서 특정 사용자에 AI 쿼리 엔진을 사용 설정합니다.
                    ALTER ROLE postgres SET google_ml_integration.enable_ai_query_engine = 'on';
                  

    콘솔

    google_ml_integration.enable_ai_query_engine 플래그 값을 수정하려면 인스턴스의 데이터베이스 플래그 구성의 단계를 수행합니다.

    gcloud

    gcloud CLI를 사용하려면 Google Cloud CLI를 설치 및 초기화하거나 Cloud Shell을 사용합니다.

    google_ml_integration.enable_ai_query_engine 플래그 값을 수정할 수 있습니다. 자세한 내용은 인스턴스의 데이터베이스 플래그 구성을 참조하세요.

                 gcloud alloydb instances update INSTANCE_ID \
                   --database-flags google_ml_integration.enable_ai_query_engine=on \
                   --region=REGION_ID \
                   --cluster=CLUSTER_ID \
                   --project=PROJECT_ID
                

거주 지역에서 지원되는 Gemini 모델 사용

PostgreSQL용 AlloyDB 클러스터가 gemini-2.0-flash가 지원되지 않는 리전에 있는 경우 model_id parameter를 사용하여 해당 리전에서 사용할 수 있는 다른 Gemini 모델 중 하나를 사용할 수 있습니다.

또는 Gemini 모델 엔드포인트를 등록하고 해당 모델 ID를 AI 연산자에 제공할 수 있습니다. 자세한 내용은 모델 엔드포인트 관리를 사용하여 원격 AI 모델 등록 및 호출을 참고하세요.

다음 예에서는 다른 Gemini 엔드포인트를 등록하는 방법을 보여줍니다. 이 예에서 두 번째 Gemini 엔드포인트는 gemini-2.0-flash의 전역 엔드포인트입니다. model_id =>gemini-2.0-flash-global` 을 추가 인수로 전달하여 AI 연산자와 함께 이 등록된 모델을 사용할 수 있습니다.

CALL
  google_ml.create_model(
    model_id => 'gemini-2.0-flash-global',
    model_type => 'llm',
    model_provider => 'google',
    model_qualified_name => 'gemini-2.0-flash',
    model_request_url =>  'https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-2.0-flash:generateContent',
    model_auth_type => 'alloydb_service_agent_iam'
);

Gemini 3.0 모델 사용하기

gemini-3.0-pro-preview와 같은 일부 Gemini 모델은 글로벌 엔드포인트를 통해서만 사용할 수 있습니다. 이러한 모델은 다음과 같이 등록해야 합니다.

CALL
  google_ml.create_model(
    model_id => 'gemini-3-preview-model',
    model_request_url => 'https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-3-pro-preview:generateContent',
    model_qualified_name => 'gemini-3-pro-preview',
    model_provider => 'google',
    model_type => 'llm',
    model_auth_type => 'alloydb_service_agent_iam'
);

PROJECT_ID를 Vertex AI 모델을 사용할 수 있는 프로젝트의 ID로 바꿉니다. AlloyDB 서비스 계정에는 해당 프로젝트의 Vertex AI 사용자 역할이 있어야 합니다.

모델을 등록한 후에는 다음과 같이 AI 함수에서 사용할 수 있습니다.

SELECT ai.generate(prompt => 'What is AlloyDB?', model_id => 'gemini-3-preview-model');

쿼리에서 필터 사용하기

AlloyDB AI는 ai.ifai.rank 연산자를 비롯하여 데이터베이스 쿼리 내에서 직접 자연어 처리 및 LLM을 사용할 수 있는 여러 AI 기반 SQL 함수를 제공합니다.

필터

자연어로 명시된 조건이 충족되는지 평가하려면 ai.if/google_ml.if 연산자를 사용하세요. 이 함수는 불리언 true 또는 false 값을 반환하며, 출력이 명확하게 감지되지 않으면 false를 반환합니다.

- Function signature
FUNCTION ai.if(prompt TEXT, model_id VARCHAR(100) DEFAULT NULL) RETURNS bool

다음 예시는 ai.if 연산자를 필터로 사용하여 긍정적 리뷰가 500개를 초과하고 인구가 100,000명을 초과하는 도시에 있는 레스토랑을 찾는 방법을 보여줍니다. 이 예에서는 restaurant_reviews을 사용하며 리뷰, 도시 위치와 같은 데이터를 포함합니다. ai.if 연산자를 사용하면 리뷰 감정을 이해하고 데이터베이스의 위치를 해당 위치의 인구에 관한 Gemini 일반 지식과 결합할 수 있습니다.

SELECT r.name, r.location_city
FROM restaurant_reviews r
WHERE
  AI.IF(r.location_city || ' has a population OF more than 100,000 AND the following is a positive review; Review: ' || r.review)
GROUP BY r.name, r.location_city
HAVING COUNT(*) > 500;

다음은 내 지역에서 지원되는 Gemini 모델 사용에 등록한 모델을 사용하여 동일한 예를 보여줍니다.

SELECT r.name, r.location_city
FROM restaurant_reviews r
WHERE
  AI.IF(r.location_city || ' has a population of more than 100,000 AND the following is a positive review; Review: ' || r.review, model_id => 'gemini-2.0-flash-global')
GROUP BY r.name, r.location_city
HAVING COUNT(*) > 500;

if 연산자를 사용하는 쿼리에서 조인 실행

조인 작업을 실행하려면 조인과 함께 ai.if/google_ml.if 연산자를 사용하세요. 다음 샘플 쿼리는 레스토랑 메뉴에서 각 메뉴 항목을 언급하는 리뷰 수를 찾습니다.

    SELECT item_name, COUNT(*)
    FROM menu_items JOIN user_reviews
      ON ai.if(
        prompt => 'Does the following user review talk about the menu item mentioned ? review: ' || user_reviews.review_text || ' menu item: ' || item_name)
    GROUP BY item_name;

텍스트 생성 및 요약

ai.generate 함수는 제공된 데이터와 사용자의 프롬프트를 결합하여 텍스트를 생성합니다.

-- Function Signature
FUNCTION ai.generate(prompt TEXT, model_id VARCHAR(100) DEFAULT NULL) RETURNS TEXT

예를 들어 다음 쿼리를 사용하여 각 사용자 리뷰의 간결한 요약을 생성할 수 있습니다.

SELECT
  ai.generate(
    prompt => 'Summarize the review in 20 words or less. Review: ' || review) AS review_summary
FROM user_reviews

쿼리 결과 점수 매기기

맞춤 자연어 요청 사항을 사용하여 쿼리 결과를 정렬해야 하는 경우 ai.rank 연산자를 사용하세요. 이 함수를 사용하면 순위 지정 기준을 설명하는 프롬프트를 제공하고 각 항목의 점수를 반환할 수 있습니다.

-- Function signature
FUNCTION ai.rank(prompt TEXT, model_id VARCHAR(100) DEFAULT NULL) RETURNS real

예를 들어 다음 쿼리는 LLM의 점수를 사용하여 가장 긍정적인 레스토랑 리뷰 상위 20개를 가져옵니다.

SELECT review AS top20
FROM user_reviews
ORDER BY ai.rank(
  'Score the following review according to these rules:
  (1) Score OF 8 to 10 IF the review says the food IS excellent.
  (2) 4 to 7 IF the review says the food is ok.
  (3) 1 to 3 IF the review says the food is not good. Here is the review:' || review) DESC
LIMIT 20;

다음 단계