ChatBI menggunakan teknologi natural language to SQL (NL2SQL) untuk menghasilkan laporan dari kueri dalam bahasa alami. Topik ini menunjukkan fitur utama ChatBI menggunakan sistem manajemen restoran fiktif, "Ali Xiang", guna membantu Anda memanfaatkan layanan ini secara cepat dan efisien.
Aktifkan fitur PolarDB for AI
Tambahkan node AI dan atur akun database-nya. Untuk informasi selengkapnya, lihat Aktifkan fitur PolarDB for AI.
CatatanJika Anda telah menambahkan node AI saat membeli kluster, Anda dapat langsung mengatur akun database untuk node AI tersebut. Untuk informasi selengkapnya, lihat Buat akun standar.
Akun tersebut harus memiliki izin baca dan tulis untuk mengakses tabel data target serta menjalankan operasi database yang diperlukan oleh ChatBI.
Hubungkan ke kluster PolarDB menggunakan Cluster Endpoint. Untuk informasi selengkapnya, lihat Masuk ke PolarDB for AI.
CatatanSaat menghubungkan ke kluster dari command line, tambahkan opsi
-c.Secara default, DMS menghubungkan ke kluster menggunakan Primary Endpoint. Anda harus mengubah endpoint tersebut secara manual ke Cluster Endpoint. Setelah itu, tutup jendela SQL saat ini dan buka jendela baru untuk menjalankan pernyataan SQL Anda.
Persiapan data
"Ali Xiang" adalah perusahaan restoran fiktif. Sistem manajemen tagihannya berisi tiga tabel seperti di bawah ini, yang dapat Anda unduh.
Tambahkan komentar pada tabel dan kolom Anda berdasarkan skema tabel Anda. Hal ini membantu model bahasa besar (LLM) lebih baik mengenali dan memahami data Anda, sehingga meningkatkan akurasi dan efisiensi model selama pemrosesan dan analisis data.
CREATE TABLE restaurant_info (
id INT COMMENT 'ID outlet',
position VARCHAR(128) COMMENT 'Lokasi outlet',
PRIMARY KEY (id)
) COMMENT='Tabel outlet';
CREATE TABLE menu_info (
id INT COMMENT 'ID hidangan',
name VARCHAR(64) COMMENT 'Nama hidangan',
type INT COMMENT 'Jenis hidangan',
unit_price INT COMMENT 'Harga satuan hidangan',
PRIMARY KEY (id)
) COMMENT='Tabel menu';
CREATE TABLE bill_info (
id INT COMMENT 'ID tagihan',
items VARCHAR(512) COMMENT 'Hidangan yang dipesan',
actural_amount INT COMMENT 'Jumlah yang dibayarkan',
restaurant_id INT COMMENT 'Outlet makan',
waiter VARCHAR(16) COMMENT 'Pelayan',
diner_count INT COMMENT 'Jumlah tamu',
pay_time DATE COMMENT 'Waktu pemesanan',
PRIMARY KEY (id)
) COMMENT='Tabel tagihan';Gunakan ChatBI
Anda sekarang dapat menggunakan model NL2SQL PolarDB for AI untuk menghasilkan pernyataan SQL yang sesuai dengan pertanyaan pengguna.
Buat indeks skema tabel
Jalankan pernyataan SQL berikut untuk membuat tabel indeks skema bernama schema_index. Tabel ini menyediakan informasi skema tabel kepada LLM.
/*polar4ai*/CREATE TABLE schema_index(id integer, table_name varchar, table_comment text_ik_max_word, table_ddl text_ik_max_word, column_names text_ik_max_word, column_comments text_ik_max_word, sample_values text_ik_max_word, vecs vector_768,ext text_ik_max_word, PRIMARY key (id));Tabel ini tidak langsung terlihat di database. Untuk melihat informasinya, jalankan pernyataan SQL berikut.
/*polar4ai*/SHOW TABLES;Selanjutnya, jalankan pernyataan SQL berikut untuk mengimpor skema tabel data ke dalam tabel indeks schema_index.
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='schema') INTO schema_index;Saat menjalankan pernyataan tersebut, PolarDB for AI melakukan vektorisasi terhadap semua tabel di database saat ini dan mengambil sampel nilai kolom secara default.
Setelah menjalankan pernyataan tersebut, sebuah task_id untuk tugas latar belakang, seperti bce632ea-97e9-11ee-bdd2-492f4dfe0918, dikembalikan. Jalankan pernyataan SQL berikut untuk menanyakan status tugas tersebut. Pembuatan indeks selesai ketika taskStatus bernilai finish.
/*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`;Jawab pertanyaan menggunakan model NL2SQL
Jalankan pernyataan SQL berikut untuk menggunakan fitur NL2SQL berbasis LLM secara online. Dalam contoh ini, pertanyaan pengguna adalah Berapa total pendapatan minggu ini, dan indeks skema tabelnya adalah schema_index.
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, select 'What is the total income for this week') WITH (basic_index_name='schema_index');Database memerlukan waktu untuk memproses permintaan dan mengambil respons dari LLM. Hasil yang diharapkan ditunjukkan di bawah ini:

Berdasarkan contoh sebelumnya, Anda dapat mengajukan pertanyaan khas lainnya. Pertanyaan-pertanyaan ini mencakup berbagai skenario, seperti GROUP BY, JOIN multi-tabel, ORDER BY, dan formula.
No. Pertanyaan | Pertanyaan pengguna | Nilai kembali NL2SQL |
1 | Urutkan outlet berdasarkan pendapatan |
|
2 | Outlet mana di Shanghai yang memiliki pendapatan tertinggi? |
|
3 | Berapa rata-rata pengeluaran per orang di Shanghai? |
|
4 | Apa sepuluh hidangan yang paling sering dipesan bulan ini? |
|
5 | Berapa persentase pertumbuhan pendapatan bulan ke bulan bulan ini dibandingkan bulan lalu? |
|
6 | Outlet mana di Shanghai yang memiliki trafik pelanggan tertinggi? |
|
Model NL2SQL berbasis LLM menjawab pertanyaan pengguna dengan baik, tetapi beberapa respons mungkin tidak sesuai harapan. Misalnya, pada pertanyaan kedua, pengguna menginginkan nama outlet. Jika Anda mengubah redaksi pertanyaannya menjadi Outlet mana di Shanghai yang memiliki pendapatan tertinggi? Harap kembalikan nama outletnya., model akan mengembalikan pernyataan SQL berikut: SELECT r.name FROM bill_info b JOIN restaurant_info r ON b.restaurant_id = r.id WHERE r.position = 'Shanghai' ORDER BY b.actural_amount DESC LIMIT 1;. Anda juga dapat melakukan fine-tuning pada model untuk meningkatkan akurasinya. Bagian berikut menjelaskan cara mengatasi masalah-masalah tersebut.
Lakukan fine-tuning pada model
Konfigurasikan templat pertanyaan
Anda dapat menggunakan templat pertanyaan umum untuk memandu model. Templat ini menyediakan pengetahuan spesifik untuk membantu model menghasilkan pernyataan SQL.
Jalankan pernyataan SQL berikut untuk membuat tabel templat pertanyaan
polar4ai_nl2sql_pattern.CREATE TABLE `polar4ai_nl2sql_pattern` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Kunci primer', `pattern_question` text COMMENT 'Pertanyaan templat', `pattern_description` text COMMENT 'Deskripsi templat', `pattern_sql` text COMMENT 'SQL templat', `pattern_params` text COMMENT 'Parameter templat', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;Nama tabel harus diawali dengan
polar4ai_nl2sql_pattern. Skema tabel harus mencakup lima kolom dari pernyataan `CREATE TABLE` tersebut.Selanjutnya, buat tabel indeks
pattern_indexuntuk templat pertanyaan./*polar4ai*/CREATE TABLE pattern_index(id integer, pattern_question text_ik_max_word, pattern_description text_ik_max_word, pattern_sql text_ik_max_word, pattern_params text_ik_max_word, pattern_tables text_ik_max_word, vecs vector_768, PRIMARY key (id));Untuk melakukan fine-tuning pada model, konfigurasikan templat untuk pertanyaan kedua. Tujuannya adalah mengembalikan nama outlet.
Jalankan pernyataan SQL berikut untuk menambahkan pola baru:
INSERT INTO polar4ai_nl2sql_pattern (id, pattern_question, pattern_description, pattern_sql, pattern_params) VALUES ( 1, "Which outlet in #{position} has the highest income?", "Which outlet in [location] has the highest income?", "SELECT r.position FROM bill_info b JOIN restaurant_info r ON b.restaurant_id = r.id WHERE r.position LIKE '%#{position}%' ORDER BY b.actural_amount DESC LIMIT 1;", '[{"table_name":"bill_info","param_info":[{"param_name":"#{position}","value":["Shanghai"]}], "explanation": "Consumption location"}]' );Pola ini menggunakan slot untuk mencocokkan berbagai lokasi. Di kolom
pattern_sql, masukkan pernyataan SQL yang benar dan tandai slot dengan#{}. Kolompattern_paramsdigunakan untuk post-processing tambahan informasi tabel, tetapi Anda dapat mengabaikannya di sini.Selanjutnya, impor informasi templat pertanyaan ke dalam tabel indeks.
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='pattern') INTO pattern_index;Seperti proses pembuatan tabel
schema_index, sebuah task ID dikembalikan. Anda dapat memeriksa status tugas dengan menjalankan/*polar4ai*/show task 'xxx-xxx-xxx'.CatatanJika data di tabel
polar4ai_nl2sql_patterndiperbarui, Anda harus membuat ulangpattern_indexdan mengimpor data lagi. Gunakan pernyataan SQL berikut untuk menghapus tabel indeks lama:/*polar4ai*/DROP TABLE pattern_index;Jalankan ulang pernyataan SQL yang bermasalah dan tambahkan petunjuk
pattern_index./*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, select 'Which outlet in Shanghai has the highest income?') WITH (basic_index_name='schema_index',pattern_index_name='pattern_index');
Buat tabel konfigurasi
Jika Anda ingin melakukan pre-processing pada pertanyaan atau post-processing pada SQL yang dihasilkan, Anda dapat menggunakan tabel konfigurasi.
Petunjuk makna kosakata
Pada pertanyaan keenam, LLM tidak dapat menginterpretasikan istilah "customer traffic" secara akurat. Anda dapat mengonfigurasi tabel polar4ai_nl2sql_llm_config untuk melakukan pre-processing terhadap istilah ini.
CREATE TABLE `polar4ai_nl2sql_llm_config` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Kunci primer',
`is_functional` int(11) NOT NULL DEFAULT '1' COMMENT 'Apakah aktif',
`text_condition` text COMMENT 'Kondisi teks',
`query_function` text COMMENT 'Pemrosesan kueri',
`formula_function` text COMMENT 'Informasi formula',
`sql_condition` text COMMENT 'Kondisi SQL',
`sql_function` text COMMENT 'Pemrosesan SQL',
PRIMARY KEY (`id`)
);Anda dapat memasukkan item konfigurasi untuk menginstruksikan Large Language Model (LLM) agar menghitung "customer traffic" atau "customer flow" sebagai jumlah tamu.
INSERT INTO polar4ai_nl2sql_llm_config (id, is_functional, text_condition, query_function, formula_function, sql_condition, sql_function) VALUES (
1,
1,
"customer traffic||customer flow",
"",
"Customer traffic or customer flow is counted as the sum of the number of diners",
"",
""
);Nilai 1 untuk is_functional menunjukkan bahwa item konfigurasi tersebut aktif. Nilai kolom text_condition "customer traffic||customer flow" mencocokkan pertanyaan yang mengandung "customer traffic" atau "customer flow". Kolom formula_function menggunakan teks atau formula untuk menjelaskan makna istilah teknis kepada LLM.
Dalam kasus ini, Anda dapat langsung menjalankan pembuatan SQL tanpa perlu membuat tabel indeks atau melakukan vektorisasi. Hasilnya ditunjukkan di bawah ini.

Petunjuk pencarian fuzzy
Pada pertanyaan ketiga, pencocokan nama tempat dengan operator = mungkin gagal. Anda dapat menambahkan item konfigurasi berikut untuk memberi petunjuk bahwa pencarian fuzzy harus digunakan untuk pencocokan nama tempat.
INSERT INTO polar4ai_nl2sql_llm_config (id, is_functional, text_condition, query_function, formula_function, sql_condition, sql_function) VALUES (
2,
1,
"",
"",
"Matching for the outlet location 'position' requires a fuzzy search",
"",
""
);Di sini, text_condition kosong, yang berarti item konfigurasi ini berlaku secara global. Gunakan dengan hati-hati.
Hasilnya ditunjukkan di bawah ini. Pencocokan lokasi sekarang menggunakan pencarian fuzzy dengan benar.

Demikian pula, untuk pertanyaan kelima, Anda dapat menambahkan formula perhitungan untuk "month-over-month" dan "year-over-year" ke dalam tabel polar4ai_nl2sql_llm_config. Hal ini meningkatkan presisi SQL yang dihasilkan. Anda dapat mencoba sendiri sebagai tantangan.
Output grafik
Setelah NL2SQL menghasilkan pernyataan SQL, Anda dapat memvisualisasikan hasil kueri sebagai grafik, seperti grafik batang, garis, atau lingkaran. Fitur PolarDB NL2Chart dapat menghasilkan laporan berbasis grafik dari pertanyaan Anda dan pernyataan SQL tersebut. Fitur ini mendukung grafik batang, lingkaran, dan garis.
Asumsikan kueri Anda untuk NL2SQL adalah sebagai berikut:
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, select 'Merchant type statistics') WITH (basic_index_name='schema_index',pattern_index_name='pattern_index');Pernyataan SQL berikut dihasilkan. Pastikan pernyataan SQL tersebut dijalankan dan mengembalikan hasil yang tidak kosong:
SELECT merchtype AS merchant_type,COUNT(*) AS product_count FROM hkrt_merchant_info GROUP BY merchtype;Gunakan NL2Chart:
Sintaks
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2chart, <SQL_statement>) WITH (usr_query = <usr_query>, result_type = <result_type>);Deskripsi parameter
Parameter
Deskripsi
Contoh
usr_query
Pertanyaan pengguna. Ini menjelaskan persyaratan untuk menghasilkan grafik.
"Sales statistics for each quarter of 2023"
result_type
Menentukan jenis hasil. Saat ini hanya
'IMAGE'yang didukung.'IMAGE'SQL statement
Pernyataan kueri SQL yang dihasilkan oleh modul NL2SQL untuk mengambil data.
SELECT quarter, sales FROM sales_data WHERE year = 2023Contoh: Ubah hasil kueri dari pernyataan SQL yang dihasilkan menjadi grafik
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2chart, SELECT merchtype AS merchant_type, COUNT(*) AS merchant_count FROM hkrt_merchant_info GROUP BY merchtype) WITH (usr_query = 'Merchant type statistics', result_type='IMAGE');Hasilnya sebagai berikut:
CatatanTautan yang dikembalikan adalah URL citra yang berlaku selama 90 menit.
http://db4ai-xxx-xx-xxxx-xxx-xxxx.aliyuncs.com/pc-bpze47ma2c515087l6/OSSAccessKeyId=xxxxxxx&Expires=1716130199&Signature=KvPFzfMebIEmqxPIXURurwwbsXM%3D
(Opsional) Pilih atau paksa jenis grafik tertentu
Model memilih grafik yang sesuai berdasarkan pemahamannya terhadap pertanyaan pengguna dan data. Anda dapat memandu model dengan cara merumuskan pertanyaan pengguna.
Tabel berikut menunjukkan pemetaan antara jenis pertanyaan dan jenis grafik:
Jenis pertanyaan
Jenis grafik
Contoh pertanyaan pengguna
Deskripsi
Statistik jumlah
Grafik batang
"Please provide statistics on sales by city"
Menunjukkan perbandingan nilai numerik antar kategori berbeda, seperti jumlah, total, atau frekuensi.
Perubahan tren
Grafik garis
"Please show the user growth trend over the past year"
Menunjukkan bagaimana data berubah seiring waktu atau di antara kategori berurutan, menekankan kontinuitas.
Distribusi proporsi
Grafik lingkaran
"Please show the sales proportion of each product line"
Cocok untuk menunjukkan hubungan proporsional bagian terhadap keseluruhan. Datanya harus bersifat kategorikal dan memiliki total yang jelas.
Anda dapat memaksa jenis grafik tertentu dengan mengubah parameter
usr_query. Tambahkan perintah tambahan di akhir parameterusr_query:-- Input the output SQL into nl2chart to draw a line chart /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2chart, SELECT merchtype AS merchant_type, COUNT(*) AS merchant_count FROM hkrt_merchant_info GROUP BY merchtype ) WITH (usr_query = 'Merchant type statistics, draw a line chart', result_type='IMAGE');
-- Input the output SQL into nl2chart to draw a pie chart /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2chart, SELECT merchtype AS merchant_type, COUNT(*) AS merchant_count FROM hkrt_merchant_info GROUP BY merchtype ) WITH (usr_query = 'Merchant type statistics, draw a pie chart', result_type='IMAGE');
Untuk informasi selengkapnya, lihat Natural language to intelligent chart (NL2Chart).
Latih ulang dan fine-tune model
Jika model tidak memenuhi kebutuhan bisnis Anda, Anda dapat melatih ulang dan melakukan fine-tuning pada parameter internalnya untuk mendapatkan hasil yang lebih baik.
Kondisi
Fitur ini hanya didukung pada kluster dengan node AI spesifikasi polar.mysql.x8.2xlarge.gpu (16-core, 125 GB, satu GU100).
Anda hanya dapat melatih satu model dalam satu waktu.
Anda hanya dapat menerapkan satu model dalam satu waktu.
Petunjuk
Latih model
/*polar4ai*/CREATE MODEL udf_qwen14b WITH (model_class='qwen-turbo', model_parameter=(basic_index_name='schema_index', pattern_index_name='pattern_index',training_type='efficient_sft')) as (SELECT '')Deskripsi parameter
Parameter | Deskripsi | Default | Nilai valid/Rentang |
model_class | Jenis model. Saat ini, 'qwen-14b-chat' dan 'qwen-turbo' didukung. | None | {'qwen-14b-chat', 'qwen-turbo'} |
model_parameter | Pengaturan parameter model, termasuk parameter wajib dan opsional. | None | None |
basic_index_name | Nama tabel indeks tempat informasi database dalam data pelatihan diambil sampelnya. Ini harus berupa tabel indeks database. | None | None |
pattern_index_name | Nama tabel indeks tempat informasi templat pertanyaan dalam data pelatihan diambil sampelnya. Ini harus berupa tabel indeks templat pertanyaan. | None | None |
training_type | Jenis pelatihan. Nilai valid adalah 'efficient_sft' dan 'sft'. 'efficient_sft' menunjukkan pelatihan efisien, biasanya menggunakan LoRa. 'sft' menunjukkan pelatihan parameter penuh. | None | {'efficient_sft', 'sft'} |
n_epochs | Jumlah epoch. Ini adalah jumlah kali model belajar dari set data selama pelatihan. Rentang 1 hingga 3 direkomendasikan, tetapi Anda dapat menyesuaikannya sesuai kebutuhan. | 3 | [1, 200] |
learning_rate | Tingkat pembelajaran. Ini merepresentasikan bobot inkremental untuk setiap pembaruan data. Tingkat pembelajaran yang lebih besar menghasilkan perubahan parameter yang lebih besar dan berdampak lebih besar pada model. | '3e-4' | None |
batch_size | Ukuran batch. Ini merepresentasikan ukuran langkah data untuk memperbarui parameter model. Ukuran batch 16 atau 32 direkomendasikan. | 16 | {8, 16, 32} |
lr_scheduler_type | Jenis penjadwal tingkat pembelajaran. Ini mengubah tingkat pembelajaran secara dinamis yang digunakan saat memperbarui bobot selama pelatihan. | 'linear' | {'linear', 'cosine', 'cosine_with_restarts', 'polynomial', 'constant', 'constant_with_warmup', 'inverse_sqrt', 'reduce_lr_on_plateau'} |
eval_steps | Ukuran langkah interval untuk validasi model. Ini digunakan untuk mengevaluasi akurasi dan loss pelatihan secara berkala. | 50 | [1, 2147483647] |
sequence_length | Panjang urutan data pelatihan. Ini adalah panjang maksimum satu sampel. Data yang melebihi panjang ini dipotong secara otomatis. | 2048 | [500, 2048] |
lr_warmup_ratio | Rasio langkah pemanasan terhadap jumlah total langkah pelatihan. | 0.05 | (0, 1) |
weight_decay | Regularisasi L2, yang membantu mengurangi overfitting. | 0.01 | (0, 0.2) |
gradient_checkpointing | Mengaktifkan atau menonaktifkan gradient checkpointing untuk menghemat Memori GPU. | 'True' | {'True', 'False'} |
use_flash_attn | Menentukan apakah akan menggunakan Flash Attention. | 'True' | {'True', 'False'} |
lora_rank | Rank dalam pelatihan LoRa. Ini memengaruhi sejauh mana data pelatihan memengaruhi model. | 8 | {2, 4, 8, 16, 32, 64} |
lora_alpha | Faktor penskalaan dalam pelatihan LoRa. Ini digunakan untuk menyesuaikan bobot pelatihan awal. | 32 | {8, 16, 32, 64} |
lora_dropout | Rasio neuron yang di-drop secara acak selama pelatihan. Ini mencegah overfitting dan meningkatkan kemampuan generalisasi model. | 0.1 | (0, 0.2) |
lora_target_modules | Memilih modul spesifik model untuk fine-tuning. | 'ALL' | {'ALL', 'AUTO'} |
Lihat model
/*polar4ai*/SHOW model udf_qwen14bHapus model
/*polar4ai*/DROP model udf_qwen14bLihat semua model
/*polar4ai*/SHOW modelsPenerapan model
Model yang telah dilatih harus diterapkan sebelum dapat digunakan dalam NL2SQL.
/*polar4ai*/deploy model udf_qwen14bLihat penerapan
/*polar4ai*/SHOW deployment udf_qwen14bHapus penerapan
/*polar4ai*/DROP deployment udf_qwen14bLihat semua penerapan
/*polar4ai*/SHOW deploymentsGunakan model yang diterapkan untuk bahasa alami ke SQL
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'What is the content for id 1?') WITH (basic_index_name='schema_index', llm_model='udf_qwen14b')Deskripsi parameter
Parameter | Deskripsi |
basic_index_name | Wajib. Tabel indeks untuk informasi database yang terkait dengan pertanyaan saat ini. |
llm_model | Opsional. Jika Anda biarkan kosong, sistem memanggil model tanpa fine-tuning untuk NL2SQL. Jika Anda menentukan nilai, pastikan itu adalah nama penerapan yang berada dalam status "serving". Model yang belum sepenuhnya diterapkan tidak dapat digunakan. |