Mengoptimalkan biaya fungsi AI
Dokumen ini menjelaskan cara menggunakan mode yang dioptimalkan untuk fungsi AI terkelola di BigQuery. Mode ini memungkinkan Anda memproses set data skala besar yang berisi ribuan, atau bahkan miliaran, baris dengan konsumsi token model bahasa besar (LLM) dan latensi kueri yang jauh lebih rendah dibandingkan dengan inferensi LLM per baris standar.
Contoh berikut menunjukkan cara menggunakan fungsi AI.CLASSIFY
dengan mode yang dioptimalkan untuk mengategorikan artikel berita, menggunakan text-embedding-005
sebagai model embedding:
SELECT
title,
body,
AI.CLASSIFY(
body,
categories => ['tech', 'sport', 'business', 'other'],
embeddings => AI.EMBED(body, endpoint => 'text-embedding-005', task_type => 'CLASSIFICATION').result,
-- Optional, 'MINIMIZE_COST' is the default when embeddings are provided.
optimization_mode => 'MINIMIZE_COST'
) AS category
FROM
`bigquery-public-data.bbc_news.fulltext`;
Argumen optimization_mode => 'MINIMIZE_COST' mengaktifkan mode yang dioptimalkan. Ini adalah setelan default saat embedding disediakan, sehingga Anda dapat menghapus argumen ini.
Untuk contoh ini, embedding dibuat secara langsung. Dalam praktiknya, sebaiknya materialisasikan embedding agar dapat digunakan kembali.
Cara kerja mode yang dioptimalkan
Fungsi AI terkelola, AI.IF dan AI.CLASSIFY, biasanya memanggil
LLM jarak jauh untuk setiap baris dalam set data Anda. Saat Anda menggunakan mode yang dioptimalkan, BigQuery akan otomatis melatih model ringkas dan terdistilasi selama eksekusi kueri.
Prosesnya berjalan sebagai berikut:

