All Products
Search
Document Center

Realtime Compute for Apache Flink:Pemanggilan umum

Last Updated:Sep 22, 2026

Topik ini menjelaskan cara menggunakan fungsi ML_PREDICT untuk memanggil model AI di Flink, mencakup sintaks dan parameter, konfigurasi per-pemanggilan, konfigurasi tipe konten, parameter tingkat kolom, serta contoh inferensi teks, gambar, dan multimodal.

Mulai cepat

Prasyarat

Contoh berikut menunjukkan cara menggunakan ML_PREDICT untuk memanggil model bawaan Flink. Buka Data Development > ETL, buat pekerjaan, tempel kode, lalu klik 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)
);

Batasan

  • Diperlukan mesin Realtime Compute VVR 11.1 atau lebih baru.

  • Beberapa parameter hanya didukung saat menggunakan Flink AI Service (model bawaan) dan memerlukan VVR 11.8 atau lebih baru.

  • Tingkat throughput operator ML_PREDICT tunduk pada pembatasan laju oleh Model Studio. Saat batas laju tercapai, tekanan balik terjadi pada operator ML_PREDICT, yang dapat menyebabkan error timeout dan restart pekerjaan. Untuk informasi selengkapnya, lihat Batas laju di Model Studio.

  • Jumlah tipe dalam content-types dan jumlah kolom dalam DESCRIPTOR harus sesuai dengan jumlah kolom INPUT yang didefinisikan dalam CREATE MODEL.

  • Kolom bertipe image_url harus bertipe STRING. Kolom bertipe multi_image_urls harus bertipe ARRAY<STRING>.

  • Gambar base64 harus menyertakan awalan data:image/<format>;base64,. String base64 mentah dan path file lokal tidak didukung.

Sintaks

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

Parameter

Parameter

Tipe data

Deskripsi

TABLE

TABLE

Aliran data masukan untuk inferensi model. Anda dapat menentukan tabel fisik atau tampilan.

MODEL

MODEL

Nama model yang telah didaftarkan. Untuk informasi selengkapnya, lihat Pengaturan model.

DESCRIPTOR()

—

Kolom masukan untuk inferensi model.

Catatan

VVR 11.8 dan versi lebih baru mendukung beberapa kolom masukan. Fitur ini hanya tersedia saat menggunakan Flink AI Service (model bawaan). Jumlah kolom DESCRIPTOR harus sesuai dengan jumlah kolom INPUT dalam CREATE MODEL.

CONFIG => MAP[...]

MAP

Opsional. Untuk informasi selengkapnya, lihat Konfigurasi per-pemanggilan.

Catatan

Hanya didukung di VVR 11.8 dan versi lebih baru dengan Flink AI Service (model bawaan).

Konfigurasi per-pemanggilan

Anda dapat menentukan konfigurasi per-pemanggilan saat memanggil ML_PREDICT. Jika suatu parameter sudah ditetapkan dalam CREATE MODEL, nilai per-pemanggilan akan mengambil prioritas tetapi tidak mengubah definisi MODEL secara permanen.

Parameter

Deskripsi

Contoh

user-prompt

Menentukan prompt pengguna. Berikan string kosong untuk melewati nilai tingkat MODEL.

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

content-type

Menentukan tipe konten untuk masukan satu kolom.

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

content-types

Menentukan tipe konten untuk masukan multi-kolom.
Jumlah tipe dalam content-types harus sesuai dengan jumlah kolom INPUT dalam CREATE MODEL.

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

{column}.{param}

Menentukan parameter tingkat kolom.

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

extra-body

Menentukan parameter tambahan sebagai string JSON.

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

bundle-size

Ukuran bundel.

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

Pemrosesan bundel hanya didukung di VVR 11.9 dan versi lebih baru.

bundle-allow-latency

Latensi bundel yang diizinkan.

Parameter tipe konten

  • Untuk masukan satu kolom, gunakan content-type untuk menentukan tipe konten. Nilai yang didukung: text, image_url.

  • Untuk masukan multi-kolom, gunakan content-types untuk menentukan tipe konten setiap kolom. Nilai yang didukung dan pemetaannya ke tipe kolom Flink SQL tercantum di bawah ini:

Nilai content-types

Tipe Flink SQL

Deskripsi

text

STRING

-

image_url

STRING

-

image_bytes

BYTES

Didukung di VVR 11.9 dan versi lebih baru.

multi_image_bytes

ARRAY<BYTES>

