すべてのプロダクト
Search
ドキュメントセンター

Realtime Compute for Apache Flink:汎用呼び出し

最終更新日:Sep 22, 2026

このトピックでは、Flink で ML_PREDICT 関数を使用して AI モデルを呼び出す方法を、構文とパラメーター、呼び出しごとの設定、コンテンツタイプの設定、列レベルのパラメーター、およびテキスト、画像、マルチモーダル推論の例とともに説明します。

クイックスタート

前提条件

  • Flink ワークスペースが作成されている必要があります。 詳細については、「Realtime Compute for Apache Flink の有効化」をご参照ください。

  • Flink AI Service が有効化されている必要があります。 詳細については、「Flink AI Service (組み込みモデル)」をご参照ください。

  • Flink AI Service (組み込みモデル) は、VVR エンジンバージョン 11.7 以降が必要です。

以下の例では、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)
);

制限

  • Realtime Compute engine VVR 11.1 以降が必要です。

  • 一部のパラメーターは、Flink AI Service (組み込みモデル) を使用する場合にのみサポートされ、VVR 11.8 以降が必要です。

  • ML_PREDICT オペレーターのスループットは、Model Studio によるレート制限の対象となります。レート制限に達すると、ML_PREDICT オペレーターでバックプレッシャーが発生し、タイムアウトエラーやジョブの再起動が発生する可能性があります。詳細については、Model Studio の「レート制限」をご参照ください。

  • content-types のタイプ数と記述子のカラム数は、CREATE MODEL で定義された INPUT カラムの数と一致する必要があります。

  • image_url タイプのカラムは STRING でなければなりません。multi_image_urls タイプのカラムは ARRAY<STRING> でなければなりません。

  • base64 画像には data:image/<format>;base64, プレフィックスを含める必要があります。Raw base64 文字列およびローカルファイルパスはサポートされていません。

構文

ML_PREDICT(TABLE <table_name>, MODEL <model_name>, DESCRIPTOR(<input_columns>) [, CONFIG => MAP[...]])

パラメーター

パラメーター

データ型

説明

TABLE

TABLE

モデル推論の入力データストリームです。物理テーブルまたはビューを指定できます。

MODEL

MODEL

登録済みモデルの名前です。詳細については、「モデル設定」をご参照ください。

DESCRIPTOR()

—

モデル推論の入力列です。

説明

VVR 11.8 以降では、複数の入力列がサポートされています。これは、 Flink AI Service (組み込みモデル) を使用する場合にのみ利用可能です。記述子列の数は、 CREATE MODEL INPUT 列の数と一致する必要があります。

CONFIG => MAP[...]

MAP

オプションです。詳細については、「呼び出しごとの設定」をご参照ください。

説明

VVR 11.8 以降で Flink AI Service (組み込みモデル) を使用する場合にのみサポートされています。

呼び出しごとの設定

ML_PREDICT を呼び出す際に、呼び出しごとの設定を指定できます。パラメーターが CREATE MODEL で既に設定されている場合、呼び出しごとの値が優先されますが、MODEL の定義には永続化されません。

パラメーター

説明

例

user-prompt

ユーザープロンプトを指定します。空の文字列を渡すことで、MODEL レベルの値をバイパスできます。

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

content-type

単一列入力のコンテンツタイプを指定します。

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

content-types

複数列入力のコンテンツタイプを指定します。
content-types 内のタイプの数は、CREATE MODEL の INPUT 列の数と一致する必要があります。

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

{column}.{param}

列レベルのパラメーターを指定します。

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

extra-body

追加のパラメーターを JSON 文字列として指定します。

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

bundle-size

バンドルサイズ。

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

バンドル処理は、VVR 11.9 以降でのみサポートされています。

bundle-allow-latency

許容されるバンドルレイテンシー。

コンテンツタイプパラメーター

  • 単一列入力の場合、content-type を使用してコンテンツタイプを指定します。サポートされている値は、text、image_url です。

  • 複数列入力の場合、content-types を使用して各列のコンテンツタイプを指定します。サポートされている値と Flink SQL の列タイプへのマッピングは以下のとおりです。

content-types の値

Flink SQL の型

説明

text

STRING

-

image_url

STRING

-

image_bytes

