Todos os produtos
Search
Central de documentação

Realtime Compute for Apache Flink:Invocação geral

Última atualização: Aug 20, 2026

Este tópico descreve como usar a função ML_PREDICT para chamar modelos de IA no Flink. O conteúdo abrange sintaxe, 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 multimodal.

Início rápido

Pré-requisitos

O exemplo a seguir demonstra como usar o ML_PREDICT para chamar um modelo integrado do Flink. Acesse Data Development > ETL, 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

  • Requer o mecanismo Realtime Compute VVR 11.1 ou posterior.

  • Alguns parâmetros têm suporte apenas com 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 timeout e reinicializações do job. Para mais informações, consulte Limites de taxa no Model Studio.

  • A quantidade de tipos em content-types e o número de colunas no DESCRIPTOR devem corresponder ao número de colunas INPUT definidas no CREATE MODEL.

  • Colunas do tipo image_url devem ser STRING. Colunas do tipo multi_image_urls devem ser ARRAY<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. Especifique uma tabela física ou visualize uma view.

MODEL

MODEL

Nome de um modelo registrado. Para mais informações, consulte Model settings.

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 com 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 Per-call configuration.

Nota

Suportado apenas nas versões VVR 11.8.preview.2 e posteriores com o Flink AI Service (modelos integrados).

Configuração por chamada

Defina 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 persistirá na definição do MODEL.

Parâmetro

Descrição

Exemplo

user-prompt

Define o prompt do usuário. Passe uma string vazia para ignorar o valor definido no nível do MODEL.

MAP['user-prompt', 'Answer in English']

content-type

Especifica o tipo de conteúdo para entrada de coluna única.

MAP['content-type', 'text']

content-types

Define os tipos de conteúdo para entrada de múltiplas colunas.
A quantidade de tipos em content-types deve corresponder ao número de colunas INPUT no CREATE MODEL.

MAP['content-types', 'text;image_url']

{column}.{param}

Especifica parâmetros no nível da coluna.

MAP['image_input.min_pixels', '100']

extra-body

Define parâmetros adicionais como uma string JSON.

MAP['extra-body', '{"enable_search": true}']

bundle-size

Tamanho do bundle.

MAP[
  'bundle-size', '10',
  'bundle-allow-latency', '5s'
]

bundle-allow-latency

Latência permitida para o bundle.

Parâmetros de tipo de conteúdo

  • Para entradas de coluna única, use content-type para especificar o tipo de conteúdo. Valores suportados: text, image_url.

  • Para entradas de múltiplas colunas, utilize content-types para definir o tipo de conteúdo de cada coluna. Os valores suportados e seu mapeamento para tipos de coluna do Flink SQL estão listados abaixo:

Valor de content-types

Tipo Flink SQL

Descrição

text

STRING

image_url

STRING

image_bytes

BYTES

Suportado no VVR 11.9.preview.1 e posterior.

multi_image_bytes

ARRAY<BYTES>

Suportado no VVR 11.9.preview.1 e posterior.

multi_image_urls

ARRAY<STRING>

Suportado no VVR 11.8 e posterior.

video_bytes

BYTES

Suportado no VVR 11.9.preview.1 e posterior.

video_url

STRING

Suportado no VVR 11.9.preview.1 e posterior.

  • Recomendamos especificar content-types nos parâmetros. Se você definir tanto content-type quanto content-types, o framework retornará um erro. Observação: as configurações de content-type e content-types nos parâmetros do modelo e nas configurações por chamada se afetam mutuamente:

Configuração do CREATE MODEL

Opção permitida por chamada

Opção não permitida por chamada

Descrição

content-type (coluna única)

content-type

content-types

Permite alternar entre text e image_url

content-types (múltiplas colunas)

content-types

content-type

Permite alterar a combinação de tipos, ex.: de text;image_url para text;text

Nem content-type nem content-types especificados

content-typecontent-types

Igual ao acima

Parâmetros no nível da coluna

Parâmetro

Descrição

Valores

Exemplo

{column}.min_pixels

Define o limiar mínimo de pixels para imagens de entrada ou quadros de vídeo. Imagens com menos pixels que min_pixels são ampliadas até ultrapassarem o limiar.

Qwen3.7, Qwen3.6, Qwen3.5: padrão e mínimo são ambos 65536.

MAP['image_input.min_pixels', '100']

{column}.max_pixels

Estabelece o limiar máximo de pixels para imagens de entrada ou quadros de vídeo. Imagens dentro do intervalo [min_pixels, max_pixels] são processadas na resolução original. Imagens que excedem max_pixels são reduzidas.