Didukung di VVR 11.9 dan versi lebih baru.

multi_image_urls

ARRAY<STRING>

Didukung di VVR 11.8 dan versi lebih baru.

video_bytes

BYTES

Didukung di VVR 11.9 dan versi lebih baru.

video_url

STRING

Didukung di VVR 11.9 dan versi lebih baru.

  • Kami menyarankan Anda menentukan content-types dalam parameter. Jika Anda menetapkan keduanya content-type dan content-types, framework akan melaporkan error. Catatan: pengaturan content-type dan content-types dalam parameter model dan pengaturan per-pemanggilan saling memengaruhi:

Pengaturan CREATE MODEL

Opsi per-pemanggilan yang diizinkan

Opsi per-pemanggilan yang tidak diizinkan

Deskripsi

content-type (satu kolom)

content-type

content-types

Anda dapat beralih antara text dan image_url

content-types (beberapa kolom)

content-types

content-type

Anda dapat mengubah kombinasi tipe, misalnya dari text;image_url menjadi text;text

Tidak ada content-type maupun content-types yang ditentukan

content-type
content-types

—

Sama seperti di atas

Parameter tingkat kolom

Parameter

Deskripsi

Nilai

Contoh

{column}.min_pixels

Menetapkan ambang batas piksel minimum untuk gambar atau frame video masukan. Gambar dengan jumlah piksel kurang dari min_pixels akan ditingkatkan skalanya hingga melebihi ambang batas tersebut.

Qwen3.7, Qwen3.6, Qwen3.5: nilai default dan minimum keduanya adalah 65536.

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

{column}.max_pixels

Menetapkan ambang batas piksel maksimum untuk gambar atau frame video masukan. Gambar dalam rentang [min_pixels, max_pixels] diproses dengan resolusi aslinya. Gambar yang melebihi max_pixels akan dikurangi skalanya.

Qwen3.7, Qwen3.6, Qwen3.5: nilai default adalah 2621440, maksimum adalah 16777216.

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

{column}.total_pixels

Membatasi total piksel di semua frame yang diekstraksi dari video (piksel per frame x jumlah frame total). Jika video melebihi batas ini, frame akan diskalakan sambil tetap menjaga setiap frame dalam rentang [min_pixels, max_pixels].
Untuk video panjang dengan banyak frame yang diekstraksi, Anda dapat menurunkan nilai ini untuk mengurangi konsumsi token dan waktu pemrosesan, tetapi hal ini dapat menyebabkan hilangnya detail gambar.

Seri Qwen3.7, Seri Qwen3.6, Seri Qwen3.5: nilai default dan maksimum keduanya adalah 819200000. Nilai ini setara dengan 800000 token gambar (setiap blok piksel 32x32 setara dengan 1 token gambar).

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

{column}.cache_control

Mengaktifkan caching eksplisit.

{"type": "ephemeral"}

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

{column}.fps

Menetapkan laju pengambilan sampel frame untuk pemahaman video.

Nilai valid: [0.1, 10]. Nilai default: 2.0.

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

Pemrosesan bundel

  • Pemrosesan: Pemrosesan bundel pertama-tama menggabungkan beberapa catatan masukan menjadi satu batch, lalu memanggil model AI untuk batch tersebut. Hal ini mengurangi jumlah pemanggilan model tetapi meningkatkan waktu inferensi model untuk setiap permintaan. Ketika catatan dapat digabungkan secara efektif, pemrosesan bundel dapat meningkatkan throughput operator secara signifikan.

  • Deskripsi parameter: bundle-size menentukan jumlah maksimum catatan yang dikumpulkan dalam satu batch. bundle-allow-latency menentukan waktu tunggu maksimum ketika batch belum mencapai nilai bundle-size. Pemrosesan dimulai ketika salah satu kondisi ukuran batch atau waktu tunggu terpenuhi.

  • Persyaratan: Pemrosesan bundel berlaku berdasarkan skema masukan dan keluaran model.

    • Generasi teks: Untuk model yang memiliki task chat/completions, masukan berisi tepat satu kolom STRING berupa teks, dan keluaran berisi tepat satu kolom STRING atau VARIANT. Masukan multi-kolom dan masukan multimodal seperti gambar, video, dan audio tidak didukung.

    • Text embedding: Untuk model yang memiliki task embeddings, masukan berisi tepat satu kolom STRING, dan keluaran berisi tepat satu kolom ARRAY<FLOAT>.

  • Fungsi yang didukung: ML_PREDICT, klasifikasi teks (AI_CLASSIFY), analisis sentimen (AI_SENTIMENT), ekstraksi informasi (AI_EXTRACT), Ringkasan teks (AI_SUMMARIZE), translation (AI_TRANSLATE), penyamaran data (AI_MASK), dan text embedding (AI_EMBED). Di antaranya, ML_PREDICT mendukung pemrosesan bundel hanya jika model yang terdaftar memenuhi persyaratan di atas.

  • Konfigurasi global: Konfigurasi ini berlaku untuk pemanggilan ML_PREDICT dan pemanggilan fungsi AI spesifik domain yang tercantum dalam pekerjaan yang memenuhi persyaratan di atas. Gunakan parameter global berikut untuk mengaktifkan pemrosesan bundel:

    -- Pemrosesan bundel hanya didukung di VVR 11.9 dan versi lebih baru.
    SET 'table.exec.ml-predict.bundle-size' = '10';
    SET 'table.exec.ml-predict.bundle-allow-latency' = '5s';
  • Konfigurasi per-pemanggilan: Parameter ini hanya berlaku untuk pemanggilan fungsi tempat parameter tersebut ditentukan. ML_PREDICT dan fungsi AI spesifik domain yang tercantum menggunakan metode konfigurasi yang sama. Untuk parameter dan contoh, lihat Konfigurasi per-pemanggilan.

