All Products
Search
Document Center

Realtime Compute for Apache Flink:AI_SENTIMENT

Last Updated:Jul 17, 2026

AI_SENTIMENT classifies the sentiment of a text column using a Large Language Model (LLM) and returns a score, label, and confidence value for each row.

Limitations

  • Requires Ververica Runtime (VVR) 11.4 or later.

  • Throughput is bounded by the rate limit of the model platform. When the rate limit is exceeded, the Flink operator experiences backpressure and becomes a bottleneck. In severe cases, this triggers operator timeout errors and causes the job to restart.

Syntax

AI_SENTIMENT(
  MODEL => MODEL <model_name>,
  INPUT => <input_column>
)

Input parameters

Parameter Data type Description
MODEL <model_name> MODEL The registered model service to use. Register a model service in Model Settings. The model's output type must be VARIANT.
<input_column> STRING The text column to analyze.

Outputs

AI_SENTIMENT returns one row per input row with the following columns:

Column Data type Description
score DOUBLE Sentiment score from -1.0 to 1.0. Reference values: -1.0 extremely negative, -0.5 moderately negative, 0.0 neutral, 0.5 moderately positive, 1.0 extremely positive.
label STRING Sentiment classification. Valid values: positive, negative, neutral.
confidence DOUBLE Model confidence in the predicted label, between 0.0 and 1.0.

Example

The following example registers a Qwen-Plus model and uses AI_SENTIMENT to classify the sentiment of movie comments.

Test data

id movie_name comment actual_label
1 Good Stuff I loved the part where the child guessed sounds. It was one of the most romantic narratives I've seen in a movie. Very gentle and full of love. positive
2 Dumpling Queen Nothing remarkable. negative

SQL statement

-- Register the model service
CREATE TEMPORARY MODEL general_model
INPUT (`input` STRING)
OUTPUT (`content` VARIANT)
WITH (
    'provider' = 'openai-compat',
    'task' = 'chat/completions',
    'model'     = 'qwen-plus'
);

-- Create a view with the test data
CREATE TEMPORARY VIEW movie_comment(id, movie_name, user_comment, actual_label)
AS VALUES
  (1, 'Good Stuff',      'I loved the part where the child guessed sounds. It was one of the most romantic narratives I\'ve seen in a movie. Very gentle and full of love.', 'positive'),
  (2, 'Dumpling Queen',  'Nothing remarkable.', 'negative');

-- Call AI_SENTIMENT using positional arguments
SELECT id, movie_name, actual_label, score, label, confidence
FROM movie_comment,
LATERAL TABLE(
  AI_SENTIMENT(MODEL general_model, user_comment));

-- Call AI_SENTIMENT using named arguments
SELECT id, movie_name, actual_label, score, label, confidence
FROM movie_comment,
LATERAL TABLE(
  AI_SENTIMENT(
    MODEL => MODEL general_model,
    INPUT => user_comment));

Replace the following placeholders with your actual values:

Placeholder Description

Output

The predicted label matches the actual_label for both rows.

id movie_name actual_label score label confidence
1 Good Stuff positive 0.8 positive 0.95
2 Dumpling Queen negative -1.0 negative 0.95