Fazer consultas SQL inteligentes usando o mecanismo de consultas da IA do AlloyDB

Nesta página, descrevemos como consultar usando operadores SQL com tecnologia de IA fornecidos pelo mecanismo de consulta da AlloyDB AI. 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. Integrar com a 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.4.3
              (1 row)
            
    2. Se a extensão não estiver instalada ou se a versão instalada for anterior à 1.4.3, atualize a extensão executando os seguintes comandos:

              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.4.3 depois de executar os comandos anteriores, entre em contato com o suporte do AlloyDB.

    3. Depois de verificar se a versão está atualizada, instale a funcionalidade de prévia executando o procedimento upgrade_to_preview_version:

              CALL google_ml.upgrade_to_preview_version();
              SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
              extversion
              ------------
              1.4.4
              (1 row)
            

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 usando 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 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 de banco de dados, incluindo os operadores ai.if e ai.rank.

Filtros

Para avaliar se uma condição declarada 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 detectada claramente.

- 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 dessas regiões.

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 que você registrou em Usar um modelo do Gemini compatí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 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