BYTES

VVR 11.9 以降でサポートされています。

multi_image_bytes

ARRAY<BYTES>

VVR 11.9 以降でサポートされています。

multi_image_urls

ARRAY<STRING>

VVR 11.8 以降でサポートされています。

video_bytes

BYTES

VVR 11.9 以降でサポートされています。

video_url

STRING

VVR 11.9 以降でサポートされています。

  • パラメーターでは content-types を指定することを推奨します。 content-type と content-types の両方を設定すると、フレームワークがエラーを返します。 注: モデルパラメーターと呼び出しごとの設定では、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

—

上記と同じ

列レベルのパラメーター

パラメーター

説明

値

例

{column}.min_pixels

入力画像またはビデオフレームの最小ピクセルしきい値を設定します。min_pixels よりピクセル数が少ない画像は、しきい値を超えるまでアップスケールされます。

Qwen3.7、Qwen3.6、Qwen3.5 では、デフォルト値と最小値はどちらも 65536 です。

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

{column}.max_pixels

入力画像またはビデオフレームの最大ピクセルしきい値を設定します。[min_pixels, max_pixels] 内の画像は元の解像度で処理されます。max_pixels を超える画像はダウンスケールされます。

Qwen3.7、Qwen3.6、Qwen3.5 では、デフォルト値は 2621440、最大値は 16777216 です。

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

{column}.total_pixels

動画から抽出されたすべてのフレームにわたる合計ピクセル数を制限します (単一フレームのピクセル数 x 合計フレーム数)。動画がこの制限を超えた場合、各フレームを [min_pixels, max_pixels] 内に保ちながらフレームがスケールダウンされます。
抽出されるフレームが多い長時間の動画の場合、この値を低くするとトークン消費量と処理時間を削減できますが、画像の詳細が失われる可能性があります。

Qwen3.7 series、Qwen3.6 series、Qwen3.5 series では、デフォルト値と最大値はどちらも 819200000 です。この値は 800000 画像トークンに相当します (32x32 ピクセルの各ブロックが 1 画像トークンに相当)。

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

{column}.cache_control

明示的なキャッシングを有効にします。

{"type": "ephemeral"}

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

{column}.fps

動画理解のためのフレームサンプリングレートを設定します。

有効な値: [0.1, 10]。デフォルト値: 2.0。

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

バンドル処理

  • 処理: バンドル処理は、まず複数の入力レコードをバッチに集約し、そのバッチに対して AI モデルを呼び出します。これにより、モデルの呼び出し回数は減少しますが、各リクエストのモデル推論時間は増加します。レコードを効果的に集約できる場合、バンドル処理は演算子のスループットを大幅に向上させることができます。

  • パラメーターの説明: bundle-size はバッチに蓄積されるレコードの最大数を指定します。bundle-allow-latency は、バッチが bundle-size の値に達していない場合の最大待機時間を指定します。バッチサイズまたは待機時間のいずれかの条件が満たされると、処理が開始されます。

  • 要件: バンドル処理は、モデルの入出力スキーマに基づいて有効になります。

    • テキスト生成: task が chat/completions であるモデルの場合、入力にはテキストの STRING 列が 1 つだけ含まれ、出力には STRING または VARIANT 列が 1 つだけ含まれます。複数列入力や、画像、動画、音声などのマルチモーダル入力はサポートされていません。

    • テキスト埋め込み: task が embeddings であるモデルの場合、入力には STRING 列が 1 つだけ含まれ、出力には ARRAY<浮動小数点> 列が 1 つだけ含まれます。

  • サポートされる関数:サポートされる関数は、ML_PREDICT、テキスト分類 (AI_CLASSIFY)、感情分析 (AI_SENTIMENT)、情報抽出 (AI_EXTRACT)、テキスト要約 (AI_SUMMARIZE)、テキスト翻訳 (AI_TRANSLATE)、データマスキング (AI_MASK)、およびテキスト埋め込み (AI_EMBED) です。このうち、ML_PREDICT は、登録されたモデルが前述の要件を満たす場合にのみバンドル処理をサポートします。

  • グローバル設定: この設定は、前述の要件を満たすジョブ内の ML_PREDICT 呼び出しおよび記載のドメイン固有 AI 関数の呼び出しに適用されます。バンドル処理を有効にするには、次のグローバルパラメーターを使用します。

    -- バンドル処理は VVR 11.9 以降でのみサポートされています。
    SET 'table.exec.ml-predict.bundle-size' = '10';
    SET 'table.exec.ml-predict.bundle-allow-latency' = '5s';
  • 呼び出しごとの設定: これらのパラメーターは、パラメーターが指定された関数呼び出しにのみ適用されます。ML_PREDICT および記載のドメイン固有 AI 関数は、同じ設定方法を使用します。パラメーターと例については、「呼び出しごとの設定」をご参照ください。