- Pengambilan sampel dan pemberian label: BigQuery memilih sampel representatif kecil dari data Anda dan memanggil Gemini untuk memberikan label.
- Pelatihan model terdistilasi: model terdistilasi lokal dilatih tepat waktu menggunakan label LLM dan embedding data sebagai fitur.
- Pemeriksaan kualitas: BigQuery mengevaluasi akurasi model terdistilasi terhadap hasil LLM. Secara default, jika model terdistilasi gagal memenuhi nilai minimum kualitas yang diperlukan, kueri akan gagal dengan error yang menjelaskan alasan model tersebut dihapus. Jika model memiliki kualitas yang dapat diterima, BigQuery mungkin masih menggunakan LLM jarak jauh untuk baris tertentu guna mempertahankan kualitas yang konsisten, atau untuk baris yang tidak memiliki embedding yang valid.
- Inferensi: model terdistilasi memproses sebagian besar baris, sehingga mengurangi jumlah panggilan Gemini secara signifikan.
Batasan
Mode yang dioptimalkan memiliki batasan berikut:
- Jumlah baris minimum: input ke fungsi AI harus berisi sekitar 3.000 baris untuk memastikan data yang cukup untuk pelatihan model.
- Jenis data: untuk perintah yang mereferensikan beberapa kolom, hanya kolom string yang didukung untuk pengoptimalan.
- Klasifikasi multi-label:
AI.CLASSIFYdenganoutput_mode => 'multi'tidak didukung dalam mode yang dioptimalkan. - Dukungan fungsi: hanya fungsi
AI.IFdanAI.CLASSIFYyang mendukung mode yang dioptimalkan. - Rasio error: Argumen
max_error_ratiotidak didukung dalam mode yang dioptimalkan.
Sebelum memulai
Untuk mendapatkan izin yang diperlukan untuk menjalankan fungsi AI terkelola di BigQuery, lihat Menetapkan izin untuk fungsi AI generatif yang memanggil LLM Vertex AI.
Memilih model embedding
Untuk menggunakan mode yang dioptimalkan, Anda harus menghitung embedding untuk data Anda dan memberikannya ke fungsi AI. Agar kolom input memiliki embedding terkait, semua baris harus memiliki dimensi embedding yang konsisten dan dibuat oleh model embedding yang sama.
Untuk kualitas dan skalabilitas biaya terbaik, sebaiknya hitung embedding untuk
data Anda menggunakan model embedding, seperti
text-embedding-005 atau embedding Gemini
untuk tugas bahasa Inggris atau multibahasa. Untuk data multimodal (teks dan gambar), gunakan model embedding multimodal seperti
multimodalembedding@001.
Membuat embedding
Anda dapat menghitung embedding untuk data Anda menggunakan pembuatan otonom yang dikelola oleh BigQuery, atau dengan membuat kolom embedding secara manual.
Bagian berikut menjelaskan cara menggunakan kedua pendekatan dengan fungsi AI.CLASSIFY dan AI.IF.
Pembuatan embedding otonom
Jika Anda menggunakan pembuatan embedding otonom,
BigQuery akan otomatis menggunakan embedding saat AI.IF atau
AI.CLASSIFY dipanggil. Ini adalah pendekatan yang direkomendasikan, tetapi terbatas pada satu kolom embedding per tabel.
Contoh berikut membuat tabel dengan kolom embedding yang dibuat secara otonom, menggunakan text-embedding-005 sebagai model embedding, lalu menggunakan fungsi AI.CLASSIFY untuk mengategorikan data:
-- Create a table with an autonomously generated embedding column
CREATE TABLE my_dataset.bbc_news (
title STRING,
body STRING,
body_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
GENERATED ALWAYS AS (
AI.EMBED(
body,
connection_id => '<my_connection_id>',
task_type => 'CLASSIFICATION',
endpoint => 'text-embedding-005')
) STORED
OPTIONS(asynchronous = TRUE)
);
-- Insert data into the table
INSERT INTO my_dataset.bbc_news (title, body)
SELECT title, body FROM `bigquery-public-data.bbc_news.fulltext`;
-- Run the optimized query.
-- Wait for the background job to finish generating embeddings before running.
SELECT
title,
body,
AI.CLASSIFY(
body,
categories => ['tech', 'sport', 'business', 'other']
) AS category
FROM
my_dataset.bbc_news;
Spesifikasi kolom manual
Jika Anda memiliki kolom embedding yang ada, tentukan kolom tersebut dalam argumen embeddings dari AI.IF atau AI.CLASSIFY. Anda dapat membuatnya menggunakan fungsi
AI.EMBED.
Contoh berikut menunjukkan cara membuat tabel dengan kolom embedding, menggunakan text-embedding-005 sebagai model embedding, lalu menggunakan kolom tersebut dalam kueri AI.CLASSIFY:
-- Create a table with an embedding column
CREATE TABLE my_dataset.bbc_news AS
SELECT
title,
body,
AI.EMBED(
body,
endpoint => 'text-embedding-005',
task_type => 'CLASSIFICATION'
).result AS body_embedding
FROM
`bigquery-public-data.bbc_news.fulltext`;
-- Run the optimized query
SELECT
title,
body,
AI.CLASSIFY(
body,
categories => ['tech', 'sport', 'business', 'other'],
embeddings => body_embedding,
) AS category
FROM
my_dataset.bbc_news;
Jika perintah Anda mereferensikan beberapa kolom, berikan daftar nama kolom dan embedding yang sesuai dalam argumen embeddings. Contoh:
embeddings => [('body', body_embedding), ('title', title_embedding)].
Memantau pengoptimalan kueri
Untuk memverifikasi jumlah baris yang dioptimalkan selama eksekusi kueri, Anda dapat melihat statistik eksekusi di Google Cloud konsol atau melalui API:
Konsol
Untuk melihat jumlah baris yang dioptimalkan dan melihat pesan sistem tentang status pengoptimalan, lakukan hal berikut:
Di Google Cloud konsol, buka halaman BigQuery.
Di menu navigasi, klik Job explorer.
Klik ID tugas untuk melihat panel Job details.
Klik tab Job information dan lihat metrik serta status di kolom Gen AI function optimizations.

