Resumir conteúdo

A função ai.summarize usa modelos de linguagem grandes (LLMs, na sigla em inglês), como o Gemini, para reformular e reorganizar o texto de entrada na forma mais essencial. Essa função captura a tese principal de um documento, preservando o tom e a nuance originais do autor. Usando essa função, é possível extrair descobertas e conclusões importantes de conjuntos de dados enormes sem revisão manual e controlar o comprimento da saída especificando restrições, como contagem de palavras ou limites de frases no comando. Também é possível usar o processamento em lote ou snapshots baseados em cursor para processar milhões de linhas de forma assíncrona.

A função de resumo de conteúdo do AlloyDB AI oferece suporte a vários casos de uso, incluindo, entre outros, os seguintes:

  • Transcrições de reuniões: resuma o texto conversacional para se concentrar nas decisões e nas ações necessárias.
  • Documentação técnica: condense metodologias, resultados e implicações complexas em visões gerais de alto nível.
  • Registros de suporte ao cliente: agregue várias avaliações de usuários ou tíquetes de suporte em um único resumo unificado de problemas comuns.

Antes de começar

Verifique se você atende aos requisitos a seguir antes de usar a função ai.summarize.

Ativar a extensão

Verifique se você tem a versão mais recente da extensão google_ml_integration.enable_preview_ai_functions (versão 1.5.7 ou mais recente) instalada com a funcionalidade de visualização ativada.

Para ativar a flag google_ml_integration.enable_preview_ai_functions no AlloyDB, use o comando SET. Essa flag controla o acesso a funções de IA de visualização, como ai.summarize.

  1. Verifique se a google_ml_integration extension é a versão 1.5.7 ou mais recente. Para verificar a versão, execute o seguinte:

    SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
    

    Se você precisar fazer upgrade para uma versão que inclua essas funções de visualização, chame o seguinte:

    CALL google_ml.upgrade_to_preview_version();
    
  2. Ative a flag para a sessão atual ou para todo o banco de dados. Para ativar a flag da sessão atual, execute o seguinte:

    SET google_ml_integration.enable_preview_ai_functions = 'on';
    

    Essa mudança não exige a reinicialização do banco de dados. O valor padrão dessa flag é off.

Criar uma tabela de exemplo

Para seguir os exemplos de função de resumo neste documento, crie uma tabela e preencha-a com as seguintes avaliações de filmes.

CREATE TABLE movie_reviews (
    id INT PRIMARY KEY,
    movie_id INT,
    review TEXT
);

INSERT INTO movie_reviews (id, movie_id, review) VALUES
(1, 1, 'The Midnight Echo represents a masterclass in atmospheric tension. The cinematography captures the isolation of the frozen tundra perfectly while the lead actor delivers a superb performance. Although the pacing slows down significantly in the second act, the final twist remains unexpected. This is a truly remarkable experience.'),
(2, 1, 'Neon Velocity delivers high octane action but lacks the narrative depth required to make the stakes feel real. The visual effects are undeniably stunning, creating a vibrant cyberpunk world that pops off the screen. However, the dialogue feels cliched and the secondary characters are thin. This film is a shallow blockbuster.'),

-- more rows are present in this table

Resumir uma única string

Para processar um único bloco de texto, use a versão escalar de ai.summarize.

SELECT ai.summarize(
  prompt => 'TEXT_CONTENT',
  model_id => 'MODEL_ID' -- Optional
);

Execute a seguinte consulta de exemplo para fornecer um resumo conciso das avaliações de filmes:

SELECT ai.summarize(review) FROM movie_reviews;

Confira abaixo um exemplo da saída:

 id |                         summary
----+-----------------------------------------------------------
  1 | "Atmospheric thriller with a haunting performance and shocking twist."
  2 | "Visually stunning cyberpunk action film lacks narrative depth."
...

Resumir em lotes

Para processar vários registros com eficiência, use a versão baseada em matriz.

SELECT ai.summarize(
  prompts => TEXT[],
  batch_size => INT, -- Optional. The default is 10.
  model_id => VARCHAR(100) -- Optional. The default value is gemini-2.5-flash-lite.
);

O exemplo a seguir mostra como usar a versão baseada em matriz da função ai.summarize para processar com eficiência vários registros de texto em uma única chamada.

WITH summarized_results AS (
SELECT
  ARRAY_AGG(id ORDER BY id) as ids,
  ai.summarize(
    prompts => array_agg( 'Please summarize this in max 10 words, review : ' || review
      ORDER BY id),
    batch_size => 15) as summaries
FROM movie_reviews
),
correlated_results AS (
    SELECT ids[i] as ID, summaries[i] as summary
    FROM summarized_results,
    generate_series(1, array_length(ids, 1)) AS i
)
SELECT movie_reviews.id, correlated_results.summary as summary
FROM movie_reviews
JOIN correlated_results ON movie_reviews.id = correlated_results.id
ORDER BY movie_reviews.id DESC ;