エラーハンドリング

制限

  • VVR 11.9 以降でのみサポートされています。

  • モデルの呼び出しが同期モードで実行される場合、エラーハンドリングを有効にすることはできません。

  • 現時点では、エラー処理はベクトル化結果キャッシュ (CACHE_TABLE) と併用できません。

エラーハンドリングの有効化

AI 関数を呼び出す際に、FAIL_ON_ERROR => FALSE パラメーターを追加します。

前提条件:モデルのデフォルトの再試行設定である error-handling-strategy='retry' および retry-fallback-strategy='failover' を維持します。モデルパラメーターの詳細については、「モデル設定」をご参照ください。

パラメーター

説明

必須

デフォルト値

FAIL_ON_ERROR

コールが最終的に失敗した場合にジョブが失敗するかどうかを指定します。このパラメーターを FALSE に設定した場合、失敗したレコードはエラー行として出力され、ジョブは実行を継続します。

いいえ

真

説明

FAIL_ON_ERROR のデフォルトは TRUE で、すべてのリトライが失敗するとジョブは失敗します。このパラメーターを FALSE に設定すると、リトライ動作は変更されず、失敗したレコードの処理方法のみが変更されます。

出力の変更

エラー処理を有効にすると、システムは NULL 値を許容する VARIANT 型のエラー列 err_msg を元の出力フィールドの末尾に追加します。この列はシステムによって生成されるため、入力テーブルまたは CREATE MODEL の OUTPUT 句で宣言する必要はありません。

  • 呼び出し成功: err_msg は NULL です。

  • 最終的に呼び出しは失敗し、すべてのモデル結果フィールドが NULL になり、err_msg にエラー情報が含まれます。

SELECT * を使用すると、結果に新しいエラー列が含まれます。 フィールドを明示的に選択する場合は、列を手動で指定する必要があります。 デフォルトの列名は err_msg です。 名前が既存の出力列と競合する場合、システムは err_msg0 などの数値サフィックスを追加します。 列を参照するには、実際の列名を使用してください。

重要

エラー列を使用して、コールが失敗したかどうかを判断します。NULL ではない値は、失敗したことを示します。モデル結果フィールドが NULL であっても、必ずしもコールが失敗したことを意味するわけではありません。

オブジェクト内のフィールド

内容

SQL 読み取りパターン

message

エラーの原因。問題のトラブルシューティングを行う際は、まずこのフィールドを確認してください。

CAST(err_msg['message'] AS STRING)

stack_trace

より詳細な診断情報。根本原因を特定する必要がある場合は、このフィールドを確認してください。

CAST(err_msg['stack_trace'] AS STRING)

details (オプションフィールド)

基になるエラーが追加情報を含んでいる場合にのみ存在します。

フィールドが存在しない場合は err_msg['details'] は NULL を返し、フィールドが存在する場合は VARIANT 値を返します。

例

AI_SENTIMENT による失敗レコードの保持

ai_sentiment_model という名前の感情分析モデルを準備します。このモデルは登録済みで、非同期呼び出しをサポートしています。

CREATE TEMPORARY VIEW input_data AS
SELECT *
FROM (VALUES
  (1, CAST('xxxx (人間性に反する暴力的な紛争の記述)' AS STRING), 'negative'),
  (2, CAST('この店のカスタマーサービスは常に最高レベルです' AS STRING), 'positive')
) AS t(id, input_text, expected_label);

CREATE TEMPORARY VIEW ai_results AS
SELECT i.id, i.input_text, i.expected_label,
       r.score, r.label, r.confidence, r.err_msg
