Untuk mempermudah analisis data bagi pengguna yang tidak familiar dengan SQL, PolarDB for AI menyediakan model AI bawaan eksklusif berbasis large language model untuk Natural Language to SQL (LLM-based NL2SQL). Dibandingkan metode NL2SQL tradisional, model LLM-based NL2SQL menawarkan pemahaman bahasa yang lebih kuat dan menghasilkan pernyataan SQL yang mendukung lebih banyak fungsi, seperti aritmetika tanggal. Model ini bahkan dapat memahami hubungan pemetaan sederhana, seperti valid->isValid=1. Dengan fine-tuning yang tepat, model ini dapat mempelajari pola SQL umum Anda, misalnya secara otomatis menerapkan kondisi seperti datastatus=1.
Contoh
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'List the names and leave counts of the 2 students with the most leave requests, sorted in descending order.') WITH (basic_index_name='schema_index');
output: SELECT s.student_name, COUNT(sc.id) AS leave_count FROM students s JOIN student_courses sc ON s.id = sc.student_id WHERE sc.status = 0 GROUP BY s.student_name ORDER BY leave_count DESC LIMIT 2;
NL2SQL workflow
Untuk membantu Anda menerapkan aplikasi NL2SQL, kami membagi prosesnya menjadi tiga tahap: quick start, optimasi dan tuning, serta production deployment.
-
Tahap quick start: Membantu Anda membangun kemampuan NL2SQL dasar dari awal.
-
Tahap optimasi dan tuning: Berfokus pada optimasi mendalam untuk skenario bisnis spesifik Anda.
-
Tahap production deployment: Melibatkan penerapan sistem NL2SQL ke lingkungan produksi.
Prasyarat
-
Tambahkan node AI dan siapkan akun database untuknya. Untuk informasi selengkapnya, lihat Aktifkan fitur PolarDB for AI.
Catatan-
Jika Anda telah menambahkan node AI saat membeli kluster, Anda dapat langsung menyiapkan akun database untuk node AI tersebut.
-
Akun database untuk node AI harus memiliki izin Read/Write agar dapat membaca dan menulis ke database target.
-
-
Lakukan koneksi ke kluster PolarDB menggunakan Cluster Endpoint. Untuk informasi selengkapnya, lihat Login ke PolarDB for AI.
Penting-
Saat melakukan koneksi ke kluster dari command line, tambahkan opsi
-c. -
Saat menggunakan PolarDB for AI di Data Management (DMS), DMS secara default terhubung ke kluster PolarDB menggunakan Primary address, sehingga pernyataan SQL tidak diarahkan ke node AI. Anda harus mengubah alamat koneksi secara manual ke Cluster Endpoint.
-
Catatan
-
Cara merumuskan pertanyaan: Pertanyaan yang dirumuskan dengan baik mencakup kondisi, nilai kolom target, dan nama kolom yang mungkin. Contohnya:
SELECT 'What is the property name of a "house" or "apartment" with more than one room?'Pada contoh ini, 'with more than one room' adalah kondisi, 'house' dan 'apartment' adalah nilai kolom, sedangkan 'property name' adalah nama kolom yang mungkin.
-
Akurasi hasil kueri: Performa model LLM-based NL2SQL dipengaruhi oleh beberapa faktor. Untuk memastikan hasil kueri sesuai harapan, pertimbangkan hal-hal berikut:
-
Kelengkapan komentar tabel dan kolom: Menambahkan komentar detail pada setiap tabel dan kolom meningkatkan akurasi kueri.
-
Kesesuaian antara pertanyaan Anda dan komentar kolom: Semakin dekat kesesuaian semantik antara kata kunci dalam pertanyaan Anda dan komentar kolom, semakin tinggi akurasi kueri.
-
Panjang pernyataan SQL yang dihasilkan: Semakin sedikit kolom yang terlibat dan semakin sederhana kondisinya, semakin akurat kueri tersebut.
-
Kompleksitas logis pernyataan SQL yang dihasilkan: Semakin sedikit sintaks lanjutan yang digunakan, semakin akurat kueri tersebut.
-
Penggunaan
Standarisasi tabel data
Agar LLM-based NL2SQL berfungsi, model harus memahami tabel data dan kolom-kolomnya. Oleh karena itu, tambahkan komentar pada tabel data dan kolom yang paling sering Anda gunakan sebelum memulai.
-
Komentar tabel
Komentar tabel membantu model LLM-based NL2SQL memahami isi tabel, sehingga dapat secara akurat menemukan tabel yang diperlukan untuk kueri. Komentar yang baik secara ringkas merangkum data tabel (misalnya, "orders" atau "inventory"), sebaiknya tidak lebih dari sepuluh kata, dan harus menghindari detail berlebihan.
-
Komentar kolom
Komentar kolom sebaiknya berupa kata benda umum atau frasa yang secara akurat menggambarkan data kolom, seperti "Order ID," "Date," atau "Store Name." Anda juga dapat menyertakan data sampel atau pemetaan nilai dalam komentar kolom. Sebagai contoh, untuk kolom bernama
isValid, komentarnya dapat berupa:Menunjukkan apakah item tersebut valid. 0: Tidak. 1: Ya.
Jika Anda tidak dapat mengubah komentar yang sudah ada, Anda dapat menggantinya menggunakan fitur komentar tabel dan kolom kustom. Untuk informasi selengkapnya, lihat Penggunaan lanjutan - Komentar tabel dan kolom kustom.
Persiapan data
Anda dapat menyiapkan data uji yang merepresentasikan skenario bisnis Anda. Contoh dalam topik ini menggunakan set data uji berikut: Test Dataset.sql.
-
Buat tabel indeks pengambilan
Untuk mengekstraksi data dari tabel data, Anda harus membuat tabel indeks pengambilan untuknya. Anda dapat menentukan nama tabel kustom yang mematuhi konvensi penamaan database. Topik ini menggunakan
schema_indexsebagai contoh. Pernyataan SQL berikut membuat tabel indeks pengambilan:/*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));Catatan-
Tabel indeks pengambilan tidak muncul dalam daftar tabel standar. Untuk melihat informasinya, jalankan pernyataan
/*polar4ai*/SHOW TABLES;. -
Untuk menghapus tabel indeks pengambilan, seperti
schema_index, jalankan pernyataan/*polar4ai*/DROP TABLE IF EXISTS schema_index;.
-
-
Impor informasi tabel data ke tabel indeks pengambilan
Pernyataan berikut menginstruksikan PolarDB for AI untuk melakukan vektorisasi pada semua tabel di database saat ini. Secara default, sampling nilai kolom dinonaktifkan.
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='schema') INTO schema_index;Parameter
-
_polar4ai_text2vecadalah model text embedding. -
Setelah
INTO, tentukan nama tabel indeks pengambilan yang Anda buat di Langkah 1: Buat tabel indeks pengambilan. -
Anda dapat mengonfigurasi parameter berikut dalam klausa
WITH():Parameter
Wajib
Deskripsi
mode
Ya
Mode penulisan data. Parameter ini harus diatur ke
async, yang menentukan mode asinkron.resource
Ya
Jenis resource. Parameter ini harus diatur ke
schema, yang menunjukkan bahwa vektorisasi dilakukan pada informasi tabel data.tables_included
Tidak
Menentukan tabel yang akan divectorisasi.
Nilai default adalah
'', artinya semua tabel divectorisasi. Untuk menentukan beberapa tabel, berikan nama-namanya sebagai string tunggal yang dipisahkan koma.to_sample
Tidak
Menentukan apakah akan melakukan sampling nilai kolom. Sampling meningkatkan waktu impor data tetapi dapat meningkatkan kualitas SQL yang dihasilkan untuk tabel dengan kurang dari 15 kolom. Nilai yang valid:
-
0 (default): Tidak melakukan sampling nilai kolom.
-
1: Nilai kolom Samples.
columns_excluded
Tidak
Menentukan kolom yang dikecualikan dari operasi LLM-based NL2SQL.
Nilai default adalah
'', yang berarti semua kolom dari semua tabel yang terlibat dalam konversi vektor berpartisipasi dalam operasi LLM-based NL2SQL berikutnya. Saat mengatur parameter ini, Anda perlu menggabungkan kolom yang akan dikecualikan dari operasi LLM-based NL2SQL berikutnya menjadi string dalam formattable_name1.column_name1,table_name1.column_name2,table_name2.column_name1.Contoh: Pernyataan ini melakukan vektorisasi pada tabel
graph_info,image_info, dantext_infodi database saat ini serta mengaktifkan sampling nilai kolom. Pernyataan ini juga mengecualikan kolomtimedi tabelgraph_infodan kolomextdi tabeltext_infodari operasi LLM-based NL2SQL./*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='schema', tables_included='graph_info,image_info,text_info', to_sample=1, columns_excluded='graph_info.time,text_info.ext') INTO schema_index; -
-
-
Periksa status tugas
Pernyataan impor mengembalikan
task_id, sepertibce632ea-97e9-11ee-bdd2-492f4dfe0918. Gunakan ID ini dengan perintah berikut untuk memeriksa status tugas. Tugas selesai ketika status menunjukkanfinish./*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`;Anda dapat menjalankan pernyataan SQL berikut untuk melihat informasi indeks pengambilan:
/*polar4ai*/SELECT * FROM schema_index;
Gunakan LLM-based NL2SQL
Sintaks
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT '<question>') WITH (basic_index_name='<basic_index_name>');
Parameter
-
Ganti
<question>dengan pertanyaan bahasa alami Anda. Tabel berikut memberikan contoh.Contoh topik
Skenario lain
Tampilkan nama guru dan mata pelajaran yang mereka ajarkan, diurutkan secara alfabetis menaik berdasarkan nama guru.
Temukan 10 siswa dengan permintaan cuti terbanyak, urutkan secara menurun berdasarkan jumlah permintaan cuti, dan tampilkan nama serta jumlah cuti mereka.
Kueri nama dan lokasi mata pelajaran yang diadakan antara 1 Oktober 2023 hingga 3 Oktober 2023.
Untuk siswa yang telah mendaftar lebih dari dua mata pelajaran, tampilkan nama dan jumlah mata pelajaran mereka, diurutkan secara menurun berdasarkan jumlah mata pelajaran.
Temukan nama dan nomor telepon siswa yang alamatnya mengandung "Beijing" atau "Shanghai".
Apa ID, peran, dan nama profesional yang telah melakukan dua atau lebih perawatan?
Apa nama ras anjing yang paling umum dipelihara?
Pemilik mana yang membayar paling banyak untuk perawatan anjingnya? Cantumkan ID dan nama belakang pemilik.
Beritahu saya ID dan nama belakang pemilik yang paling banyak menghabiskan uang untuk perawatan anjingnya.
Apa deskripsi jenis perawatan dengan total biaya terendah?
-
Anda dapat mengonfigurasi parameter berikut dalam klausa
WITH():Parameter
Wajib
Deskripsi
basic_index_name
Ya
Nama tabel indeks pengambilan di database saat ini.
to_optimize
Tidak
Menentukan apakah akan melakukan optimasi SQL. Nilai yang valid:
-
0 (default): Tidak dilakukan optimasi.
-
1: Mengaktifkan optimasi SQL. PolarDB for AI menulis ulang SQL yang dihasilkan untuk meningkatkan performanya.
basic_index_top
Tidak
Jumlah maksimum tabel relevan yang akan di-recall. Harus berupa bilangan bulat dari 1 hingga 10.
-
Nilai default adalah 3. Nilai 1 biasanya cukup untuk kueri tabel tunggal.
-
Jika kueri melibatkan beberapa tabel, Anda dapat mengatur nilai ini ke 4 atau lebih tinggi untuk memperluas recall dan meningkatkan hasil.
basic_index_threshold
Tidak
Ambang batas kemiripan untuk recall tabel. Nilainya harus dalam rentang (0,1].
Nilai default adalah 0,1. Tabel hanya di-recall jika skor relevansinya melebihi ambang batas ini.
-
Contoh
-
Contoh 1: Kueri dasar dengan pengurutan
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'Show the names of teachers and the courses they teach, sorted in ascending alphabetical order by teacher name.') WITH (basic_index_name='schema_index');SELECT t.teacher_name, c.course_name FROM teachers t JOIN courses c ON t.id = c.teacher_id ORDER BY t.teacher_name ASC; -
Contoh 2: Kueri bersyarat dengan pembatasan dan pengurutan
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'Find the 2 students with the most leave requests, sort them in descending order by the number of leave requests, and show their names and the leave count.') WITH (basic_index_name='schema_index');SELECT s.student_name, COUNT(sc.id) AS leave_count FROM students s JOIN student_courses sc ON s.id = sc.student_id WHERE sc.status = 0 GROUP BY s.student_name ORDER BY leave_count DESC LIMIT 2;
Penggunaan lanjutan
PolarDB for AI menyediakan empat skenario penggunaan lanjutan. Jika Anda mengalami masalah berikut, rujuk instruksi yang sesuai.
-
Konfigurasi templat pertanyaan: Konfigurasikan templat pertanyaan generik agar model dapat menghasilkan pernyataan SQL berdasarkan pengetahuan spesifik.
-
build configuration table: Melakukan pra-pemrosesan terhadap kueri atau pascapemrosesan terhadap pernyataan SQL yang dihasilkan.
-
Komentar tabel dan kolom kustom: Jika Anda tidak dapat mengubah komentar tabel atau kolom asli, Anda dapat menambahkan komentar baru untuk menggantikannya.
-
Dukungan tabel lebar: Ketika tabel berisi terlalu banyak kolom atau Anda mengalami error
Please use column index to avoid oversize table information.saat menggunakan LLM-based NL2SQL, Anda dapat membuat tabel indeks kolom agar model dapat bekerja dengan tabel lebar.
Konfigurasi templat pertanyaan
Templat pertanyaan membantu model memahami pertanyaan pengguna dalam domain pengetahuan spesifik. Anda dapat mengonfigurasi templat pertanyaan umum untuk memberikan pengetahuan spesifik kepada model, yang kemudian digunakan untuk menghasilkan SQL.
Prosedur
-
Buat tabel templat pertanyaan
Nama tabel templat pertanyaan harus diawali dengan
polar4ai_nl2sql_pattern, dan skemanya harus mencakup lima kolom yang didefinisikan dalam pernyataanCREATE TABLEberikut.DROP TABLE IF EXISTS `polar4ai_nl2sql_pattern`; CREATE TABLE `polar4ai_nl2sql_pattern` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Primary key', `pattern_question` text COMMENT 'Template question', `pattern_description` text COMMENT 'Template description', `pattern_sql` text COMMENT 'Template SQL', `pattern_params` text COMMENT 'Template parameters', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;Deskripsi kolom
Parameter
Deskripsi
template question
Pertanyaan berparameter yang merupakan input untuk model LLM-based NL2SQL.
Dalam pertanyaan templat, tulis parameter dalam format
#{XXX}.template description
Rangkuman pertanyaan templat, dengan entitas seperti tanggal, tahun, atau organisasi diekstraksi sebagai parameter. Entitas ini biasanya dipetakan ke kolom tertentu dalam tabel.
Dalam deskripsi templat, Anda harus menulis parameter dalam format
[XXX], dan urutannya harus konsisten dengan urutan parameter dalam pertanyaan templat.template SQL
SQL yang benar untuk pertanyaan templat. Dalam SQL ini, parameter dari pertanyaan templat diperlakukan sebagai variabel.
CatatanParameter dalam pertanyaan templat dan SQL templat tidak harus identik, tetapi harus saling terkait. Misalnya, parameter dapat memiliki awalan umum, dan nilainya dapat memiliki pemetaan satu-ke-satu. Dengan
#{category}dan#{categoryCode}, ketika nilai parameter untukcategoryadalah "ordinary trademark", "special trademark", dan "collective trademark", nilaicategoryCodeyang sesuai adalah 0, 1, dan 2. Untuk detailnya, lihat contoh di bawah.template parameters
String JSON yang terdiri dari tiga parameter:
table_name,param_info, danexplanation.-
table_name
string: Nama tabel yang digunakan dalam SQL templat. -
param_info
array: Deskripsi parameter dalam SQL templat.-
param_name
string: Nama parameter. -
value
array: Nilai sampel untuk parameter.Catatan-
Jika parameter memiliki himpunan nilai terbatas, cantumkan semua nilai tersebut dalam array value jika memungkinkan.
-
Jika Anda hanya memberikan nilai sampel, cantumkan 2 hingga 4 contoh.
-
Jika parameter saling bergantung, petakan menggunakan indeks array. Misalnya, dengan
#{category}dan#{categoryCode}, "ordinary trademark" dalamcategoryberkorespondensi dengan 0 dalamcategoryCode, dan "special trademark" berkorespondensi dengan 1 dalamcategoryCode. Untuk detailnya, lihat contoh di bawah.
-
-
-
explanation
string: Catatan tambahan, yang biasanya menjelaskan persyaratan untuk SQL yang dihasilkan, seperti informasi apa yang harus dikembalikan atau bagaimana menginterpretasikan bidang tertentu.
CatatanJika parameter templat tidak diperlukan, Anda dapat mengatur nilainya ke salah satu berikut:
-
NULL
-
String kosong
-
String daftar kosong: []
Contoh
Template question
Template description
Template SQL
Template parameters
Query for courses with course name #{courseName} and teaching status #{status}
What are the courses with [Course Name] and [Teaching Status]?
SELECT course_name, course_time, course_location FROM courses WHERE course_name=#{courseName} AND status=#{statusCode}[{"table_name":"courses","param_info":[{"param_name":"#{courseName}","value":["Mathematics","Physics","Chemistry","English","History","Geography","Biology","Computer Science","Art","Music","Physical Education","Programming","Literature","Psychology","Philosophy","Economics","Sociology","Physics Lab","Chemistry Lab","Biology Lab"]},{"param_name": "#{status}", "value": ["Not started","In progress"]},{"param_name": "#{statusCode}","value": [0,1]}], "explanation": "Output the course name (course_name), course time (course_time), and course location (course_location). Note: status is a constant mapping type. The variable mapping field is statusCode."}]
What are the national standards planned for release in year #{issueDate} with project status #{projectStat}?
What are the [Project Status] national standards planned for release in [Year]?
SELECT DISTINCT planNum, projectCnName, projectStat FROM sy_cd_me_buss_std_gjbzjh WHERE `planNum` IS NOT NULL AND `dataStatus` != 3 AND `isValid` = 1 AND projectStat=#{projectStat} AND DATE_FORMAT(`issueDate`, '%Y')=#{issueDate}[{"table_name":"sy_cd_me_buss_std_gjbzjh","param_info":[{"param_name":"#{issueDate}","value":[2009,2010,2011,2012]},{"param_name":"#{projectStat}","value":["Seeking comments","Published","Under review"]}],"explanation":"Output standard name (projectCnName), plan number, and project status."}]
What are the trademarks with category #{category} and international classification #{intCls}?
What are the trademarks for [Trademark Type] in [International Classification]?
SELECT DISTINCT tmName, regNo, status FROM sy_cd_me_buss_ip_tdmk_new WHERE dataStatus!=3 AND isValid = 1 AND category=#{categoryCode} AND intCls=#{intClsCode}[{"table_name":"sy_cd_me_buss_ip_tdmk_new","param_info":[{"param_name":"#{intCls}","value":["Chemical raw materials","Paints","Cosmetics and cleaning preparations","Fuels and lubricants","Pharmaceuticals"]},{"param_name":"#{category}","value":["ordinary trademark","special trademark","collective trademark"]},{"param_name":"#{intClsCode}","value":[1,2,3,4,5]},{"param_name":"#{categoryCode}","value":[0,1,2]}],"explanation":"Output trademark name (tmName), application/registration number (regNo), and trademark status (status). Note: category is a constant mapping type. The variable mapping field is categoryCode. intCls is a constant mapping type. The variable mapping field is intClsCode."}]
Sebagai contoh, untuk membuat pertanyaan templat pertama yang ditunjukkan dalam tabel di atas, jalankan SQL berikut:
INSERT INTO `polar4ai_nl2sql_pattern` (`pattern_question`,`pattern_description`,`pattern_sql`,`pattern_params`) VALUES ('Query for courses with course name #{courseName} and teaching status #{status}','What are the courses with 【Course Name】【Teaching Status】?','SELECT course_name, course_time, course_location FROM courses WHERE course_name=#{courseName} AND status=#{statusCode}','[{"table_name":"courses","param_info":[{"param_name":"#{courseName}","value":["Mathematics","Physics","Chemistry","English","History","Geography","Biology","Computer Science","Art","Music","Physical Education","Programming","Literature","Psychology","Philosophy","Economics","Sociology","Physics Lab","Chemistry Lab","Biology Lab"]},{"param_name": "#{status}", "value": ["Not started","In progress"]},{"param_name": "#{statusCode}","value": [0,1]}], "explanation": "Output the course name (course_name), course time (course_time), and course location (course_location). Note: status is a constant mapping type. The variable mapping field is statusCode."}]'); -
-
Buat tabel indeks templat pertanyaan
Anda dapat menggunakan nama kustom untuk tabel indeks, asalkan mengikuti konvensi penamaan database. Contoh ini menggunakan
pattern_index. Jalankan SQL berikut untuk membuat tabel indeks 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));Catatan-
Tabel indeks templat pertanyaan tidak muncul dalam daftar objek basis data. Untuk melihatnya, jalankan
/*polar4ai*/SHOW TABLES;. -
Untuk menghapus tabel indeks templat pertanyaan, misalnya
pattern_index, jalankan pernyataan SQL/*polar4ai*/DROP TABLE IF EXISTS pattern_index;.
-
-
Impor data ke tabel indeks
CatatanTabel templat pertanyaan tidak boleh kosong. Sebelum menjalankan SQL untuk mengimpor data, tambahkan setidaknya satu catatan.
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='pattern') INTO pattern_index;Parameter
-
_polar4ai_text2vecadalah model text-to-vectorization. -
Setelah
INTO, tentukan nama tabel indeks templat pertanyaan yang dibuat di Langkah 2. -
Anda dapat mengonfigurasi beberapa parameter dalam klausa
WITH():Parameter
Wajib
Deskripsi
mode
Ya
Menentukan mode penulisan. Harus
asyncuntuk mode asinkron.resource
Ya
Menentukan jenis resource. Harus
patternuntuk melakukan vektorisasi informasi templat pertanyaan.pattern_table_name
Tidak
Nama tabel templat pertanyaan yang akan divectorisasi. Ini adalah nama tabel dari Langkah 1.
Nilai default adalah
polar4ai_nl2sql_pattern, artinya vektorisasi dilakukan pada tabelpolar4ai_nl2sql_pattern. Jika Anda mengatur parameter ini, Anda harus menentukan nama tabel yang diawali denganpolar4ai_nl2sql_pattern.Jika Anda ingin mempertahankan tabel indeks templat pertanyaan yang berbeda untuk skenario atau domain bisnis yang berbeda, Anda dapat menentukan nama tabel yang berbeda saat membuatnya. Misalnya, jika Anda membuat tabel
polar4ai_nl2sql_pattern_useruntuk skenario terkait pengguna, Anda dapat mengatur nama indeks menjadipattern_index_userdi Langkah 2. Saat mengimpor informasi, gunakan pernyataan SQL berikut:/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='pattern', pattern_table_name='polar4ai_nl2sql_pattern_user') INTO pattern_index_user;
-
-
Periksa status tugas
Setelah menjalankan pernyataan impor, sistem mengembalikan
task_id, sepertibce632ea-97e9-11ee-bdd2-492f4dfe0918. Anda dapat menjalankan perintah berikut untuk memeriksa status tugas./*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`;Ketika status tugas adalah
finish, impor selesai, dan model dapat mereferensikan informasi templat pertanyaan. Anda dapat menjalankan pernyataan SQL berikut untuk melihat informasi indeks templat pertanyaan:/*polar4ai*/SELECT * FROM pattern_index;CatatanJika data dalam tabel
polar4ai_nl2sql_patternberubah, Anda harus menjalankan kembali prosedur di Langkah 3. -
Jalankan kueri online dengan templat pertanyaan
Jalankan pernyataan SQL berikut untuk melakukan kueri online menggunakan LLM-based NL2SQL dan templat pertanyaan:
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'Query for courses with the course name Mathematics and status in progress') WITH (basic_index_name='schema_index', pattern_index_name='pattern_index');SELECT course_name, course_time, course_location FROM courses WHERE course_name='Mathematics' AND status=1;Parameter
-
Setelah SELECT, masukkan pertanyaan yang akan dikonversi menjadi SQL.
-
basic_index_nameadalah nama tabel indeks pencarian di database saat ini. -
pattern_index_nameadalah nama tabel indeks templat pertanyaan. -
Anda dapat mengonfigurasi beberapa parameter dalam klausa
WITH(). Untuk deskripsi parameter lainnya, lihat Jalankan kueri online dengan LLM-based NL2SQL.Parameter
Deskripsi
Rentang nilai
pattern_index_top
Jumlah templat pertanyaan terdekat yang akan di-recall.
Rentang nilai: [1,10].
Nilai default adalah 2, yang berarti hanya 2 templat teratas yang di-recall untuk pertanyaan saat ini.
pattern_index_threshold
Ambang batas kemiripan untuk meng-recall templat pertanyaan.
Rentang nilai: (0,1].
Nilai default adalah 0,85, yang berarti templat dipilih hanya jika skor kemiripan vektornya melebihi 0,85.
-
Buat tabel konfigurasi
Gunakan tabel konfigurasi untuk pra-pemrosesan pertanyaan atau post-processing SQL yang dihasilkan.
Kasus penggunaan
-
Skenario 1: Ganti istilah tertentu dalam pertanyaan, seperti nama, jargon industri, atau nama produk.
Contohnya: untuk semua pertanyaan yang melibatkan
Zhang San, gantiZhang SandenganZS001. Dalam kasus ini, untuk pertanyaanWhat were Zhang San's sales last month?danWhat are Zhang San's total sales for this year?, Anda dapat menggunakan tabel konfigurasi untuk memprosesnya menjadiWhat were ZS001's sales last month?danWhat are ZS001's total sales for this year?sebelum panggilan akhir ke large language model. -
Skenario 2: Tambahkan konteks tambahan ke pertanyaan yang mengandung istilah tertentu.
Contohnya: untuk semua pertanyaan yang melibatkan
Total Sales, formula perhitunganTotal Sales = SUM(Sales)harus ditambahkan. Sebelum panggilan akhir ke large model, informasi ini dapat ditambahkan melalui tabel konfigurasi dan ditambahkan saat pertanyaan memenuhi kondisi yang sesuai. -
Skenario 3: Petakan dan ganti nilai untuk tabel atau kolom tertentu dalam SQL akhir.
Contohnya: untuk semua pernyataan SQL yang akhirnya melibatkan tabel
student_courses, gantistatus = 'leave'denganstatus = 0sebagai langkah cadangan untuk pemetaan nilai kolom.
Sintaks
Gunakan pernyataan SQL berikut untuk membuat tabel konfigurasi. Nama tabel polar4ai_nl2sql_llm_config bersifat tetap dan tidak dapat diubah.
DROP TABLE IF EXISTS `polar4ai_nl2sql_llm_config`;
CREATE TABLE `polar4ai_nl2sql_llm_config` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'primary key',
`is_functional` int(11) NOT NULL DEFAULT '1' COMMENT 'Indicates if the configuration row is active',
`text_condition` text COMMENT 'Text condition for pre-processing',
`query_function` text COMMENT 'Query processing function',
`formula_function` text COMMENT 'Formula information function',
`sql_condition` text COMMENT 'SQL condition for post-processing',
`sql_function` text COMMENT 'SQL processing function',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Perubahan pada data dalam tabel polar4ai_nl2sql_llm_config berlaku segera. Anda tidak perlu melakukan operasi tambahan.
Parameter
|
Parameter |
Deskripsi |
Nilai |
Contoh |
|
is_functional |
Menunjukkan apakah aturan dalam baris ini aktif. Secara default, semua aturan dalam tabel konfigurasi diterapkan pada setiap kueri NL2SQL. Untuk menonaktifkan sementara aturan konfigurasi tanpa menghapusnya, atur is_functional ke 0. |
|
|
|
text_condition |
Pra-pemrosesan: Mengevaluasi kondisi terhadap teks pertanyaan. Jika kondisi terpenuhi, fungsi dalam kolom query_function dan formula_function diterapkan. |
|
Jika text_condition adalah Contohnya:
|
|
query_function |
Pra-pemrosesan: Mengubah teks pertanyaan. Fungsi ini diterapkan ketika text_condition cocok. |
|
Jika query_function adalah Contohnya:
|
|
formula_function |
Pra-pemrosesan: Menambahkan informasi kontekstual, seperti formula, untuk konsep bisnis spesifik dalam pertanyaan. Fungsi ini diterapkan ketika text_condition cocok. |
- |
Jika formula_function adalah |
|
sql_condition |
Post-processing: Mengevaluasi kondisi terhadap pernyataan SQL yang dihasilkan model. Jika kondisi terpenuhi, fungsi dalam kolom sql_function diterapkan. |
|
Jika sql_condition adalah Contohnya:
|
|
sql_function |
Post-processing: Mengubah SQL yang dihasilkan. Ini berguna untuk menerapkan pemetaan nilai berdasarkan logika bisnis. Fungsi ini diterapkan ketika sql_condition cocok. |
|
Jika sql_function diatur ke |
Contoh
|
is_functional |
text_condition |
query_function |
formula_function |
sql_condition |
sql_function |
|
1 |
|
|
|||
|
1 |
|
||||
|
1 |
|
|
-
Saat dijalankan tanpa tabel konfigurasi, kueri berikut:
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT '筛选出2个请假次数最多的学生,按照学生的请假次数降序排列,显示学生的名字和请假次数。') WITH (basic_index_name='schema_index');SELECT s.student_name, COUNT(sc.id) AS leave_count FROM students s JOIN student_courses sc ON s.id = sc.student_id WHERE sc.status = 0 GROUP BY s.student_name ORDER BY leave_count DESC LIMIT 2; -
Buat tabel konfigurasi seperti yang dijelaskan di bagian Sintaks.
-
Tambahkan catatan konfigurasi. Aturan ini menentukan bahwa jika pernyataan SQL mereferensikan tabel
studentsatau tabelstudent_courses, tetapi tidak mereferensikan tabelcourses, sistem menggantistatus = 0denganstatus = 10.INSERT INTO `polar4ai_nl2sql_llm_config` (`is_functional`,`sql_condition`,`sql_function`) VALUES (1,'students||student_courses&&!!courses','{"replace":{"status = 0":"status = 10"}}'); -
Jalankan kembali kueri dari Langkah 1. Nilai
statusdalam SQL yang dihasilkan sekarang diganti sesuai aturan yang ditentukan./*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT '筛选出2个请假次数最多的学生,按照学生的请假次数降序排列,显示学生的名字和请假次数。') WITH (basic_index_name='schema_index');SELECT s.student_name, COUNT(sc.id) AS leave_count FROM students s JOIN student_courses sc ON s.id = sc.student_id WHERE sc.status = 10 GROUP BY s.student_name ORDER BY leave_count DESC LIMIT 2;
Kustomisasi komentar tabel dan kolom
Jika Anda tidak dapat mengubah komentar asli untuk tabel atau kolom seperti yang dijelaskan di Siapkan tabel data Anda, Anda dapat menambahkan komentar kustom ke tabel polar4ai_nl2sql_table_extra_info. Komentar ini menggantikan komentar asli saat Anda menggunakan LLM-based NL2SQL.
Sintaks
Pernyataan SQL berikut membuat tabel komentar kustom. Nama tabel polar4ai_nl2sql_table_extra_info tidak dapat diubah.
DROP TABLE IF EXISTS `polar4ai_nl2sql_table_extra_info`;
CREATE TABLE `polar4ai_nl2sql_table_extra_info` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Primary key',
`table_name` text COMMENT 'Table name',
`table_comment` text COMMENT 'Table description',
`column_name` text COMMENT 'Column name',
`column_comment` text COMMENT 'Column description',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Jika Anda mengubah data dalam tabel polar4ai_nl2sql_table_extra_info, Anda harus menjalankan kembali langkah untuk mengimpor informasi tabel data ke indeks skema agar perubahan berlaku.
Contoh
-
Buat tabel komentar kustom.
-
Perbarui komentar untuk kolom
statusdi tabelstudent_courses. Contoh ini menambahkan pemetaan opsi baru: 2-Absent.INSERT INTO `polar4ai_nl2sql_table_extra_info` (`table_name`,`table_comment`,`column_name`,`column_comment`) VALUES ('student_courses','Student-course information table','status','Student status: 0-On leave, 1-Normal, 2-Absent.'); -
Jalankan kembali langkah untuk mengimpor informasi tabel data ke indeks skema.
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='schema') INTO schema_index; -
Periksa status tugas.
Setelah menjalankan pernyataan impor, sistem mengembalikan
task_id, sepertibce632ea-97e9-11ee-bdd2-492f4dfe0918. Gunakan perintah berikut untuk memeriksa status impor. KetikataskStatusadalahfinish, tugas selesai./*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`; -
Jalankan kueri menggunakan LLM-based NL2SQL.
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'Show the names and number of absences for the 2 students with the most absences, sorted in descending order.') WITH (basic_index_name='schema_index');SELECT s.student_name, COUNT(sc.id) AS absence_count FROM student_courses sc JOIN students s ON sc.student_id = s.id WHERE sc.status = 2 GROUP BY s.student_name ORDER BY absence_count DESC LIMIT 2;Output menunjukkan bahwa model LLM-based NL2SQL sekarang secara benar memetakan Absent ke nilai 2 untuk kolom
statusdi tabelstudent_courses.
Dukungan untuk tabel lebar
Jika tabel data Anda mencakup tabel lebar dengan banyak kolom, atau jika Anda menerima error Please use column index to avoid oversize table information. saat menggunakan LLM-based NL2SQL, gunakan prosedur ini.
Saat Anda menggunakan LLM-based NL2SQL online, baik basic_index_name maupun pattern_index_name dalam klausa WITH() dapat menggunakan column_index_name yang sama. Berbeda dengan pengindeksan schema atau pattern, metode ini hanya digunakan untuk menyederhanakan informasi.
Untuk sebagian besar permintaan, parameter column_index_name tidak berpengaruh. Parameter ini hanya diperlukan untuk permintaan NL2SQL yang memicu batas panjang. Dalam kasus ini, column_index_name menyederhanakan informasi tabel. Hal ini dapat menyebabkan sedikit penurunan akurasi tetapi secara efektif mencegah error pada model LLM-based NL2SQL yang disebabkan oleh prompt yang terlalu panjang.
-
Buat tabel indeks kolom.
Anda dapat menggunakan nama kustom untuk tabel indeks kolom, tetapi harus mengikuti konvensi penamaan database dan tidak boleh bertabrakan dengan nama tabel yang sudah ada. Hanya diperlukan satu tabel indeks kolom per database. Gunakan pernyataan CREATE TABLE berikut:
/*polar4ai*/CREATE TABLE column_index(id integer, table_name varchar, table_comment text_ik_max_word, column_name text_ik_max_word, column_comment text_ik_max_word, is_primary integer, is_foreign integer, vecs vector_768, ext text_ik_max_word, PRIMARY KEY (id));Catatan-
Tabel indeks kolom tidak ditampilkan langsung dalam database. Untuk melihat informasinya, jalankan pernyataan SQL
/*polar4ai*/SHOW TABLES;. -
Untuk menghapus tabel indeks kolom, misalnya
column_index, jalankan pernyataan SQL/*polar4ai*/DROP TABLE IF EXISTS column_index;.
-
-
Impor informasi tingkat kolom dari tabel data ke tabel indeks kolom.
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, select '') WITH (mode='async', resource='column') into column_index; -
Periksa status tugas.
Setelah menjalankan pernyataan impor, sistem mengembalikan
task_id, sepertibce632ea-97e9-11ee-bdd2-492f4dfe0918. Anda dapat menjalankan perintah berikut untuk melihat status impor. Tugas selesai ketikataskStatusadalahfinish./*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`; -
Gunakan LLM-based NL2SQL online dengan tabel lebar.
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'Sort by teacher name in ascending alphabetical order, and display the teacher''s name and the names of the courses they teach.') WITH (basic_index_name='schema_index', column_index_name='column_index');