All Products
Search
Document Center

PolarDB:Natural language to SQL dengan LLM

Last Updated:Jun 21, 2026

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.

Catatan

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

Catatan

Anda dapat menyiapkan data uji yang merepresentasikan skenario bisnis Anda. Contoh dalam topik ini menggunakan set data uji berikut: Test Dataset.sql.

  1. 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_index sebagai 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;.

  2. 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_text2vec adalah 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 format table_name1.column_name1,table_name1.column_name2,table_name2.column_name1.

      Contoh: Pernyataan ini melakukan vektorisasi pada tabel graph_info, image_info, dan text_info di database saat ini serta mengaktifkan sampling nilai kolom. Pernyataan ini juga mengecualikan kolom time di tabel graph_info dan kolom ext di tabel text_info dari 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;
  3. Periksa status tugas

    Pernyataan impor mengembalikan task_id, seperti bce632ea-97e9-11ee-bdd2-492f4dfe0918. Gunakan ID ini dengan perintah berikut untuk memeriksa status tugas. Tugas selesai ketika status menunjukkan finish.

    /*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

  1. Buat tabel templat pertanyaan

    Nama tabel templat pertanyaan harus diawali dengan polar4ai_nl2sql_pattern, dan skemanya harus mencakup lima kolom yang didefinisikan dalam pernyataan CREATE TABLE berikut.

    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.

    Catatan

    Parameter 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 untuk category adalah "ordinary trademark", "special trademark", dan "collective trademark", nilai categoryCode yang 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, dan explanation.

    • 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" dalam category berkorespondensi dengan 0 dalam categoryCode, dan "special trademark" berkorespondensi dengan 1 dalam categoryCode. 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.

    Catatan

    Jika 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."}]');
  2. 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;.

  3. Impor data ke tabel indeks

    Catatan

    Tabel 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_text2vec adalah 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 async untuk mode asinkron.

      resource

      Ya

      Menentukan jenis resource. Harus pattern untuk 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 tabel polar4ai_nl2sql_pattern. Jika Anda mengatur parameter ini, Anda harus menentukan nama tabel yang diawali dengan polar4ai_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_user untuk skenario terkait pengguna, Anda dapat mengatur nama indeks menjadi pattern_index_user di 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;
  4. Periksa status tugas

    Setelah menjalankan pernyataan impor, sistem mengembalikan task_id, seperti bce632ea-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;
    Catatan

    Jika data dalam tabel polar4ai_nl2sql_pattern berubah, Anda harus menjalankan kembali prosedur di Langkah 3.

  5. 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_name adalah nama tabel indeks pencarian di database saat ini.

    • pattern_index_name adalah 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, ganti Zhang San dengan ZS001. Dalam kasus ini, untuk pertanyaan What were Zhang San's sales last month? dan What are Zhang San's total sales for this year?, Anda dapat menggunakan tabel konfigurasi untuk memprosesnya menjadi What were ZS001's sales last month? dan What 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 perhitungan Total 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, ganti status = 'leave' dengan status = 0 sebagai 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;
Catatan

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.
  • 1 (default): aktif

  • 0: tidak aktif

  • Jika is_functional=1, konfigurasi aktif.

  • Jika is_functional=0, konfigurasi tidak aktif.

text_condition

Pra-pemrosesan: Mengevaluasi kondisi terhadap teks pertanyaan.

Jika kondisi terpenuhi, fungsi dalam kolom query_function dan formula_function diterapkan.
  • Mendukung tiga operator logika: && (AND), || (OR), dan !! (NOT).

  • Jika text_condition kosong atau string kosong, kondisi cocok dengan semua pertanyaan.

Jika text_condition adalah John||Lisa&&!Wang, ini menunjukkan bahwa kondisi cocok jika pertanyaan berisi John, atau jika berisi "Lisa" dan tidak berisi "Wang".

Contohnya:

  • Pertanyaan: What are Zhang San's total sales this year? Jawaban: Kondisi terpenuhi.

  • Pertanyaan What are Li Si's total sales this year?: Kondisi terpenuhi.

  • Pertanyaan What is the total sales amount for Lisi and Wangwu this year?: Kondisi tidak cocok.

query_function

Pra-pemrosesan: Mengubah teks pertanyaan.

Fungsi ini diterapkan ketika text_condition cocok.
  • Metode yang didukung: append, delete, dan replace.

  • Nilainya harus berupa string JSON.

Jika query_function adalah {"append":["一","二"],"delete":["?"],"replace":{"张三":"a","李四":"b"}}, ini berarti bahwa ketika text_condition cocok, dan ditambahkan di akhir pertanyaan, dan ? dihapus dari pertanyaan. Terakhir, 张三 dalam pertanyaan diganti dengan a, dan 李四 diganti dengan b.

Contohnya:

  • Pertanyaan Zhang San this year total sales is how much?: Ketika text_condition cocok, akhirnya diproses menjadi a this year total sales is how much one two.

  • Pertanyaan What is Li Si's total sales for this year?: Ketika text_condition cocok, akhirnya diproses menjadi b what is the total sales for this year one two.

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 Total Sales: SUM(Sales Amount), maka selama pemrosesan akhir, total sales amount dalam pertanyaan diproses bersama formula SUM(Sales Amount) sebagai informasi tambahan.

sql_condition

Post-processing: Mengevaluasi kondisi terhadap pernyataan SQL yang dihasilkan model.

Jika kondisi terpenuhi, fungsi dalam kolom sql_function diterapkan.

  • Mendukung tiga operator logika: && (AND), || (OR), dan !! (NOT).

  • Jika sql_condition kosong atau string kosong, kondisi cocok dengan semua pernyataan SQL yang dihasilkan.

Jika sql_condition adalah students||student_courses&&!!courses, kondisi cocok jika pernyataan SQL mereferensikan tabel students atau tabel student_courses, tetapi tidak mereferensikan tabel courses.

Contohnya:

  • Pernyataan SQL SELECT * FROM student_courses: Cocok.

  • Pernyataan SQL SELECT c.course_name FROM student_courses sc JOIN courses c ON sc.courses_id = c.id;: Tidak cocok.

sql_function

Post-processing: Mengubah SQL yang dihasilkan. Ini berguna untuk menerapkan pemetaan nilai berdasarkan logika bisnis.

Fungsi ini diterapkan ketika sql_condition cocok.

  • Hanya metode replace yang didukung saat ini.

  • Nilainya harus berupa string JSON.

Jika sql_function diatur ke {"replace":{"status = 'on leave'":"status = 0","status = 'on duty'":"status = 1"}}, ketika sql_condition cocok, status = 'on leave' dalam SQL diganti dengan status = 0, dan status = 'on duty' diganti dengan status = 1.

Contoh

is_functional

text_condition

query_function

formula_function

sql_condition

sql_function

1

Zhang San||Li Si&&!!Wang Wu

{"append":["one","two"],"delete":["?"],"replace":{"Zhangsan":"a","Lisi":"b"}}

1

Total Sales: SUM(Sales)

1

students||student_courses&&!!courses

{"replace":{"status = 'Leave'":"status = 0","status = 'Present'":"status = 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;
  2. Buat tabel konfigurasi seperti yang dijelaskan di bagian Sintaks.

  3. Tambahkan catatan konfigurasi. Aturan ini menentukan bahwa jika pernyataan SQL mereferensikan tabel students atau tabel student_courses, tetapi tidak mereferensikan tabel courses, sistem mengganti status = 0 dengan status = 10.

    INSERT INTO `polar4ai_nl2sql_llm_config` (`is_functional`,`sql_condition`,`sql_function`) VALUES (1,'students||student_courses&&!!courses','{"replace":{"status = 0":"status = 10"}}');
  4. Jalankan kembali kueri dari Langkah 1. Nilai status dalam 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;
Catatan

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

  1. Buat tabel komentar kustom.

  2. Perbarui komentar untuk kolom status di tabel student_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.');
  3. 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;
  4. Periksa status tugas.

    Setelah menjalankan pernyataan impor, sistem mengembalikan task_id, seperti bce632ea-97e9-11ee-bdd2-492f4dfe0918. Gunakan perintah berikut untuk memeriksa status impor. Ketika taskStatus adalah finish, tugas selesai.

    /*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`;
  5. 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 status di tabel student_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.

Catatan

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.

  1. 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;.

  2. 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;
  3. Periksa status tugas.

    Setelah menjalankan pernyataan impor, sistem mengembalikan task_id, seperti bce632ea-97e9-11ee-bdd2-492f4dfe0918. Anda dapat menjalankan perintah berikut untuk melihat status impor. Tugas selesai ketika taskStatus adalah finish.

    /*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`;
  4. 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');

FAQ

Error sintaks dengan AI SQL

Menjalankan kueri AI SQL (pernyataan SQL yang diawali dengan /*polar4ai*/) dengan fitur PolarDB for AI di DMS dapat memicu error berikut: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'xxx' at line xxx. Error ini terjadi karena koneksi DMS tidak diatur ke Cluster Endpoint kluster PolarDB Anda.

Fitur PolarDB for AI berjalan di node AI, tetapi DMS secara default terhubung ke kluster PolarDB menggunakan Primary address. Oleh karena itu, Anda harus mengubah alamat koneksi di DMS.

  1. Di DMS, setelah Anda terhubung ke kluster, buka daftar Database Instance > Logged-in Instances di panel navigasi kiri. Klik kanan kluster target dan pilih Edit Instance.

  2. Di kotak dialog Edit Instance, di bawah Overview, ubah Entry Method menjadi Connection String. Kemudian, masukkan Cluster Endpoint dan klik Save.

  3. Jendela SQL asli masih menggunakan Primary address. Setelah Anda mengubah Connection String, Anda harus menutup jendela SQL asli dan membuka yang baru. Tindakan ini menerapkan pengaturan koneksi baru.