FROM input_data AS i,
LATERAL TABLE(AI_SENTIMENT(
  MODEL => MODEL ai_sentiment_model,
  INPUT => i.input_text,
  FAIL_ON_ERROR => FALSE,
  CONFIG => MAP['async', 'true']
)) AS r(score, label, confidence, err_msg);

SELECT * FROM ai_results;

このクエリは、以下の列を順番に返します。

出力列

データ型

ソースと説明

id

INT

入力レコードの ID。

input_text

STRING

処理対象の元のテキスト。

score, label, confidence

DOUBLE, STRING, DOUBLE

AI_SENTIMENT によって返されます。呼び出しが失敗した場合、NULL が返されます。

err_msg

VARIANT は、NULL の場合があります

エラー処理が有効な場合に追加されます。呼び出しが成功した場合は NULL、呼び出しが最終的に失敗した場合はエラー VARIANT オブジェクトです。

このクエリは以下の結果を返します。ここに示す結果とエラーメッセージは一例です。実際の結果は異なる場合があります。

id

input_text

score / label / confidence

err_msg

1

xxxx (人間性に反する暴力的な紛争の記述)

NULL

{"message":"com.openai.errors.BadRequestException: 400: <400> InternalError.Algo.DataInspectionFailed: Input text data may contain inappropriate content..... "stack_trace":"org.apache.flink.table.api.TableException: Failed to execute asynchronously prediction with input row xxx}

2

この店のカスタマーサービスは常に最高レベルです

1.0 / positive / 0.99

NULL

その他のエラー例

以下の例は、汎用呼び出しにおけるタイムアウトエラーを示しています。

message: 
java.util.concurrent.TimeoutException: AsyncPredictFunction did not complete within the configured timeout. Increase the ML_PREDICT timeout or check external service connectivity.

stack_trace:
java.util.concurrent.TimeoutException: AsyncPredictFunction did not complete within the configured timeout. Increase the ML_PREDICT timeout or check external service connectivity.
at org.apache.flink.table.runtime.operators.predict.AsyncMLPredictRunner.timeout(AsyncMLPredictRunner.java:153)
at org.apache.flink.table.runtime.operators.predict.AsyncMLPredictRunner.timeout(AsyncMLPredictRunner.java:51)
at org.apache.flink.table.runtime.operators.TableKeyedAsyncWaitOperator$KeyedResultHandler.timerTriggered(TableKeyedAsyncWaitOperator.java:462)
at org.apache.flink.table.runtime.operators.TableKeyedAsyncWaitOperator$KeyedResultHandler.lambda$registerTimeout$1(TableKeyedAsyncWaitOperator.java:457)
at org.apache.flink.table.runtime.operators.TableKeyedAsyncWaitOperator.lambda$registerTimer$4(TableKeyedAsyncWaitOperator.java:486)
at org.apache.flink.streaming.runtime.tasks.StreamTask.invokeProcessingTimeCallback(StreamTask.java:2285)
at org.apache.flink.streaming.runtime.tasks.StreamTask.lambda$deferCallbackToMailbox$28(StreamTask.java:2276)
at org.apache.flink.streaming.runtime.tasks.StreamTaskActionExecutor$1.runThrowing(StreamTaskActionExecutor.java:50)
at org.apache.flink.streaming.runtime.tasks.mailbox.Mail.run(Mail.java:115)
at org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.runMail(MailboxProcessor.java:415)
at org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.processMailsWhenDefaultActionUnavailable(MailboxProcessor.java:384)
at org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.processMail(MailboxProcessor.java:369)
at org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.runMailboxLoop(MailboxProcessor.java:229)
at org.apache.flink.streaming.runtime.tasks.StreamTask.runMailboxLoop(StreamTask.java:1273)
at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:1217)
at org.apache.flink.runtime.taskmanager.Task.runWithSystemExitMonitoring(Task.java:1133)
at org.apache.flink.runtime.taskmanager.Task.restoreAndInvoke(Task.java:1110)
at org.apache.flink.runtime.taskmanager.Task.doRun(Task.java:914)
at org.apache.flink.runtime.taskmanager.Task.run(Task.java:716)
at java.base/java.lang.Thread.run(Thread.java:991)

各エラータイプの処理方法

