Analizzare il sentiment del testo

La funzione ai.analyze_sentiment è uno strumento di AlloyDB AI integrato che classifica il sentiment del testo come positivo, negativo o neutro. Incorporando questa funzionalità direttamente nel database, AlloyDB per PostgreSQL ti consente di elaborare dati non strutturati senza creare pipeline ETL (Extract, Transform, and Load) complesse o integrazioni di servizi esterni.

La funzione di analisi del sentiment offre i seguenti vantaggi:

  • Conoscenza del mondo: la vasta raccolta di fatti, concetti, relazioni e comprensione contestuale del mondo che i modelli linguistici di grandi dimensioni (LLM) acquisiscono durante la fase di pre-addestramento.
  • Analisi in tempo reale: porta la conoscenza del mondo di Gemini nei dati aziendali utilizzando SQL.
  • Scalabilità: supporta l'elaborazione basata su array e cursori per gestire in modo efficiente migliaia di righe.
  • Semplicità: fornisce un'astrazione di alto livello che gestisce automaticamente la chiamata del modello e la preparazione dei dati.

La funzione di analisi del sentiment di AlloyDB AI supporta diversi casi d'uso, tra cui i seguenti:

  • Feedback dei clienti: classifica migliaia di recensioni di prodotti non strutturate e non elaborate per identificare i livelli di soddisfazione dei clienti.
  • Monitoraggio dei social media: analizza il sentiment dei commenti o delle menzioni sui social per valutare la percezione pubblica di un brand.

Prima di iniziare

Assicurati di soddisfare i seguenti requisiti prima di utilizzare la funzione ai.analyze_sentiment.

Attivare l'estensione

Assicurati di aver installato l'ultima versione dell'estensione google_ml_integration.enable_preview_ai_functions (versione 1.5.7 o successive) con la funzionalità di anteprima abilitata.

Per abilitare il flag google_ml_integration.enable_preview_ai_functions in AlloyDB, utilizza il comando SET. Questo flag controlla l'accesso alle funzioni di AI in anteprima come ai.analyze_sentiment.

  1. Assicurati che il tuo google_ml_integration extension sia la versione 1.5.7 o successive. Puoi controllare la versione eseguendo il comando seguente:

    SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
    

    Se devi eseguire l'upgrade a una versione che include queste funzioni di anteprima, chiama quanto segue:

    CALL google_ml.upgrade_to_preview_version();
    
  2. Abilita il flag per la sessione corrente o per l'intero database. Per abilitare il flag per la sessione corrente, esegui il comando seguente:

    SET google_ml_integration.enable_preview_ai_functions = 'on';
    

    Questa modifica non richiede il riavvio del database. Il valore predefinito di questo flag è off.

Creare una tabella di esempio

Per seguire gli esempi della funzione di analisi del sentiment in questo documento, crea una tabella e compilala con le seguenti recensioni di film.

CREATE TABLE IF NOT EXISTS reviews (
    id INT PRIMARY KEY,
    review_content TEXT
);

INSERT INTO reviews (id, review_content) VALUES 
(1, 'This movie is very good'),
(2, 'The actors play the parts well'),
(3, 'I like the music in this film'),
(4, 'The story is easy to follow'),
(5, 'Many people will enjoy this show'),
(6, 'The film is too long'),
(7, 'I do not like the ending'),
(8, 'This movie is very boring'),
(9, 'The story is okay'),
(10, 'Some parts are fine');

Analizzare il sentiment di una singola stringa

Per valutare il sentiment di un singolo input di testo, utilizza la versione scalare di ai.analyze_sentiment.

SELECT ai.analyze_sentiment(
  prompt => 'TEXT_CONTENT',
  model_id => 'MODEL_ID' -- Optional. The default value is gemini-2.5-flash-lite.
);

L'esempio seguente mostra come eseguire l'analisi del sentiment a livello di riga sui dati di testo archiviati in una tabella denominata reviews con le colonne id e review_content per archiviare i dati delle recensioni. L'esempio esegue una query SELECT che applica la funzione ai.analyze_sentiment() alla colonna review_content per ogni riga della tabella. Questa funzione elabora ogni recensione singolarmente e restituisce il sentiment calcolato (positive, negative o neutral).