Penanganan error

Batasan

  • Hanya didukung di VVR 11.9 dan versi lebih baru.

  • Anda tidak dapat mengaktifkan penanganan error saat pemanggilan model berjalan dalam mode sinkron.

  • Penanganan error tidak dapat digunakan bersamaan dengan Vectorization result cache (CACHE_TABLE) saat ini.

Aktifkan penanganan error

Tambahkan parameter FAIL_ON_ERROR => FALSE saat Anda memanggil fungsi AI.

Prasyarat: Pertahankan pengaturan retry default model: error-handling-strategy='retry' dan retry-fallback-strategy='failover'. Untuk informasi selengkapnya tentang parameter model, lihat Pengaturan model.

Parameter

Deskripsi

Wajib

Nilai default

FAIL_ON_ERROR

Menentukan apakah pekerjaan gagal saat pemanggilan akhirnya gagal. Jika Anda menetapkan parameter ini ke FALSE, catatan yang gagal akan dikeluarkan sebagai baris error dan pekerjaan tetap berjalan.

Tidak

TRUE

Catatan

FAIL_ON_ERROR secara default bernilai TRUE, sehingga pekerjaan gagal setelah semua upaya retry habis. Menetapkan parameter ini ke FALSE hanya mengubah cara penanganan catatan yang gagal, bukan perilaku retry.

Perubahan output

Setelah Anda mengaktifkan penanganan error, sistem menambahkan kolom error err_msg bertipe VARIANT nullable di akhir bidang output asli. Kolom ini dihasilkan oleh sistem. Anda tidak perlu mendeklarasikannya di tabel masukan atau dalam klausa OUTPUT CREATE MODEL.

  • Pemanggilan berhasil: err_msg bernilai NULL.

  • Pemanggilan akhirnya gagal: semua bidang hasil model bernilai NULL, dan err_msg berisi informasi error.

Jika Anda menggunakan SELECT *, hasilnya mencakup kolom error baru. Jika Anda memilih bidang secara eksplisit, Anda harus menentukan kolom tersebut secara manual. Nama kolom default adalah err_msg. Jika nama tersebut bentrok dengan kolom output yang sudah ada, sistem akan menambahkan sufiks numerik, seperti err_msg0. Gunakan nama kolom aktual untuk mereferensinya.

Penting

Gunakan kolom error untuk menentukan apakah pemanggilan gagal: nilai yang tidak NULL menunjukkan kegagalan. Bidang hasil model yang bernilai NULL tidak selalu menunjukkan pemanggilan yang gagal.

Bidang dalam objek

Konten

Pola pembacaan SQL

message

Penyebab error. Periksa bidang ini terlebih dahulu saat melakukan troubleshooting.

CAST(err_msg['message'] AS STRING)

stack_trace

Informasi diagnostik yang lebih rinci. Periksa bidang ini saat Anda perlu menemukan akar penyebabnya.

CAST(err_msg['stack_trace'] AS STRING)

details (bidang opsional)

Hanya muncul jika error dasar membawa informasi tambahan.

