Este tópico descreve como usar a função ML_PREDICT para chamar modelos de IA no Flink. O conteúdo abrange sintaxe e parâmetros, configuração por chamada, configuração de tipo de conteúdo, parâmetros no nível de coluna e exemplos de inferência para texto, imagem e multimodalidade.
Início rápido
Pré-requisitos
Um workspace do Flink foi criado. Para mais informações, consulte Ativar o Realtime Compute for Apache Flink.
O Flink AI Service está ativado. Para mais informações, consulte Flink AI Service (modelos integrados).
O Flink AI Service (modelos integrados) requer a versão 11.7 ou posterior do mecanismo VVR.
O exemplo a seguir demonstra como usar ML_PREDICT para chamar um modelo integrado do Flink. Acesse , crie um job, cole o código e clique em Debug.
CREATE TEMPORARY TABLE text_source (
user_input STRING
) WITH ('connector' = 'datagen');
CREATE TEMPORARY TABLE result_sink (
user_input STRING,
ai_analysis STRING
) WITH ('connector' = 'print');
CREATE TEMPORARY MODEL text_model
INPUT (user_input STRING)
OUTPUT (content STRING)
WITH (
'provider' = 'openai-compat',
'model' = 'qwen3.6-flash',
'task' = 'chat/completions',
'system-prompt' = 'Rate the gibberish level of the input on a scale of 0 to 100'
);
INSERT INTO result_sink
SELECT user_input, content as ai_analysis FROM
ML_PREDICT(
TABLE text_source,
MODEL text_model,
DESCRIPTOR(user_input)
);
Limites
É necessário ter o mecanismo Realtime Compute VVR 11.1 ou superior.
Alguns parâmetros têm suporte apenas ao usar o Flink AI Service (modelos integrados) e exigem a versão VVR 11.8.preview.2 ou posterior.
O throughput do operador ML_PREDICT está sujeito ao limite de taxa do Model Studio. Ao atingir esse limite, ocorre backpressure no operador ML_PREDICT, o que pode causar erros de tempo limite e reinicializações do job. Para mais informações, consulte Limites de taxa no Model Studio.
A quantidade de tipos em
content-typese o número de colunas no DESCRIPTOR devem corresponder à quantidade de colunas INPUT definidas em CREATE MODEL.Colunas do tipo
image_urldevem ser STRING. Colunas do tipomulti_image_urlsdevem serARRAY<STRING>.Imagens em base64 devem incluir o prefixo
data:image/<format>;base64,. Strings base64 brutas e caminhos de arquivos locais não são suportados.
Sintaxe
ML_PREDICT(TABLE <table_name>, MODEL <model_name>, DESCRIPTOR(<input_columns>) [, CONFIG => MAP[...]])
Parâmetros
|
Parâmetro |
Tipo de dados |
Descrição |
|
TABLE |
TABLE |
Fluxo de dados de entrada para inferência do modelo. É possível especificar uma tabela física ou uma view. |
|
MODEL |
MODEL |
Nome de um modelo registrado. Para mais informações, consulte Configurações do modelo. |
|
DESCRIPTOR() |
— |
Colunas de entrada para inferência do modelo. Nota
As versões VVR 11.8.preview.2 e posteriores suportam múltiplas colunas de entrada. Esse recurso está disponível apenas ao usar o Flink AI Service (modelos integrados). A quantidade de colunas do DESCRIPTOR deve corresponder ao número de colunas INPUT do CREATE MODEL. |
|
CONFIG => MAP[...] |
MAP |
Opcional. Para mais informações, consulte Configuração por chamada. Nota
Suportado apenas nas versões VVR 11.8.preview.2 e posteriores com o Flink AI Service (modelos integrados). |
Configuração por chamada
É possível definir configurações específicas ao chamar o ML_PREDICT. Caso um parâmetro já esteja definido no CREATE MODEL, o valor da chamada terá precedência, mas não será persistido na definição do MODEL.
|
Parâmetro |
Descrição |
Exemplo |
|
|
Defina o prompt do usuário. Passe uma string vazia para ignorar o valor definido no nível do MODEL. |
|
|
|
Especifique o tipo de conteúdo para entrada de coluna única. |
|
|
|
Defina os tipos de conteúdo para entrada multicoluna. A quantidade de tipos em |
|
|
|
Especifique parâmetros no nível da coluna. |
|
|
|
Defina parâmetros adicionais como uma string json. |
|
Parâmetros de tipo de conteúdo
Para entradas de coluna única, use
content-typepara especificar o tipo de conteúdo. Valores suportados:text,image_url.Em entradas multicoluna, utilize
content-typespara definir o tipo de conteúdo de cada coluna. Valores suportados:text,image_url,multi_image_urls.Apenas um entre
content-typeecontent-typespode ser especificado. A opção disponível depende do que foi definido no CREATE MODEL:
|
Configuração do CREATE MODEL |
Opção permitida por chamada |
Opção não permitida por chamada |
Descrição |
|
|
|
|
Permite alternar entre |
|
|
|
|
Permite alterar a combinação de tipos, por exemplo, de |
|
Nenhum |
|
— |
Igual aos casos acima |
Parâmetros no nível da coluna
|
Parâmetro |
Descrição |
Valores |
Exemplo |
|
|
Defina o limiar mínimo de pixels para imagens de entrada ou quadros de vídeo. Imagens com menos pixels que |
|
|
|
|
Defina o limiar máximo de pixels para imagens de entrada ou quadros de vídeo. Imagens dentro do intervalo |
|
|
|
|
Limita o total de pixels em todos os quadros extraídos de um vídeo (pixels por quadro x total de quadros). Se o vídeo exceder esse limite, os quadros serão reduzidos, mantendo cada um dentro do intervalo |
|
|
|
|
Ativa o cache explícito. |
|
|
Exemplos
Texto
O exemplo a seguir registra e utiliza um modelo integrado do Flink AI Service para classificar o sentimento de textos de entrada. O Exemplo 1 usa parâmetros no nível do MODEL. O Exemplo 2 substitui o user-prompt no momento da chamada.
-- Register a built-in model. When content-type is not specified, it defaults to text
CREATE MODEL sentiment_model
INPUT (prompt STRING)
OUTPUT (response STRING)
WITH (
'provider' = 'openai-compat',
'task' = 'chat/completions',
'model' = 'qwen3.6-flash',
'system-prompt' = 'You are a sentiment classifier. Output one label: negative, positive, or neutral'
);
-- Create a source table: simulated product review data
CREATE TEMPORARY VIEW input_table(id, content)
AS VALUES
(1, 'Great quality, soft fabric, fits perfectly'),
(2, 'Had loose threads on arrival, faded badly after one wash'),
(3, 'Received the item, looks as pictured'),
(4, 'Started pilling after two weeks, customer service refused returns'),
(5, 'Flattering fit, color is even better than the photo, already ordered a third one');
-- Create a result table
CREATE TEMPORARY TABLE output_table (
id INT,
content STRING,
sentiment STRING
) WITH (
'connector' = 'print'
);
-- Use ML_PREDICT for real-time inference
-- Example 1: Use MODEL-level parameters
INSERT INTO output_table
SELECT
id,
content,
response AS sentiment
FROM ML_PREDICT(
TABLE input_table,
MODEL sentiment_model,
DESCRIPTOR(content));
-- Example 2: Specify per-call parameters
INSERT INTO output_table
SELECT
id,
content,
response AS sentiment
FROM ML_PREDICT(
TABLE input_table,
MODEL sentiment_model,
DESCRIPTOR(content),
MAP['user-prompt', 'Reply in Chinese']);
Saída do Exemplo 1:
|
id |
content |
sentiment |
|
1 |
Great quality, soft fabric, fits perfectly |
positive |
|
2 |
Had loose threads on arrival, faded badly after one wash |
negative |
|
3 |
Received the item, looks as pictured |
positive |
|
4 |
Started pilling after two weeks, customer service refused returns |
negative |
|
5 |
Flattering fit, color is even better than the photo, already ordered a third one |
positive |
Saída do Exemplo 2:
|
id |
content |
sentiment |
|
1 |
Great quality, soft fabric, fits perfectly |
Positive |
|
2 |
Had loose threads on arrival, faded badly after one wash |
Negative |
|
3 |
Received the item, looks as pictured |
Positive |
|
4 |
Started pilling after two weeks, customer service refused returns |
Negative |
|
5 |
Flattering fit, color is even better than the photo, already ordered a third one |
Positive |
Imagem
Este exemplo registra um modelo multimodal e classifica imagens de entrada.
-- Register a built-in model with content-type set to image_url
CREATE TEMPORARY MODEL sentiment_model
INPUT (prompt STRING)
OUTPUT (response STRING)
WITH (
'provider' = 'openai-compat',
'task' = 'chat/completions',
'model' = 'qwen3.6-flash',
'content-type' = 'image_url'
);
-- Use ML_PREDICT for real-time inference
INSERT INTO output_table
SELECT
id,
content,
response AS sentiment
FROM ML_PREDICT(
TABLE input_table,
MODEL sentiment_model,
DESCRIPTOR(content));
Texto + imagem única
O exemplo abaixo registra um modelo multimodal para inferência baseada em chat com entradas de texto e imagem.
CREATE MODEL vl_model
INPUT (text_input STRING, image_input STRING)
OUTPUT (content STRING)
WITH (
'provider' = 'openai-compat',
'model' = 'qwen3.5-plus',
'task' = 'chat/completions',
'content-types' = 'text;image_url'
);
INSERT INTO result_sink
SELECT content FROM TABLE(ML_PREDICT(
TABLE image_source,
MODEL vl_model,
DESCRIPTOR(text_input, image_input)
));
Texto + múltiplas imagens (múltiplas colunas)
Passe cada imagem por meio de uma coluna INPUT separada. Especifique image_url para cada coluna de imagem em content-types.
CREATE MODEL vl_model_multi
INPUT (prompt STRING, img1 STRING, img2 STRING)
OUTPUT (content STRING)
WITH (
'provider' = 'openai-compat',
'model' = 'qwen3.5-plus',
'task' = 'chat/completions',
'content-types' = 'text;image_url;image_url'
);
SELECT content FROM TABLE(ML_PREDICT(
TABLE my_source,
MODEL vl_model_multi,
DESCRIPTOR(prompt, img1, img2)
));
Texto + múltiplas imagens (array)
Passe várias imagens em uma coluna ARRAY<STRING>. Use multi_image_urls em content-types.
CREATE MODEL vl_model_array
INPUT (prompt STRING, images ARRAY<STRING>)
OUTPUT (content STRING)
WITH (
'provider' = 'openai-compat',
'model' = 'qwen3.5-plus',
'task' = 'chat/completions',
'content-types' = 'text;multi_image_urls'
);
SELECT content FROM TABLE(ML_PREDICT(
TABLE my_source,
MODEL vl_model_array,
DESCRIPTOR(prompt, images)
));
Exemplos de parâmetros por chamada
Exemplo 1: Especificar parâmetros de tipo de conteúdo
-- When content-type / content-types are not specified in CREATE MODEL, the default is content-type = text
CREATE MODEL model_single
INPUT (input STRING)
OUTPUT (content STRING)
WITH (
'provider' = 'openai-compat',
'model' = 'qwen3.5-plus',
'task' = 'chat/completions'
);
-- Call 1: Use MODEL parameters, content type is text
SELECT content FROM TABLE(ML_PREDICT(
TABLE source_text,
MODEL model_single,
DESCRIPTOR(input)
));
-- Call 2: Override content type to image at call time
SELECT content FROM TABLE(ML_PREDICT(
TABLE source_img,
MODEL model_single,
DESCRIPTOR(input),
MAP['content-type', 'image_url']
));
Exemplo 2: Especificar user-prompt e parâmetros no nível da coluna
-- Set default configuration in CREATE MODEL (multi-column model)
CREATE MODEL vl_model
INPUT (text_input STRING, image_input STRING)
OUTPUT (content STRING)
WITH (
'provider' = 'openai-compat',
'model' = 'qwen3.5-plus',
'task' = 'chat/completions',
'content-types' = 'text;image_url',
'user-prompt' = 'Describe the image'
);
-- Call 1: Use default configuration
SELECT content FROM TABLE(ML_PREDICT(
TABLE source_a, MODEL vl_model, DESCRIPTOR(text_input, image_input)
));
-- Call 2: Override user-prompt and column-level parameters
SELECT content FROM TABLE(ML_PREDICT(
TABLE source_b, MODEL vl_model, DESCRIPTOR(text_input, image_input),
MAP[
'user-prompt', 'Answer in English',
'image_input.min_pixels', '100',
'image_input.max_pixels', '5000'
]
));
-- Call 3: Override content-types to change the type combination (treat both columns as text)
SELECT content FROM TABLE(ML_PREDICT(
TABLE source_c, MODEL vl_model, DESCRIPTOR(text_input, image_input),
MAP['content-types', 'text;text']
));
-- Call 4: Override content-types to change the type combination (reverse order)
SELECT content FROM TABLE(ML_PREDICT(
TABLE source_c, MODEL vl_model, DESCRIPTOR(text_input, image_input),
MAP['content-types', 'image_url;text']
));