The ai.summarize function utilizes large language models (LLMs) like Gemini to rephrase
and reorganize input text into its most essential form. This function
captures the core thesis of a document while preserving the original authorial
tone and nuance. Using this function, you can extract key findings and
conclusions from massive datasets without manual review, and control output
length by specifying constraints like word counts or sentence limits in the
prompt. You can also use batch processing or cursor-based snapshots to process
millions of rows asynchronously.
The AlloyDB AI content summarization function supports various use cases, including but not limited to the following:
- Meeting transcripts: summarize conversational text to focus on decisions and action items.
- Technical documentation: condense complex methodology, results, and implications into high-level overviews.
- Customer support logs: aggregate multiple user reviews or support tickets into a single unified summary of common issues.
Before you begin
Make sure that you meet the following requirements before you use the ai.summarize
function.
Enable the extension
Make sure that you have the latest version of the
google_ml_integration.enable_preview_ai_functions extension (version 1.5.7 or
higher) installed with Preview functionality enabled.
To enable the google_ml_integration.enable_preview_ai_functions flag in AlloyDB,
you use the SET command. This flag controls access to preview AI functions like
ai.summarize.
Make sure that your
google_ml_integration extensionis version 1.5.7 or higher. You can check the version by running the following:SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';If you need to upgrade to a version that includes these preview functions, call the following:
CALL google_ml.upgrade_to_preview_version();Enable the flag for the current session or for the entire database. To enable the flag for your current session, execute the following:
SET google_ml_integration.enable_preview_ai_functions = 'on';This change doesn't require a database restart. The default value of this flag is
off.
Create an example table
To follow the summarization function examples in this document, create a table and populate it with the following movie reviews.
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
Summarize a single string
To process a single block of text, use the scalar version of ai.summarize.
SELECT ai.summarize(
prompt => 'TEXT_CONTENT',
model_id => 'MODEL_ID' -- Optional
);
Run the following example query to provide a concise summary of movie reviews:
SELECT ai.summarize(review) FROM movie_reviews;
The following is the example output:
id | summary
----+-----------------------------------------------------------
1 | "Atmospheric thriller with a haunting performance and shocking twist."
2 | "Visually stunning cyberpunk action film lacks narrative depth."
...
Summarize in batches
To process multiple records efficiently, use the array-based version.
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.
);
The following example shows how to use the array-based version of the
ai.summarize function to efficiently process multiple text records in a single
call.
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 ;
The following is the example output:
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."
Summarize using cursors
You can use cursors to efficiently handle potentially large sets of reviews, feeding them into an AI function and then processing the results one by one to store them back in the database.
The following example shows how to use cursors with the ai.summarize function
to efficiently process rows from the movie_reviews table, generate a summary
for each review, and store these summaries in a new table called review_summaries.
This cursor-based approach is useful for handling large datasets that might be
too large to process in a single batch or fit into memory all at once.
The input_cursor parameter takes a REFCURSOR. This means you need to provide
a cursor name, which acts like a pointer to the results of a SQL query. The
ai.summarize function then fetches data from this cursor to use as input for
the summarization.
CREATE OR REPLACE FUNCTION ai.summarize(
prompt TEXT,
input_cursor REFCURSOR,
batch_size INT DEFAULT NULL,
model_id VARCHAR(100) DEFAULT NULL)
RETURNS REFCURSOR
The following example creates a table review_summaries (if needed), then it
iterates through movie reviews, generates a concise summary for each using an
AI function, and stores the summaries linked to their original review IDs in the
table.
-- 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;
The following is the example output:
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."
Aggregate summarization across rows
The ai.agg_summarize function operates across multiple rows in a column.
It aggregates values into a unified prompt to generate a single summary for the
entire group.
The following SQL query uses the ai.agg_summarize aggregate function to generate
a single, unified summary for every movie_id based on all reviews in the
movie_reviews table.
select ai.agg_summarize(review) from movie_reviews group by movie_id;
Unlike ai.summarize, which summarizes each row individually, ai.agg_summarize
combines the text from multiple rows into a single input to produce one
consolidated summary for the entire group of rows.
The following is the example output:
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."
What's next
- Evaluate sentiment.
- Read the AI functions overview.