Analiza el sentimiento del texto

Selecciona una versión de la documentación:

La función ai.analyze_sentiment es una herramienta de IA integrada de AlloyDB que clasifica el sentimiento del texto como positivo, negativo o neutral. Al incorporar esta capacidad directamente en la base de datos, AlloyDB Omni te permite procesar datos no estructurados sin compilar canalizaciones complejas de extracción, transformación y carga (ETL) ni integraciones de servicios externos.

La función de análisis de sentimiento proporciona los siguientes beneficios:

  • Conocimiento del mundo: Es la vasta colección de hechos, conceptos, relaciones y comprensión contextual del mundo que los modelos de lenguaje grandes (LLM) adquieren durante su fase de entrenamiento previo.
  • Análisis en tiempo real: Lleva el conocimiento del mundo de Gemini a los datos de la empresa con SQL.
  • Escalabilidad: Admite el procesamiento basado en arrays y cursores para controlar miles de filas de manera eficiente.
  • Simplicidad: Proporciona una abstracción de alto nivel que administra la invocación del modelo y la preparación de datos de forma automática.

La función de análisis de sentimiento de AlloyDB AI admite varios casos de uso, incluidos los siguientes:

  • Comentarios de los clientes: Clasifica miles de reseñas de productos sin procesar y no estructuradas para identificar los niveles de satisfacción del cliente.
  • Supervisión de redes sociales: Analiza las opiniones sobre menciones o comentarios en redes sociales para evaluar la percepción pública de una marca.

Antes de comenzar

Asegúrate de cumplir con los siguientes requisitos antes de usar la función ai.analyze_sentiment.

Habilita la extensión

Asegúrate de tener instalada la versión más reciente de la extensión google_ml_integration.enable_preview_ai_functions (versión 1.5.7 o posterior) con la funcionalidad de versión preliminar habilitada.

Para habilitar la marca google_ml_integration.enable_preview_ai_functions en AlloyDB Omni, usa el comando SET. Esta marca controla el acceso a las funciones de IA de versión preliminar, como ai.analyze_sentiment.

  1. Asegúrate de que tu google_ml_integration extension sea la versión 1.5.7 o posterior. Para verificar la versión, ejecuta lo siguiente:

    SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
    

    Si necesitas actualizar a una versión que incluya estas funciones de versión preliminar, llama a lo siguiente:

    CALL google_ml.upgrade_to_preview_version();
    
  2. Habilita la marca para la sesión actual o para toda la base de datos. Para habilitar el parámetro para tu sesión actual, ejecuta lo siguiente:

    SET google_ml_integration.enable_preview_ai_functions = 'on';
    

    Este cambio no requiere que se reinicie la base de datos. El valor predeterminado de esta marca es off.

Crea una tabla de ejemplo

Para seguir los ejemplos de la función de análisis de opiniones de este documento, crea una tabla y complétala con las siguientes reseñas de películas.

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

Analiza las opiniones de una sola cadena

Para evaluar el sentimiento de una sola entrada de texto, usa la versión escalar de ai.analyze_sentiment.

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

En el siguiente ejemplo, se muestra cómo realizar un análisis de sentimiento a nivel de fila en datos de texto almacenados en una tabla llamada reviews con columnas id y review_content para almacenar datos de reseñas. En el ejemplo, se ejecuta una consulta SELECT que aplica la función ai.analyze_sentiment() a la columna review_content para cada fila de la tabla. Esta función procesa cada reseña de forma individual y muestra su opinión calculada (positive, negative o neutral).

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

A continuación, se muestra el resultado de ejemplo:

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

Analiza las opiniones en lotes

Para obtener un mejor rendimiento en conjuntos de datos más grandes, usa la versión basada en arrays de la función para procesar varias cadenas en una sola llamada.

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

A continuación, se muestra el resultado de ejemplo:

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

Analiza las opiniones con cursores

La función basada en cursores está diseñada para procesar conjuntos de datos grandes de manera eficiente, ya que permite que el sistema transmita datos a través del modelo de IA en lotes administrables sin requerir que todos los datos se carguen en la memoria a la vez.

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

Ahora puedes usar la función ai.analyze_sentiment. Como espera un REFCURSOR, debes abrir un cursor para los datos de entrada que deseas analizar. En este ejemplo, analizas el review_content de la tabla reviews.

En el siguiente ejemplo, se muestra cómo enviar datos a la función ai.analyze_sentiment fila por fila con un cursor:

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

A continuación, se muestra el resultado:

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

¿Qué sigue?