--- Row Level sentiment analysis
SELECT ai.analyze_sentiment(review_content) FROM reviews;

Di seguito è riportato l'output di esempio:

 id | analyze_sentiment
----+-------------------
  1 | positive
  2 | positive
  3 | positive
  4 | positive
  5 | positive
  6 | negative
  7 | negative
  8 | negative
  9 | neutral
 10 | neutral

Analizzare il sentiment in batch

Per prestazioni migliori su set di dati più grandi, utilizza la versione basata su array della funzione per elaborare più stringhe in una singola chiamata.

SELECT ai.analyze_sentiment(
  prompts => ARRAY['TEXT_1', 'TEXT_2'],
  batch_size => BATCH_SIZE, -- Optional. The default value is 10.
  model_id => 'MODEL_ID' -- Optional. The default value is gemini-2.5-flash-lite.
);

L'esempio seguente analizza il sentiment delle recensioni dei clienti da una tabella denominata reviews.

WITH sentiment_results AS (
SELECT
  ARRAY_AGG(id ORDER BY id) as ids,
  ai.analyze_sentiment( 
    prompts => array_agg( 'Please analyze the sentiment of this review  : ' || review_content
      ORDER BY id),
    batch_size => 15) as sentiments 
FROM reviews
),
correlated_results AS (
    SELECT ids[i] as id, sentiments[i] as sentiment
    FROM sentiment_results,
    generate_series(1, array_length(ids, 1)) AS i
)
SELECT reviews.id, correlated_results.sentiment as sentiment 
FROM reviews
JOIN correlated_results ON reviews.id = correlated_results.id
ORDER BY reviews.id DESC;

Di seguito è riportato l'output di esempio:

 id | sentiment
----+-----------
  1 | positive
  2 | positive
  3 | positive
  4 | positive
  5 | positive
  6 | negative
  7 | negative
  8 | negative
  9 | neutral
 10 | neutral

Analizzare il sentiment utilizzando i cursori

La funzione basata su cursore è progettata per l'elaborazione efficiente di set di dati di grandi dimensioni, perché consente al sistema di trasmettere i dati al modello di AI in batch gestibili senza richiedere il caricamento di tutti i dati in memoria contemporaneamente.

La firma della funzione per la versione basata su cursore di ai.analyze_sentiment è la seguente:

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

Ora puoi utilizzare la funzione ai.analyze_sentiment. Poiché prevede un REFCURSOR, devi aprire un cursore per i dati di input che vuoi analizzare. In questo esempio, analizzi review_content dalla tabella reviews.

L'esempio seguente mostra come inserire i dati nella funzione ai.analyze_sentiment riga per riga utilizzando un cursore:

-- Start a transaction
BEGIN;

-- Declare a cursor for the review content
DECLARE review_cursor REFCURSOR;

-- Open the cursor with the query to fetch the review content
OPEN review_cursor FOR SELECT review_content FROM reviews;

-- Call the AI function, passing the cursor
-- This function will return another cursor containing the results
DECLARE result_cursor REFCURSOR;
SELECT ai.analyze_sentiment(
    prompt => 'Analyze the sentiment of the following movie review:',
    input_cursor => review_cursor,
    batch_size => 5  -- Optional: Process in batches of 5
) INTO result_cursor;

-- Fetch and display results from the result_cursor
-- The exact way to fetch from a REFCURSOR depends on the SQL environment.
-- This is a conceptual example.
FETCH ALL FROM result_cursor;

-- Close the cursors
CLOSE review_cursor;
CLOSE result_cursor;

-- End the transaction
COMMIT;

Di seguito è riportato l'output:

      review_content            | sentiment | score
------------------------------+-----------+-------
This movie is very good        | Positive  |   0.9
The actors play the parts well | Positive  |   0.8
I like the music in this film  | Positive  |   0.8
The story is easy to follow    | Positive  |   0.7
Many people will enjoy this show | Positive  |   0.8
The film is too long           | Negative  |  -0.6
I do not like the ending       | Negative  |  -0.8
This movie is very boring      | Negative  |  -0.9
The story is okay              | Neutral   |   0.1
Some parts are fine            | Neutral   |   0.2

Passaggi successivi