err_msg['details'] mengembalikan NULL jika bidang tidak ada, atau nilai VARIANT jika bidang tersebut ada.

Contoh

AI_SENTIMENT menyimpan catatan yang gagal

Siapkan model analisis sentimen bernama ai_sentiment_model, yang telah didaftarkan dan mendukung panggilan asinkron.

CREATE TEMPORARY VIEW input_data AS
SELECT *
FROM (VALUES
  (1, CAST('xxxx (a description of violent conflict that violates humanity)' AS STRING), 'negative'),
  (2, CAST('The customer service of this store has always been among the best' 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;

Kueri mengembalikan kolom-kolom berikut secara berurutan.

Kolom output

Tipe data

Sumber dan deskripsi

id

INT

ID catatan masukan.

input_text

STRING

Teks asli yang akan diproses.

score / label / confidence

STRING

Dikembalikan oleh AI_SENTIMENT. NULL jika pemanggilan gagal.

err_msg

VARIANT, bisa NULL

Ditambahkan setelah penanganan error diaktifkan. NULL untuk pemanggilan yang berhasil, atau objek VARIANT error untuk pemanggilan yang akhirnya gagal.

Kueri mengembalikan hasil berikut. Ringkasan dan pesan error hanyalah contoh. Hasil aktual dapat berbeda.

id

input_text

score / label / confidence

err_msg

1

xxxx (a description of violent conflict that violates humanity)

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

The customer service of this store has always been among the best

1.0 / positive / 0.99

NULL

Contoh error lainnya

Contoh berikut menunjukkan error timeout dalam pemanggilan umum.

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)

Cara penanganan setiap jenis error

Perilaku berikut berlaku saat penanganan error diaktifkan dan pengaturan retry default dipertahankan. Baris error adalah baris yang menyimpan masukan, mengembalikan hasil model kosong, dan mencatat alasan kegagalan dalam err_msg.

Jenis error atau penyebab

Perilaku sistem

Output akhir

Kegagalan koneksi jaringan, pembatasan kecepatan, atau error layanan sementara (429, 500, 502, 503)

Menunggu periode yang dikonfigurasi lalu mencoba ulang.

Output normal jika retry berhasil. Baris error jika pemanggilan akhirnya gagal.

Parameter tidak valid, masukan terlalu panjang, kunci tidak valid, izin ditolak, atau model tidak ditemukan (400, 401, 403, 404, 422)

Umumnya langsung mengembalikan kegagalan tanpa mencoba ulang.

Baris error yang mencatat alasan yang dikembalikan oleh layanan.

Penolakan moderasi konten, atau saldo atau kuota tidak mencukupi

Memutuskan apakah akan mencoba ulang berdasarkan error yang dikembalikan oleh layanan.

Output normal jika error pulih. Baris error jika pemanggilan akhirnya gagal.

Hasil JSON diperlukan, tetapi respons model tidak dapat diurai

Mengirim permintaan lagi.

Output normal jika permintaan berhasil. Baris error jika pemanggilan akhirnya gagal.

Periode tunggu yang dikonfigurasi terlampaui

Mengakhiri waktu tunggu saat ini.

Baris error yang menunjukkan timeout.

Pemanggilan akhirnya gagal atau timeout selama pemrosesan bundel

Mencatat kegagalan untuk setiap masukan dalam batch.

Satu baris error per masukan, masing-masing mencatat alasan kegagalan yang sama.

Contoh

Teks

Contoh berikut mendaftarkan dan menggunakan model bawaan Flink AI Service untuk mengklasifikasikan teks masukan berdasarkan sentimen. Contoh 1 menggunakan parameter tingkat MODEL. Contoh 2 mengganti user-prompt saat pemanggilan.

-- Mendaftarkan model bawaan. Saat content-type tidak ditentukan, nilai default-nya adalah 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'
);

-- Membuat tabel sumber: data ulasan produk simulasi
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');

-- Membuat tabel hasil
CREATE TEMPORARY TABLE output_table (
  id INT,
  content STRING,
  sentiment STRING
) WITH (
  'connector' = 'print'
);

-- Menggunakan ML_PREDICT untuk inferensi real-time
-- Contoh 1: Menggunakan parameter tingkat MODEL
INSERT INTO output_table
SELECT
  id,
  content,
  response AS sentiment
FROM ML_PREDICT(
  TABLE input_table,
  MODEL sentiment_model,
  DESCRIPTOR(content));

-- Contoh 2: Menentukan parameter per-pemanggilan
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']);

Output Contoh 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

Output Contoh 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

Gambar

Contoh berikut mendaftarkan model multimodal dan mengklasifikasikan gambar masukan.

Kolom masukan gambar (saat content-type adalah image_url) bertipe STRING dan mendukung format berikut:

Format masukan

Penggunaan

Batasan

URL publik

Gunakan string URL HTTP atau HTTPS yang dapat diakses oleh layanan model melalui Internet. Layanan model akan mengambil gambarnya.

URL harus dapat diakses melalui Internet dari lingkungan tempat layanan model berjalan. Jika URL memiliki batas waktu, periode validitasnya harus mencakup durasi pemanggilan model. Format dan ukuran gambar dibatasi oleh layanan model.

URL data Base64

Gunakan string yang diawali dengan data:image/<format>;base64,. String Base64 biasa dan path file lokal tidak didukung.

Byte gambar dikirimkan oleh pekerjaan Flink, yang meningkatkan overhead jaringan pekerjaan. Pengkodean Base64 juga meningkatkan ukuran data. Volume data dibatasi oleh batas masukan layanan model.

Jika gambar disimpan dalam kolom Blob dari Paimon Catalog, Anda dapat menggunakan fitur Paimon Blob presigned URL untuk menghasilkan URL publik sebagai masukan. Untuk informasi selengkapnya, lihat Apache Paimon.

-- Mendaftarkan model bawaan dengan content-type diatur ke 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'
);