エラー処理が有効で、デフォルトの再試行設定が維持されている場合、次の動作が適用されます。エラー行とは、入力を保持し、空のモデル結果を返し、失敗の理由を err_msg に記録する行のことです。

エラータイプまたは原因

システムの動作

最終的な出力

ネットワーク接続の失敗、スロットリング、または一時的なサービスエラー (429, 500, 502, 503)

設定された期間待機してからリトライします。

リトライが成功した場合は通常の出力。呼び出しが最終的に失敗した場合はエラー行。

無効なパラメーター、長すぎる入力、無効なキー、権限拒否、またはモデルが見つからない (400, 401, 403, 404, 422)

通常、リトライせずに直接失敗となります。

サービスから返された理由を記録したエラー行。

コンテンツモデレーションによる拒否、または残高やクォータの不足

サービスから返されたエラーに基づいてリトライするかどうかを決定します。

エラーが回復した場合は通常の出力。呼び出しが最終的に失敗した場合はエラー行。

モデルの応答を JSON として解析できない場合

リクエストを再送信します。

再リクエストが成功した場合は通常の出力。呼び出しが最終的に失敗した場合はエラー行。

設定された待機時間を超過しました

現在の待機を終了します。

タイムアウトを示すエラー行。

バンドル処理中に呼び出しが最終的に失敗またはタイムアウトしました

バッチ内の各入力に対して失敗を記録します。

入力ごとに 1 つのエラー行。それぞれが同じ失敗理由を記録します。

例

テキスト

次の例では、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' = 'You are a sentiment classifier. Output one label: negative, positive, or neutral'
);

-- ソーステーブルを作成します:商品レビューの疑似データ
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 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', 'Reply in Chinese']);

例 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

例 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

画像

次の例では、マルチモーダルモデルを登録し、入力画像を分類します。

画像入力カラム (content-type が image_url の場合) は STRING 型で、次の形式をサポートします。

入力形式

使用方法

制限

パブリック URL

モデルサービスがインターネット経由でアクセスできる HTTP または HTTPS の URL 文字列を渡します。モデルサービスが画像を取得します。

URL は、モデルサービスが実行される環境からインターネット経由でアクセスできる必要があります。URL に時間制限がある場合、有効期間はモデルの呼び出し時間をカバーする必要があります。画像形式とサイズはモデルサービスによって制限されます。

Base64 データ URL

data:image/<format>;base64, をプレフィックスとして付与した文字列を渡します。プレーンな Base64 文字列およびローカルファイルパスはサポートされません。

画像バイトは Flink ジョブによって送信されるため、ジョブのネットワークオーバーヘッドが増加します。Base64 エンコーディングにより、データサイズも増加します。データ量は、モデルサービスの入力制限によって制限されます。

画像が Paimon カタログの BLOB 列に保存されている場合は、Paimon Blob の署名付き URL 機能を使用して、入力として使用するパブリック URL を生成できます。詳細については、「Apache Paimon」をご参照ください。

-- content-types を image_url に設定してマルチモーダルモデルを登録します
CREATE TEMPORARY MODEL image_describer_model
INPUT (image_url STRING)
OUTPUT (response STRING)
WITH (
  'provider' = 'openai-compat',
  'task' = 'chat/completions',
  'model' = 'qwen3.5-plus',
  'content-types' = 'image_url',
  'system-prompt' = 'Describe the image briefly.'
);

-- ソースビューを作成します
CREATE TEMPORARY VIEW image_source(url) AS VALUES ('https://www.example.com/cat.jpg');

-- ML_PREDICT を使用して推論を実行します
SELECT
  url,
  response
FROM ML_PREDICT(
  TABLE image_source,
  MODEL image_describer_model,
  DESCRIPTOR(url));

動画

次の例では、入力動画を理解するためにマルチモーダルモデルを登録します。

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

テキスト + 単一画像

次の例では、テキストと画像入力に対するチャットベースの推論に使用するマルチモーダルモデルを登録します。

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', 'How many people are there?');

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 パラメーターを使用し、コンテンツタイプはテキストです
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:ユーザープロンプトとカラムレベルのパラメーターの指定

-- 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:ユーザープロンプトとカラムレベルのパラメーターをオーバーライドします
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']
));