本文介紹如何在 Flink 中使用 ML_PREDICT 函數調用 AI 模型,涵蓋文法與入參說明、調用級參數、內容類型配置、列級參數設定,以及文本、圖片、多模態等多種調用樣本。
快速開始
前提條件
-
已建立 Flink 工作空間,詳情請參見開通Realtime ComputeFlink版。
-
已開通 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)
);
使用限制
-
僅Realtime Compute引擎 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 中的參數值。
|
參數 |
說明 |
樣本 |
|
|
指定使用者提示詞。傳Null 字元串時則不使用MODEL 級參數值。 |
|
|
|
僅輸入單列時,指定內容類型。 |
|
|
|
輸入多列時,指定內容類型。 |
|
|
|
指定列級參數。 |
|
|
|
指定附加參數(JSON 字串)。 |
|
|
|
Bundle 大小。 |
|
|
|
Bundle 允許的延遲時間。 |
內容類型參數
-
僅輸入單列時,可通過
content-type指定內容類型,支援的值:text、image_url。 -
輸入多列時,可通過
content-types指定每列內容類型,支援的值和 Flink SQL 列類型的映射關係:
|
content-types 內容類型 |
Flink SQL 類型 |
說明 |
|
|
|
- |
|
|
|
- |
|
|
|
VVR 11.9.preview.1 及以上版本支援 |
|
|
|
VVR 11.9.preview.1 及以上版本支援 |
|
|
|
VVR 11.8 及以上版本支援 |
|
|
|
VVR 11.9.preview.1 及以上版本支援 |
|
|
|
VVR 11.9.preview.1 及以上版本支援 |
-
請在參數中優先指定
content-types,若同時設定content-type和content-types架構會報錯提示。注意:content-type和content-types在模型參數中設定和調用時設定是相互影響的:
|
建立模型時指定參數 |
調用級參數可使用 |
調用級參數不可使用 |
說明 |
|
|
|
|
可在 |
|
|
|
|
可改變類型組合,如 |
|
未指定 |
|
— |
同上 |
列級參數
|
參數 |
說明 |
參數值 |
樣本 |
|
|
設定輸入映像或視訊框架的最小像素閾值。當輸入映像或視訊框架的像素小於 |
|
|
|
|
設定輸入映像或視訊框架的最大像素閾值。當輸入映像或視頻的像素在 |
|
|
|
|
限制從視頻中抽取的所有幀的總像素(單幀映像像素 × 總幀數)。如果視頻總像素超過此限制,系統將對視訊框架進行縮放,但仍會確保單幀映像的像素值在 |
|
|
|
|
用於開啟顯式緩衝。 |
|
|
|
|
使用者佈建視頻理解的抽幀頻率 |
取值範圍為 [0.1, 10],預設值為 2.0 |
|
Bundle 處理
-
處理方式:Bundle 處理會先將多條輸入資料彙總成一個批次,再統一調用 AI 模型。這種處理方式可以減少模型調用次數,但會增加單次請求的模型推理時間,在資料被有效彙總時能明顯提升運算元輸送量。
-
參數說明:
bundle-size用於指定單個批次最多積累的資料條數;bundle-allow-latency用於指定批次未達到bundle-size時允許等待的最長時間。達到批次大小或等待時間長度任一條件時觸發處理。 -
資料類型:僅支援
text。 -
適用函數:
ML_PREDICT、文本分類(AI_CLASSIFY)、情感分析(AI_SENTIMENT)、資訊提取(AI_EXTRACT)、文本摘要(AI_SUMMARIZE)、文本翻譯(AI_TRANSLATE)、資料脫敏(AI_MASK)及文本向量化(AI_EMBED)。 -
全域配置:對作業內所有
ML_PREDICT和上述垂類 AI Function 調用生效。使用以下全域參數開啟 Bundle 處理:SET 'table.exec.ml-predict.bundle-size' = '10'; SET 'table.exec.ml-predict.bundle-allow-latency' = '5s'; -
調用級配置:僅對配置了參數的函數調用生效;
ML_PREDICT與上述垂類函數的配置方式相同。具體參數和樣本請參見調用級參數。
樣本
文本
以下樣本註冊並引用 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)為STRING類型,支援以下兩種內容形式:
|
輸入形式 |
用法 |
限制 |
|
公網URL |
直接傳入模型服務可通過公網訪問的HTTP/HTTPS URL字串,由模型服務自行拉取圖片。 |
URL必須可被模型服務所在環境通過公網訪問;若URL具有時效性,有效期間需覆蓋模型調用耗時;圖片格式與大小受模型服務側限制。 |
|
Base64 Data URL |
傳入以 |
圖片位元組需經Flink作業傳輸,會增加作業網路開銷;Base64編碼後資料體積增大;資料量受模型服務側輸入限制約束。 |
如果圖片儲存在使用Paimon Catalog的Blob列中,可以利用Paimon提供的Blob預簽名URL功能產生公網URL作為輸入,詳情請參見流式資料湖倉Paimon。
-- 註冊引用內建模型,指定 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 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' = '請簡單描述下視頻內容'
);
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));
文本 + 單張圖片
以下樣本註冊一個多模態模型,對輸入的文本和圖片進行對話推理。
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)
)); 文本 + 視頻
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', '有幾個人');
SELECT
content,
response AS sentiment
FROM ML_PREDICT(
TABLE input_table,
MODEL sentiment_model,
DESCRIPTOR(content, question));
調用時指定參數
樣本 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']
));