-- Menggunakan ML_PREDICT untuk inferensi real-time
INSERT INTO output_table
SELECT
  id,
  content,
  response AS sentiment
FROM ML_PREDICT(
  TABLE input_table,
  MODEL sentiment_model,
  DESCRIPTOR(content));

Video

Contoh berikut mendaftarkan model multimodal untuk memahami video masukan.

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

Teks + gambar tunggal

Contoh berikut mendaftarkan model multimodal untuk inferensi berbasis chat pada masukan teks dan gambar.

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

Teks + beberapa gambar (beberapa kolom)

Teruskan setiap gambar melalui kolom INPUT terpisah. Tentukan image_url untuk setiap kolom gambar dalam 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)
));          

Teks + beberapa gambar (array)

Teruskan beberapa gambar dalam kolom ARRAY<STRING>. Gunakan multi_image_urls dalam 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)
)); 

Teks + video

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

Contoh parameter per-pemanggilan

Contoh 1: Menentukan parameter tipe konten

-- Saat content-type / content-types tidak ditentukan dalam CREATE MODEL, nilai default-nya adalah content-type = text
CREATE MODEL model_single
INPUT (input STRING)
OUTPUT (content STRING)
WITH (
  'provider' = 'openai-compat',
  'model' = 'qwen3.5-plus',
  'task' = 'chat/completions'
);

-- Pemanggilan 1: Menggunakan parameter MODEL, tipe konten adalah text
SELECT content FROM TABLE(ML_PREDICT(
  TABLE source_text,
  MODEL model_single,
  DESCRIPTOR(input)
));

-- Pemanggilan 2: Mengganti tipe konten ke image saat pemanggilan
SELECT content FROM TABLE(ML_PREDICT(
  TABLE source_img,
  MODEL model_single,
  DESCRIPTOR(input),
  MAP['content-type', 'image_url']
));

Contoh 2: Menentukan user-prompt dan parameter tingkat kolom

-- Menetapkan konfigurasi default dalam CREATE MODEL (model multi-kolom)
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'
);

-- Pemanggilan 1: Menggunakan konfigurasi default
SELECT content FROM TABLE(ML_PREDICT(
  TABLE source_a, MODEL vl_model, DESCRIPTOR(text_input, image_input)
));

-- Pemanggilan 2: Mengganti user-prompt dan parameter tingkat kolom
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'
  ]
));

-- Pemanggilan 3: Mengganti content-types untuk mengubah kombinasi tipe (perlakukan kedua kolom sebagai text)
SELECT content FROM TABLE(ML_PREDICT(
  TABLE source_c, MODEL vl_model, DESCRIPTOR(text_input, image_input),
  MAP['content-types', 'text;text']
));

-- Pemanggilan 4: Mengganti content-types untuk mengubah kombinasi tipe (urutan terbalik)
SELECT content FROM TABLE(ML_PREDICT(
  TABLE source_c, MODEL vl_model, DESCRIPTOR(text_input, image_input),
  MAP['content-types', 'image_url;text']
));