本文介绍如何在 Flink 中使用 ML_PREDICT 函数调用 AI 模型,涵盖语法与入参说明、调用级参数、内容类型配置、列级参数设置,以及文本、图片、多模态等多种调用示例。
快速开始
前提条件
-
已创建 Flink 工作空间,详情请参见开通实时计算Flink版。
-
已开通 Flink AI 服务,详情请参见Flink AI服务(内置模型)。
-
使用 Flink AI 服务(内置模型)时,需使用 VVR 11.7 及以上版本引擎。
以下示例演示如何使用 ML_PREDICT 调用 Flink 内置模型。请在页面,新建作业、复制代码后点击调试。
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' = '分析内容乱码程度,给0-100的评分'
);
INSERT INTO result_sink
SELECT user_input, content as ai_analysis FROM
ML_PREDICT(
TABLE text_source,
MODEL text_model,
DESCRIPTOR(user_input)
);
使用限制
-
仅实时计算引擎 VVR 11.1 及以上版本支持。
-
部分参数仅在使用 Flink AI 服务(内置模型)时支持,仅支持 VVR 11.8.preview.2 及以上版本。
-
ML_PREDICT 算子的吞吐量受百炼平台限流限制。触及流量上限时,作业会出现以 ML_PREDICT 算子为瓶颈的反压现象,严重时可能触发超时报错及作业重启。详情参见百炼平台限流。
-
content-types中的类型数量及 Descriptor 中的列数,必须与 CREATE MODEL 中 INPUT 的列数一致。 -
image_url类型的列必须为 STRING,multi_image_urls类型的列必须为ARRAY<STRING>。 -
base64 图片必须包含
data:image/<格式>;base64,前缀,不支持纯 base64 字符串和本地文件路径。
语法
ML_PREDICT(TABLE <table_name>, MODEL <model_name>, DESCRIPTOR(<input_columns>) [, CONFIG => MAP[...]])
入参
|
参数 |
数据类型 |
说明 |
|
TABLE |
TABLE |
模型推断的输入数据流,可以是物理表名或视图名。 |
|
MODEL |
MODEL |
已注册的模型服务名称。详情参见模型设置。 |
|
DESCRIPTOR() |
— |
用于模型推断的输入列。 说明
VVR 11.8.preview.2 及以上版本支持输入多列,且仅在使用 Flink AI 服务(内置模型)时支持。强制要求 DESCRIPTOR 列数 = CREATE MODEL INPUT 列数。 |
|
CONFIG => MAP[...] |
MAP |
可选。详情参见调用级参数。 说明
仅VVR 11.8.preview.2 及以上版本支持,且使用 Flink AI 服务(内置模型)。 |
调用级参数
用户可以在使用 ML_PREDICT 时指定调用级参数。若 CREATE MODEL 中已设置参数值,则调用 ML_PREDICT 时以新指定的参数为准,但不会持久化改写 MODEL 中的参数值。
|
参数 |
说明 |
示例 |
|
|
指定用户提示词。传空字符串时则不使用MODEL 级参数值。 |
|
|
|
仅输入单列时,指定内容类型。 |
|
|
|
输入多列时,指定内容类型。 |
|
|
|
指定列级参数。 |
|
|
|
指定附加参数(JSON 字符串)。 |
|
内容类型参数
-
仅输入单列时,可通过
content-type指定内容类型,支持的值:text、image_url。 -
输入多列时,可通过
content-types指定每列内容类型,支持的值:text、image_url、multi_image_urls。 -
content-type和content-types仅可指定其中一个,且受 CREATE MODEL 时设置的参数影响:
|
创建模型时指定参数 |
调用级参数可使用 |
调用级参数不可使用 |
说明 |
|
|
|
|
可在 |
|
|
|
|
可改变类型组合,如 |
|
未指定 |
|
— |
同上 |
列级参数
|
参数 |
说明 |
参数值 |
示例 |
|
|
设定输入图像或视频帧的最小像素阈值。当输入图像或视频帧的像素小于 |
|
|
|
|
设定输入图像或视频帧的最大像素阈值。当输入图像或视频的像素在 |
|
|
|
|
限制从视频中抽取的所有帧的总像素(单帧图像像素 × 总帧数)。如果视频总像素超过此限制,系统将对视频帧进行缩放,但仍会确保单帧图像的像素值在 |
|
|
|
|
用于开启显式缓存。 |
|
|
示例
文本
以下示例注册并引用 Flink AI 服务提供的内置模型,对输入文本进行情感分类。调用示例 1 复用 MODEL 级参数,调用示例 2 在调用时指定参数 user-prompt。
-- 注册引用内置模型,不指定 content-type 时默认为 text
CREATE MODEL sentiment_model
INPUT (prompt STRING)
OUTPUT (response STRING)
WITH (
'provider' = 'openai-compat',
'task' = 'chat/completions',
'model' = 'qwen3.6-flash',
'system-prompt' = '你是一个情感分类模型,输出标签:负面、正面、中性'
);
-- 创建源表:模拟商品评价数据
CREATE TEMPORARY VIEW input_table(id, content)
AS VALUES
(1, '质量很好,面料柔软亲肤,尺码也很标准,好评'),
(2, '收到就有线头,洗了一次严重褪色,不值这个价'),
(3, '衣服已收到,和图片一致'),
(4, '穿了两周起球严重,客服还不给退货,差评'),
(5, '版型显瘦,颜色比图片还好看,已经回购第三件了');
-- 创建结果表
CREATE TEMPORARY TABLE output_table (
id INT,
content STRING,
sentiment STRING
) WITH (
'connector' = 'print'
);
-- 使用 ML_PREDICT 进行实时推理
-- 调用示例 1:复用 MODEL 级参数
INSERT INTO output_table
SELECT
id,
content,
response AS sentiment
FROM ML_PREDICT(
TABLE input_table,
MODEL sentiment_model,
DESCRIPTOR(content));
-- 调用示例 2:指定调用级参数
INSERT INTO output_table
SELECT
id,
content,
response AS sentiment
FROM ML_PREDICT(
TABLE input_table,
MODEL sentiment_model,
DESCRIPTOR(content),
MAP['user-prompt', '请用英文回复']);
调用示例 1 输出结果:
|
id |
content |
sentiment |
|
1 |
质量很好,面料柔软亲肤,尺码也很标准,好评 |
正面 |
|
2 |
收到就有线头,洗了一次严重褪色,不值这个价 |
负面 |
|
3 |
衣服已收到,和图片一致 |
正面 |
|
4 |
穿了两周起球严重,客服还不给退货,差评 |
负面 |
|
5 |
版型显瘦,颜色比图片还好看,已经回购第三件了 |
正面 |
调用示例 2 输出结果:
|
id |
content |
sentiment |
|
1 |
质量很好,面料柔软亲肤,尺码也很标准,好评 |
Positive |
|
2 |
收到就有线头,洗了一次严重褪色,不值这个价 |
Negative |
|
3 |
衣服已收到,和图片一致 |
Positive |
|
4 |
穿了两周起球严重,客服还不给退货,差评 |
Negative |
|
5 |
版型显瘦,颜色比图片还好看,已经回购第三件了 |
Positive |
图片
以下示例注册一个多模态模型,对输入图片进行分类。
-- 注册引用内置模型,指定 content-type 为 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'
);
-- 使用 ML_PREDICT 进行实时推理
INSERT INTO output_table
SELECT
id,
content,
response AS sentiment
FROM ML_PREDICT(
TABLE input_table,
MODEL sentiment_model,
DESCRIPTOR(content));
文本 + 单张图片
以下示例注册一个多模态模型,对输入的文本和图片进行对话推理。
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)
));
文本 + 多张图片(多列)
通过多个 INPUT 列分别传入每张图片,content-types 中为每列指定 image_url。
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)
));
文本 + 多张图片(数组)
通过 ARRAY<STRING> 类型列传入多张图片,content-types 中使用 multi_image_urls。
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)
));
调用时指定参数
示例 1:指定内容类型参数
-- CREATE MODEL 时未指定 content-type / content-types,默认 content-type = text
CREATE MODEL model_single
INPUT (input STRING)
OUTPUT (content STRING)
WITH (
'provider' = 'openai-compat',
'model' = 'qwen3.5-plus',
'task' = 'chat/completions'
);
-- 调用 1:沿用 MODEL 参数,内容类型为 text
SELECT content FROM TABLE(ML_PREDICT(
TABLE source_text,
MODEL model_single,
DESCRIPTOR(input)
));
-- 调用 2:调用时指定内容类型为图片
SELECT content FROM TABLE(ML_PREDICT(
TABLE source_img,
MODEL model_single,
DESCRIPTOR(input),
MAP['content-type', 'image_url']
));
示例 2:指定 user-prompt 及列级参数
-- CREATE 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' = '请描述图片内容'
);
-- 调用 1:使用默认配置
SELECT content FROM TABLE(ML_PREDICT(
TABLE source_a, MODEL vl_model, DESCRIPTOR(text_input, image_input)
));
-- 调用 2:覆盖 user-prompt 和列级参数
SELECT content FROM TABLE(ML_PREDICT(
TABLE source_b, MODEL vl_model, DESCRIPTOR(text_input, image_input),
MAP[
'user-prompt', '请用英文回答',
'image_input.min_pixels', '100',
'image_input.max_pixels', '5000'
]
));
-- 调用 3:覆盖 content-types,改变类型组合(两列都当文本处理)
SELECT content FROM TABLE(ML_PREDICT(
TABLE source_c, MODEL vl_model, DESCRIPTOR(text_input, image_input),
MAP['content-types', 'text;text']
));
-- 调用 4:覆盖 content-types,改变类型组合(翻转顺序)
SELECT content FROM TABLE(ML_PREDICT(
TABLE source_c, MODEL vl_model, DESCRIPTOR(text_input, image_input),
MAP['content-types', 'image_url;text']
));