API
Periksa FunctionGenAiCostOptimizationStats di objek GenAIFunctionStats dari metadata tugas. Objek ini mencakup jumlah baris yang disimpulkan melalui alur kerja yang dioptimalkan dan pesan yang dibuat sistem yang memberikan insight tentang status pengoptimalan.
Memecahkan masalah
Bagian berikut menjelaskan cara mendiagnosis dan menyelesaikan masalah umum terkait penggunaan mode yang dioptimalkan.
Ukuran data terlalu kecil
Masalah: Data tidak cukup untuk pelatihan model. Anda mungkin melihat
pesan error berikut: Fail to apply cost optimization because the data size is too
small.
Solusi: Tingkatkan ukuran input Anda menjadi sekitar 3.000 baris dan pastikan embedding yang valid telah dibuat dengan benar untuk semua baris.
Beberapa atau tidak ada sampel di beberapa class
Masalah: Jumlah sampel tidak cukup untuk kategori tertentu selama
fase pengambilan sampel, yang mencegah pelatihan model. Anda mungkin melihat pesan error berikut: Fail to apply cost optimization because some classes have
few or no samples.
Solusi:
- Hapus kategori yang jarang atau kosong dari panggilan fungsi
AI.CLASSIFY. - Kelompokkan kategori yang jarang ke dalam kategori yang lebih luas untuk meningkatkan ukuran sampel. Anda dapat menggunakan kategori
OTHERuntuk mengelompokkan item yang tidak tercakup dalam kategori yang lebih spesifik. Namun, jangan tambahkanOTHERjika daftar kategori Anda sudah lengkap, karena istilah ini ambigu dan dapat menyebabkan kebingungan.
Embedding memiliki dimensi yang tidak konsisten
Masalah: Ketidakkonsistenan antara dimensi embedding di seluruh baris. Anda
mungkin melihat pesan error berikut: Fail to apply cost optimization
because the embeddings have inconsistent dimensions.
Solusi: Pastikan embedding dibuat oleh model yang sama dan memiliki panjang vektor embedding yang sama. Anda dapat menggunakan kueri SQL yang mirip dengan berikut ini untuk memeriksa apakah embedding dalam kolom memiliki panjang yang sama:
SELECT ARRAY_LENGTH(body_embedding.result), COUNT(*)
FROM `PROJECT_ID.DATASET.TABLE_NAME`
GROUP BY 1;
Kompleksitas perintah terlalu tinggi
Masalah: Model terdistilasi tidak dapat mencapai nilai minimum akurasi yang tinggi. Anda
mungkin melihat pesan error berikut: Fail to apply cost optimization
because the prompt complexity is too high.
Solusi:
Gunakan kumpulan kategori yang membentuk partisi. Pastikan kategori memiliki tumpang tindih minimal dan mencakup semua kemungkinan input.
- Hindari kategori yang tumpang tindih saat input mungkin termasuk dalam beberapa kategori secara bersamaan. Misalnya, hindari kategori seperti
['terrible', 'bad', 'okay', 'good', 'excellent']. - Hindari celah saat tidak ada kategori yang berlaku. Misalnya, daftar
kategori
['bad', 'average']tidak mencakup ulasan yang mengungkapkan pujian. Berikan deskripsi kategori untuk memandu LLM menyelesaikan ambiguitas antar-kategori. Contoh:
AI.CLASSIFY( review, categories => [ ('terrible', 'Review where customer was not happy and the message indicates they will never try this product again'), ('bad', 'Review where customer was not happy but suggested improvements to the product'), ('okay', 'Review where customer was neutral about the product. Short reviews qualify for this category'), ('good', 'Review where customers were happy using this product but had minor critiques'), ('excellent', 'Review where customers were very happy using this product and will recommend others to try it too')], embeddings => review_embeddings)
- Hindari kategori yang tumpang tindih saat input mungkin termasuk dalam beberapa kategori secara bersamaan. Misalnya, hindari kategori seperti
Coba model embedding yang lebih canggih seperti
text-embedding-005ataumultimodalembedding.Hubungi bqml-feedback@google.com untuk mendapatkan bantuan tambahan dalam men-debug.
Jumlah baris yang tidak terduga yang diproses oleh LLM
Masalah: Statistik eksekusi kueri menunjukkan bahwa jumlah baris yang tidak terduga diproses oleh LLM jarak jauh, bukan model terdistilasi. Hal ini mungkin disebabkan oleh alasan berikut:
- Model terdistilasi berhasil dilatih, tetapi beberapa baris tidak memiliki embedding. Baris ini diproses oleh LLM jarak jauh.
- Model terdistilasi tidak dapat diterapkan untuk setiap baris dan harus menggunakan LLM jarak jauh untuk mempertahankan kualitas yang konsisten.
Solusi: Pastikan embedding dibuat dengan benar dan valid untuk semua baris dalam data Anda. Jika masalah berlanjut, hubungi bqml-feedback@google.com untuk men-debug.
Kolom embedding otonom tidak terdeteksi
Masalah: BigQuery tidak dapat mendeteksi kolom embedding otonom. Hal ini mungkin terjadi jika skrip Anda menggunakan tabel sementara, dan referensi ke tabel asli hilang.
Solusi: Gunakan parameter embeddings untuk meneruskan kolom embedding otonom secara eksplisit—misalnya, embeddings => content_embedding.result—yang memicu pengoptimalan biaya.
Langkah berikutnya
- Pelajari AI generatif di BigQuery lebih lanjut.
- Lihat dokumentasi
AI.IFfungsi. - Lihat dokumentasi fungsi
AI.CLASSIFY.