Qwen3.7, Qwen3.6, Qwen3.5: padrão é 2621440, máximo é 16777216.

MAP['image_input.max_pixels', '10000']

{column}.total_pixels

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 [min_pixels, max_pixels]. Para vídeos longos com muitos quadros extraídos, reduzir esse valor diminui o consumo de tokens e o tempo de processamento, mas pode causar perda de detalhes da imagem.

Série Qwen3.7, Série Qwen3.6, Série Qwen3.5: padrão e máximo são ambos 819200000. Este valor corresponde a 800000 tokens de imagem (cada bloco de 32x32 pixels equivale a 1 token de imagem).

MAP['image_input.total_pixels', '1000000']

{column}.cache_control

Ativa o cache explícito.

{"type": "ephemeral"}

MAP['content.cache_control', '{"type": "ephemeral"}']

{column}.fps

Define a taxa de amostragem de quadros para compreensão de vídeo.

Valores válidos: [0,1, 10]. Valor padrão: 2,0.

MAP['video_input.fps', '1.0']

Processamento de bundle

  • Processamento: O processamento de bundle agrega primeiro vários registros de entrada em um lote e depois chama o modelo de IA para esse lote. Isso reduz o número de chamadas ao modelo, mas aumenta o tempo de inferência de cada requisição. Quando os registros podem ser agregados de forma eficaz, o processamento de bundle melhora significativamente o throughput do operador.

  • Descrição dos parâmetros: bundle-size especifica o número máximo de registros acumulados em um lote. bundle-allow-latency define o tempo máximo de espera quando um lote ainda não atingiu o valor de bundle-size. O processamento inicia quando a condição de tamanho do lote ou de tempo de espera for atendida.

  • Tipo de dados: Apenas text é suportado.

  • Funções suportadas: ML_PREDICT, text classification (AI_CLASSIFY), sentiment analysis (AI_SENTIMENT), information extraction (AI_EXTRACT), text summarization (AI_SUMMARIZE), text translation (AI_TRANSLATE), data masking (AI_MASK) e text embedding (AI_EMBED).

  • Configuração global: Esta configuração aplica-se a cada chamada de ML_PREDICT e a cada chamada das funções de IA específicas de domínio listadas no job. Use os seguintes parâmetros globais para ativar o processamento de bundle:

    SET 'table.exec.ml-predict.bundle-size' = '10';
    SET 'table.exec.ml-predict.bundle-allow-latency' = '5s';
  • Configuração por chamada: Estes parâmetros aplicam-se apenas à chamada de função onde foram especificados. O ML_PREDICT e as funções de IA específicas de domínio listadas usam o mesmo método de configuração. Para parâmetros e exemplos, consulte Per-call configuration.

Exemplos

Texto

O exemplo a seguir registra e usa um modelo integrado do Flink AI Service para classificar o sentimento de textos de entrada. O Exemplo 1 utiliza 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));

Vídeo

O exemplo abaixo registra um modelo multimodal para compreender um vídeo de entrada.

CREATE TEMPORARY MODEL sentiment_model
INPUT (video_url STRING)
OUTPUT (response STRING)
WITH (
  'provider' = 'openai-compat',
  'task' = 'chat/completions',
  'model' = 'qwen3.6-plus',
  'content-types' = 'video_url',
  'system-prompt' = 'Briefly describe the video content'
);

CREATE TEMPORARY VIEW input_table(content)
AS VALUES ('https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251111/ckgcxt/%E5%8D%95%E4%BA%BA%E8%AF%B4%E8%AF%9D-1.mp4');

SELECT
  content,
  response AS sentiment
FROM ML_PREDICT(
  TABLE input_table,
  MODEL sentiment_model,
  DESCRIPTOR(content));

Texto + imagem única

Neste exemplo, registramos 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 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)

Transmita múltiplas imagens em uma coluna ARRAY<STRING>. Utilize 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)
)); 

Texto + vídeo

CREATE TEMPORARY MODEL sentiment_model
INPUT (video_url STRING, question STRING)
OUTPUT (response STRING)
WITH (
  'provider' = 'openai-compat',
  'task' = 'chat/completions',
  'model' = 'qwen3.6-plus',
  'content-types' = 'video_url;text'
);

CREATE TEMPORARY VIEW input_table(content, question)
AS VALUES ('https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251111/ckgcxt/%E5%8D%95%E4%BA%BA%E8%AF%B4%E8%AF%9D-1.mp4', 'How many people are there?');

SELECT
  content,
  response AS sentiment
FROM ML_PREDICT(
  TABLE input_table,
  MODEL sentiment_model,
  DESCRIPTOR(content, question));

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