Confira abaixo um exemplo da saída:

 id | summary
---+----------------------------------------------------------------------------
  1 | "Masterclass in tension, haunting performance with a twist."
  2 | "High octane action, stunning visuals, shallow blockbuster."
  3 | "Gentle, moving exploration of  emotional honesty."

Resumir usando cursores

É possível usar cursores para processar com eficiência conjuntos de avaliações potencialmente grandes, alimentando-os em uma função de IA e processando os resultados um por um para armazená-los novamente no banco de dados.

O exemplo a seguir mostra como usar cursores com a função ai.summarize para processar com eficiência linhas da tabela movie_reviews, gerar um resumo para cada avaliação e armazenar esses resumos em uma nova tabela chamada review_summaries. Essa abordagem baseada em cursor é útil para processar conjuntos de dados grandes que podem ser muito grandes para serem processados em um único lote ou caber na memória de uma só vez.

O parâmetro input_cursor usa um REFCURSOR. Isso significa que você precisa fornecer um nome de cursor, que funciona como um ponteiro para os resultados de uma consulta SQL. A função ai.summarize busca dados desse cursor para usar como entrada para o resumo.

CREATE OR REPLACE FUNCTION ai.summarize(
  prompt TEXT,
  input_cursor REFCURSOR,
  batch_size INT DEFAULT NULL,
  model_id VARCHAR(100) DEFAULT NULL)
RETURNS REFCURSOR

O exemplo a seguir cria uma tabela review_summaries (se necessário) e, em seguida, itera pelas avaliações de filmes, gera um resumo conciso para cada uma usando uma função de IA e armazena os resumos vinculados aos IDs de avaliação originais na tabela.

-- Create a table to store the results
CREATE TABLE IF NOT EXISTS review_summaries (
    review_id INT, 
    summary_text TEXT
);

DO $$
DECLARE
    -- Use descriptive cursor and variable names
    review_cursor   REFCURSOR;
    result_record   RECORD;
    cursor_response  REFCURSOR;
    id_array        INT[];
    idx             INT := 1; 
BEGIN
    -- 1. Open cursor for the input text
    OPEN review_cursor FOR 
        SELECT review AS prompt FROM movie_reviews ORDER BY id;

    -- 2. Call the AI summarize function
    cursor_response := ai.summarize(
        prompt       => 'Please summarize the following review in max 10 words: ',
        input_cursor => review_cursor
    );

    -- 3. Map IDs into an array to maintain relational integrity during the loop
    SELECT ARRAY_AGG(id ORDER BY id) INTO id_array FROM movie_reviews;

    -- 4. Iterate through AI results and insert into the results table
    LOOP
        FETCH cursor_response INTO result_record;
        EXIT WHEN NOT FOUND;

        INSERT INTO review_summaries (review_id, summary_text)
        VALUES (id_array[idx], result_record.output);

        idx := idx + 1;
    END LOOP;

    -- 5. Clean up cursors
    CLOSE review_cursor;
    CLOSE cursor_response;
END;
$$;

-- Verify results
SELECT * FROM review_summaries;

Confira abaixo um exemplo da saída:

 review_id | summary_text
-----------+---------------------------------------------------------------------------
         1 | "Masterclass in atmospheric tension with haunting performance, devastating twist."
         2 | "High octane action, stunning visuals, but shallow blockbuster."
         3 | "Gentle, moving exploration of grief with poetic screenplay."

Resumo agregado em linhas

A função ai.agg_summarize opera em várias linhas de uma coluna. Ela agrega valores em um comando unificado para gerar um único resumo para todo o grupo.

A consulta SQL a seguir usa a função agregada ai.agg_summarize para gerar um resumo único e unificado para cada movie_id com base em todas as avaliações na tabela movie_reviews.

select ai.agg_summarize(review) from movie_reviews group by movie_id;

Ao contrário de ai.summarize, que resume cada linha individualmente, ai.agg_summarize combina o texto de várias linhas em uma única entrada para produzir um resumo consolidado para todo o grupo de linhas.

Confira abaixo um exemplo da saída:

agg_summarize
"The Midnight Echo is a masterclass in atmospheric tension, featuring haunting performances and stunning cinematography, though its pacing falters in the second act before a final twist. Neon Velocity offers stunning visual effects and high-octane action within a vibrant cyberpunk world, but suffers from shallow narrative depth, cliched dialogue, and underdeveloped characters. Garden of Whispers is a gentle, moving, and emotionally honest exploration of and life, characterized by poetic screenwriting and natural performances. Shadow Protocol ambitiously attempts to reinvent the spy thriller with a non-linear narrative and precise action, but ultimately confuses the audience and presents a derivative central mystery. The Last Alchemist uniquely blends historical drama with subtle fantasy, boasting meticulous production design and electric chemistry between its protagonists."

A seguir