Fazer consultas SQL inteligentes usando funções de IA

Nesta página, descrevemos como consultar usando operadores SQL com tecnologia de IA fornecidos por funções de IA. Você pode usar os operadores ai.if para filtros, ai.rank e ai.generate para combinar linguagem natural com consultas SQL.

Para usar as instruções desta página, você precisa entender o AlloyDB e conhecer os conceitos de IA generativa.

O AlloyDB AI reserva e cria o esquema ai.

Antes de começar

Antes de usar a linguagem natural em operadores SQL, faça o seguinte:

Integrar com a Vertex AI e instalar a extensão

  1. Configure o acesso do usuário aos modelos da Vertex AI.
  2. Verifique se a versão mais recente do google_ml_integration está instalada.
    1. Para verificar a versão instalada, execute o seguinte comando:

              SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
              extversion 
              ------------
              1.5.2
              (1 row)
            
    2. Se a extensão não estiver instalada ou se a versão instalada for anterior à 1.5.2, atualize a extensão.

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

      Se você tiver problemas ao executar os comandos anteriores ou se a extensão não for atualizada para a versão 1.5.2 depois de executar os comandos anteriores, entre em contato com o suporte doGoogle Cloud .

  3. Para usar a funcionalidade do mecanismo de consulta da IA do AlloyDB, defina a flag google_ml_integration.enable_ai_query_engine como true.

    SQL

    1. Ative o mecanismo de consulta de IA para a sessão atual.
                    SET google_ml_integration.enable_ai_query_engine = true;
                    
    2. Ativar recursos para um banco de dados específico em várias sessões.
                    ALTER DATABASE DATABASE_NAME SET google_ml_integration.enable_ai_query_engine = 'on';
                    
    3. Ative o mecanismo de consulta de IA para um usuário específico em sessões e bancos de dados.
                    ALTER ROLE postgres SET google_ml_integration.enable_ai_query_engine = 'on';
                  

    Console

    Para modificar o valor da flag google_ml_integration.enable_ai_query_engine, siga as etapas em Configurar flags de bancos de dados de uma instância.

    gcloud

    Para usar a gcloud CLI, você pode instalar e inicializar a CLI do Google Cloud ou usar o Cloud Shell.

    É possível modificar o valor da flag google_ml_integration.enable_ai_query_engine. Para mais informações, consulte Configurar flags de banco de dados de uma instância.

                 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
                

Usar um modelo do Gemini disponível na sua região

Se o cluster do AlloyDB para PostgreSQL estiver em uma região em que gemini-2.0-flash não é compatível, use um dos outros modelos do Gemini disponíveis na sua região com o model_id parameter.

Como alternativa, é possível registrar um endpoint de modelo do Gemini e fornecer esse ID de modelo aos operadores de IA. Para mais informações, consulte Registrar e chamar modelos de IA remotos usando o gerenciamento de endpoints de modelo.

O exemplo a seguir mostra como registrar outro endpoint do Gemini. Neste exemplo, o segundo endpoint do Gemini é o global para gemini-2.0-flash. É possível usar esse modelo registrado com operadores de IA transmitindo model_id =>gemini-2.0-flash-global` como um argumento adicional.

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'
);

Usar modelos do Gemini 3.0

Alguns modelos do Gemini, como o gemini-3.0-pro-preview, estão disponíveis apenas no endpoint global. Você precisa registrar esses modelos da seguinte forma:

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'
);

Substitua PROJECT_ID pelo ID do projeto em que o modelo da Vertex AI está disponível. A conta de serviço do AlloyDB precisa ter o papel de usuário da Vertex AI nesse projeto.

Depois de registrar o modelo, você pode usá-lo em funções de IA da seguinte maneira:

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

Usar filtros nas consultas

A IA do AlloyDB oferece várias funções de SQL com tecnologia de IA que permitem usar o processamento de linguagem natural e LLMs diretamente nas consultas do banco de dados, incluindo os operadores ai.if e ai.rank.

Filtros

Para avaliar se uma condição expressa em linguagem natural é atendida, use o operador ai.if/google_ml.if. A função retorna o valor booleano verdadeiro ou falso e false se a saída não for claramente detectada.

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

O exemplo a seguir mostra o uso do operador ai.if como um filtro para encontrar restaurantes com mais de 500 avaliações positivas localizados em cidades com uma população maior que 100.000. O exemplo usa restaurant_reviews e contém dados como avaliações e localização da cidade. O operador ai.if ajuda você a entender o sentimento da avaliação e combinar os locais do banco de dados com o conhecimento geral do Gemini sobre a população nesses locais.

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;

A seguir, mostramos o mesmo exemplo usando o modelo registrado em Usar um modelo do Gemini disponível na sua região.

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;

Fazer uma junção em uma consulta que usa o operador "if"

Para realizar uma operação de junção, use o operador ai.if/google_ml.if com a junção. A consulta de exemplo a seguir encontra o número de avaliações que mencionam cada item do cardápio do restaurante.

    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;

Resumo e geração de textos

A função ai.generate gera texto combinando os dados fornecidos com o comando do usuário.

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

Por exemplo, é possível usar a consulta a seguir para gerar um resumo conciso de cada avaliação do usuário.

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

Pontuar os resultados da consulta

Se você precisar classificar os resultados da consulta usando instruções personalizadas de linguagem natural, use o operador ai.rank. Com essa função, você pode fornecer um comando que descreve os critérios de classificação e retorna uma pontuação para cada item.

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

Por exemplo, a consulta a seguir recebe as 20 avaliações de restaurantes mais positivas, usando pontuações de um LLM.

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;

A seguir