通用调用

更新时间:
复制 MD 格式

本文介绍如何在 Flink 中使用 ML_PREDICT 函数调用 AI 模型,涵盖语法与入参说明、调用级参数、内容类型配置、列级参数设置,以及文本、图片、多模态等多种调用示例。

快速开始

前提条件

以下示例演示如何使用 ML_PREDICT 调用 Flink 内置模型。请在数据开发 > ETL页面,新建作业、复制代码后点击调试。。

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 中的参数值。

参数

说明

示例

user-prompt

指定用户提示词。传空字符串时则不使用MODEL 级参数值。

MAP['user-prompt', '请用英文回答']

content-type

仅输入单列时,指定内容类型。

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

content-types

输入多列时,指定内容类型。
content-types 中的类型数量必须与 CREATE MODEL 中 INPUT 的列数一致。

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

{列名}.{参数名}

指定列级参数。

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

extra-body

指定附加参数(JSON 字符串)。

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

内容类型参数

  • 仅输入单列时,可通过 content-type 指定内容类型,支持的值:textimage_url

  • 输入多列时,可通过 content-types 指定每列内容类型,支持的值:textimage_urlmulti_image_urls

  • content-type 和 content-types 仅可指定其中一个,且受 CREATE MODEL 时设置的参数影响:

创建模型时指定参数

调用级参数可使用

调用级参数不可使用

说明

content-type(单列)

content-type

content-types

可在 text 和 image_url 间切换

content-types(多列)

content-types

content-type

可改变类型组合,如 text;image_url → text;text

未指定 content-type 或 content-types

content-type
content-types

同上

列级参数

参数

说明

参数值

示例

{列名}.min_pixels

设定输入图像或视频帧的最小像素阈值。当输入图像或视频帧的像素小于 min_pixels 时,会将其进行放大,直到总像素高于 min_pixels

Qwen3.7Qwen3.6Qwen3.5:默认值和最小值均为 65536

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

{列名}.max_pixels

设定输入图像或视频帧的最大像素阈值。当输入图像或视频的像素在 [min_pixels, max_pixels] 区间内时,模型会按原图进行识别。当输入图像像素大于 max_pixels 时,会将图像进行缩小,直到总像素低于 max_pixels

Qwen3.7Qwen3.6Qwen3.5:默认值为 2621440,最大值为 16777216

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

{列名}.total_pixels

限制从视频中抽取的所有帧的总像素(单帧图像像素 × 总帧数)。如果视频总像素超过此限制,系统将对视频帧进行缩放,但仍会确保单帧图像的像素值在 [min_pixels, max_pixels] 范围内。
对于抽帧数量较多的长视频,可适当降低此值以减少 Token 消耗和处理时间,但这可能会导致图像细节丢失。

Qwen3.7系列Qwen3.6系列Qwen3.5系列:默认值和最大值均为 819200000,该值对应 800000 个图像 Token(每 32×32 像素对应 1 个图像 Token)。

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

{列名}.cache_control

用于开启显式缓存。

{"type": "ephemeral"}

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

示例

文本

以下示例注册并引用 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']
));