All Products
Search
Document Center

PolarDB:NL2SQL: Kueri bahasa alami

Last Updated:Mar 20, 2026

Untuk membantu pengguna yang tidak terbiasa dengan SQL dalam menganalisis data di database, PolarDB for AI menyediakan model AI proprietary untuk terjemahan Natural Language to SQL berbasis Large Language Model (LLM-based NL2SQL). Model ini telah terpasang dan siap digunakan. Dibandingkan metode Natural Language to SQL (NL2SQL) tradisional, model LLM-based NL2SQL menawarkan pemahaman bahasa yang lebih kuat. Pernyataan SQL yang dihasilkannya mendukung lebih banyak fungsi, seperti aritmetika tanggal, serta mampu memahami pemetaan sederhana, misalnya valid->isValid=1. Setelah Anda melakukan penyesuaian, model ini juga dapat memahami pola SQL umum Anda, contohnya secara default menggunakan datastatus=1 dalam kondisi.

Demo

/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'Filter untuk 2 siswa dengan ketidakhadiran terbanyak, urutkan berdasarkan jumlah ketidakhadiran secara menurun, dan tampilkan nama serta jumlah ketidakhadiran mereka.') 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;

Proses end-to-end untuk terjemahan bahasa alami ke SQL

Untuk membantu Anda menerapkan aplikasi NL2SQL secara efisien, proses ini dibagi menjadi tiga fase: Peluncuran Cepat, Optimasi dan Fine-tuning, serta Penyebaran Produksi.

  • Peluncuran Cepat: Fase ini membantu Anda membangun kemampuan NL2SQL dasar dengan cepat sejak awal.

  • Optimasi dan Fine-tuning: Kami menyediakan optimasi mendalam untuk mengatasi masalah spesifik dalam skenario bisnis aktual.

  • Penyebaran Produksi: Fase ini memastikan sistem NL2SQL dapat diterapkan dengan lancar ke lingkungan produksi.

Prasyarat

  • Tambahkan node AI dan atur akun database untuk menghubungkannya ke node AI tersebut. Untuk informasi selengkapnya, lihat Aktifkan fitur PolarDB for AI.

    Catatan
    • Jika Anda telah menambahkan node AI saat membeli kluster, Anda dapat langsung mengatur akun database untuk node AI tersebut.

    • Akun database untuk node AI harus memiliki izin Read and Write agar dapat membaca dari dan menulis ke database target.

  • Hubungkan ke kluster PolarDB menggunakan cluster endpoint. Untuk informasi selengkapnya, lihat Masuk ke PolarDB for AI.

    Penting
    • Saat menghubungkan ke kluster melalui command line, tambahkan opsi -c.

    • Saat menggunakan fitur PolarDB for AI di Data Management (DMS), DMS secara default menghubungkan ke kluster PolarDB menggunakan Primary Endpoint. Hal ini mencegah pernyataan SQL diarahkan ke node AI. Anda harus mengubah endpoint koneksi secara manual ke Cluster Endpoint.

Catatan penggunaan

  • Cara mengajukan pertanyaan: Dalam pertanyaan Anda, nyatakan secara jelas kondisi dan nilai entitas terkait. Tempatkan kondisi terlebih dahulu, diikuti oleh entitas untuk nilai kolom yang Anda cari, lalu nama kolom yang mungkin sesuai. Contoh:

    SELECT 'Apa nama properti dari "rumah" atau "apartemen" yang memiliki lebih dari satu kamar?'

    Di sini, dengan lebih dari satu kamar adalah kondisi, rumah dan apartemen adalah entitas yang sesuai dengan nilai kolom, dan nama properti adalah nama kolom yang mungkin sesuai.

  • Akurasi hasil kueri: LLM-based NL2SQL adalah model AI berbasis model bahasa besar, dan performanya dipengaruhi oleh berbagai faktor. Untuk memastikan hasil kueri sesuai harapan, pertimbangkan faktor-faktor berikut yang dapat memengaruhi akurasi keseluruhan:

    • Kelengkapan komentar tabel dan kolom: Menambahkan komentar pada setiap tabel dan kolomnya meningkatkan akurasi kueri.

    • Kesesuaian antara pertanyaan pengguna dan komentar kolom dalam tabel: Semakin dekat kesesuaian semantik antara kata kunci dalam pertanyaan pengguna dan komentar kolom, semakin baik performa kueri.

    • Panjang pernyataan SQL yang dihasilkan: Kueri lebih akurat jika pernyataan SQL melibatkan lebih sedikit kolom dan memiliki kondisi yang lebih sederhana.

    • Kompleksitas logis pernyataan SQL: Semakin sedikit sintaks lanjutan yang digunakan dalam pernyataan SQL, semakin akurat kueri tersebut.

Petunjuk

Standarisasi tabel data

Prasyarat untuk NL2SQL adalah model harus memahami makna tabel Anda, termasuk apa yang diwakili oleh nama kolom. Sebelum menggunakan LLM-based NL2SQL, Anda harus menambahkan komentar pada tabel data yang sering digunakan beserta kolom-kolomnya.

  • Komentar tabel

    Komentar tabel membantu model LLM-based NL2SQL lebih memahami informasi dasar suatu tabel, sehingga memudahkan model menemukan tabel yang terlibat dalam pernyataan SQL. Komentar harus memberikan gambaran singkat dan jelas tentang isi utama tabel, seperti pesanan atau inventaris. Batasi komentar hingga 10 karakter dan hindari penjelasan berlebihan.

  • Komentar kolom

    Komentar kolom biasanya berupa kata benda umum atau frasa, seperti ID pesanan, tanggal, atau nama toko. Komentar ini harus secara akurat mencerminkan makna nama kolom. Anda juga dapat menambahkan data sampel atau pemetaan ke dalam komentar kolom. Misalnya, untuk kolom bernama isValid, komentarnya dapat berupa Menunjukkan apakah valid atau tidak. 0: Tidak. 1: Ya..

Catatan

Jika Anda tidak dapat mengubah komentar asli, Anda dapat menggunakan fitur komentar tabel dan kolom kustom pada bagian penggunaan lanjutan untuk menyesuaikan komentar tersebut. Untuk informasi selengkapnya, lihat Penggunaan lanjutan - Sesuaikan komentar tabel dan kolom.

Persiapan data

Catatan

Anda dapat menyiapkan set data uji berdasarkan skenario bisnis Anda. Topik ini menggunakan set data uji berikut: test_dataset.sql.

  1. Buat tabel indeks pencarian

    Untuk mengekstraksi data dari tabel data, Anda harus membuat tabel indeks pencarian. Anda dapat menggunakan nama tabel kustom yang sesuai dengan spesifikasi database. Topik ini menggunakan schema_index sebagai contoh. Pernyataan SQL untuk membuat tabel indeks pencarian adalah sebagai berikut:

    /*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 pencarian tidak ditampilkan secara langsung di database. Untuk melihat informasi terkait, Anda dapat menjalankan pernyataan SQL /*polar4ai*/SHOW TABLES;.

    • Untuk menghapus tabel indeks pencarian, misalnya schema_index, Anda dapat menjalankan pernyataan SQL /*polar4ai*/DROP TABLE IF EXISTS schema_index;.

  2. Impor data dari tabel data ke tabel indeks pencarian

    Setelah menjalankan pernyataan SQL berikut, PolarDB for AI melakukan vektorisasi pada semua tabel di database saat ini dan secara default mengambil sampel nilai kolom.

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='schema') INTO schema_index;

    Deskripsi parameter

    • _polar4ai_text2vec adalah model teks-ke-vektor.

    • Setelah INTO, tentukan nama tabel indeks pencarian yang Anda buat di Langkah 1. Buat tabel indeks pencarian.

    • Anda dapat mengonfigurasi beberapa parameter dalam WITH() untuk mengatur perilaku terkait:

      Parameter

      Wajib

      Deskripsi

      mode

      Ya

      Mode penulisan data. Nilainya tetap `async` untuk mode asinkron.

      resource

      Ya

      Jenis resource. Nilainya tetap `schema` untuk melakukan vektorisasi informasi tabel.

      tables_included

      Tidak

      Tabel yang akan divectorisasi.

      Nilai default adalah '', yang berarti melakukan vektorisasi pada semua tabel. Untuk menentukan beberapa tabel, pisahkan nama tabel dengan koma (,) dan gabungkan menjadi string.

      to_sample

      Tidak

      Menentukan apakah akan mengambil sampel nilai kolom. Mengambil sampel nilai kolom meningkatkan waktu impor data ke tabel indeks pencarian, tetapi meningkatkan kualitas SQL yang dihasilkan jika tabel memiliki sedikit kolom (kurang dari 15). Nilai yang valid:

      • 0 (default): Tidak mengambil sampel nilai kolom.

      • 1: Mengambil sampel nilai kolom.

      columns_excluded

      Tidak

      Kolom yang dikecualikan dari operasi LLM-based NL2SQL.

      Nilai default adalah ''. Ini berarti semua kolom di semua tabel yang digunakan untuk konversi vektor berpartisipasi dalam operasi LLM-based NL2SQL selanjutnya. Untuk mengatur parameter ini, Anda perlu menggabungkan kolom-kolom di tabel yang dipilih yang tidak berpartisipasi dalam operasi LLM-based NL2SQL selanjutnya menjadi string dengan format table_name1.column_name1,table_name1.column_name2,table_name2.column_name1.

      Contoh: Pernyataan SQL berikut melakukan vektorisasi pada tabel graph_info, image_info, dan text_info di database saat ini dan mengambil sampel nilai kolom. Kolom time di tabel graph_info dan kolom ext di tabel text_info dikecualikan dari operasi LLM-based NL2SQL selanjutnya.

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

    Setelah menjalankan pernyataan untuk mengimpor data ke tabel indeks pencarian, task_id untuk tugas tersebut dikembalikan, misalnya bce632ea-97e9-11ee-bdd2-492f4dfe0918. Anda dapat menggunakan perintah berikut untuk memeriksa status impor. Saat nilai kembali adalah finish, tugas telah selesai.

    /*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`;

    Anda dapat menjalankan pernyataan SQL berikut untuk melihat informasi indeks pencarian:

    /*polar4ai*/SELECT * FROM schema_index;

Gunakan LLM-based NL2SQL online

Sintaks

/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT '<question>') WITH (basic_index_name='<basic_index_name>');

Deskripsi parameter

  • Setelah <question>, masukkan pertanyaan yang ingin Anda ubah menjadi pernyataan SQL. Tabel berikut menunjukkan beberapa contoh pertanyaan yang direkomendasikan:

    Skenario contoh ini

    Skenario lain

    Urutkan berdasarkan nama guru secara alfabetis menaik, dan tampilkan nama guru serta nama mata pelajaran yang mereka ajarkan.

    Filter untuk 2 siswa dengan ketidakhadiran terbanyak, urutkan berdasarkan jumlah ketidakhadiran secara menurun, dan tampilkan nama serta jumlah ketidakhadiran mereka.

    Kueri nama dan lokasi mata pelajaran yang dimulai antara 1 Oktober 2023 dan 3 Oktober 2023.

    Hitung jumlah mata pelajaran yang diambil setiap siswa, filter untuk siswa yang mengambil lebih dari 2 mata pelajaran, dan tampilkan nama serta jumlah mata pelajaran mereka dalam urutan menurun berdasarkan jumlah mata pelajaran.

    Filter untuk siswa yang alamatnya mengandung "Beijing" atau "Shanghai" dan tampilkan nama serta nomor telepon mereka.

    Apa ID, peran, dan nama ahli yang telah melakukan dua atau lebih perawatan?

    Apa nama ras anjing yang paling banyak dipelihara?

    Pemilik mana yang paling banyak membayar 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 beberapa parameter dalam WITH() untuk mengatur perilaku terkait:

    Nama parameter

    Wajib

    Deskripsi

    basic_index_name

    Ya

    Nama tabel indeks pencarian di database saat ini.

    to_optimize

    Tidak

    Menentukan apakah akan melakukan optimasi SQL. Nilai yang valid:

    • 0 (default): Tidak ada optimasi.

    • 1: Melakukan optimasi SQL. PolarDB for AI memproses lebih lanjut pernyataan SQL yang dihasilkan agar lebih optimal.

    basic_index_top

    Tidak

    Jumlah tabel paling mirip yang diambil. Nilai yang valid: [1,10].

    • Nilai default adalah 3, yang memilih 3 tabel paling optimal untuk pertanyaan saat ini. Pengaturan 1 biasanya sudah cukup.

    • Jika melibatkan beberapa tabel, Anda dapat mengatur nilai ini ke 4 atau lebih tinggi untuk memperluas pengambilan dan meningkatkan hasil.

    basic_index_threshold

    Tidak

    Ambang batas yang digunakan untuk menentukan kesamaan tabel yang diambil. Nilai yang valid: (0,1].

    Nilai default adalah 0,1. Tabel database dipilih hanya jika skor kecocokan vektornya melebihi 0,1.

Contoh

  • Tampilkan konten tertentu dan urutkan dalam urutan yang ditentukan.

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'Urutkan berdasarkan nama guru secara alfabetis menaik, dan tampilkan nama guru serta nama mata pelajaran yang mereka ajarkan.') 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;
  • Cari berdasarkan kondisi tertentu, tampilkan konten yang memenuhi kondisi, dan urutkan dalam urutan yang ditentukan.

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'Filter untuk 2 siswa dengan ketidakhadiran terbanyak, urutkan berdasarkan jumlah ketidakhadiran secara menurun, dan tampilkan nama serta jumlah ketidakhadiran mereka.') 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 metode penggunaan lanjutan. Jika Anda mengalami masalah berikut, Anda dapat merujuk ke petunjuk penggunaan lanjutan yang sesuai untuk mengatasinya.

  • Konfigurasikan templat pertanyaan: Konfigurasikan templat pertanyaan umum untuk memungkinkan model menghasilkan pernyataan SQL berdasarkan pengetahuan spesifik.

  • Buat tabel konfigurasi: Pra-proses pertanyaan atau pasca-proses pernyataan SQL yang dihasilkan.

  • Sesuaikan komentar tabel dan kolom: Jika komentar tabel atau kolom asli tidak dapat diubah, Anda dapat menambahkan komentar baru untuk tabel dan kolomnya guna menimpa komentar asli.

  • Dukungan tabel lebar: Saat tabel memiliki terlalu banyak kolom atau Anda menerima error Please use column index to avoid oversize table information., Anda dapat membuat tabel indeks kolom untuk mengaktifkan dukungan model terhadap tabel lebar.

Konfigurasikan templat pertanyaan

Templat pertanyaan dibuat untuk pengetahuan domain spesifik dan membantu model lebih memahami pertanyaan saat ini. Anda dapat mengonfigurasi templat pertanyaan umum untuk memandu model dengan pengetahuan spesifik, sehingga memungkinkannya menghasilkan pernyataan SQL berdasarkan pengetahuan tersebut.

Petunjuk

  1. Buat tabel templat pertanyaan

    Nama tabel templat pertanyaan harus diawali dengan polar4ai_nl2sql_pattern, dan skemanya harus mencakup lima kolom dari 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 templat pertanyaan

    Nama kolom

    Deskripsi

    Template question

    Pertanyaan dengan parameter, disediakan sebagai input ke model LLM-based NL2SQL.

    Dalam templat pertanyaan, tulis parameter dalam format #{XXX}.

    Template description

    Rangkuman templat pertanyaan, dengan beberapa entitas sebagai parameter, seperti tanggal, tahun, atau organisasi. Entitas ini biasanya sesuai dengan kolom tertentu di tabel.

    Dalam deskripsi templat, tulis parameter dalam format [XXX], dan urutannya harus sama dengan parameter dalam templat pertanyaan.

    Template SQL

    Pernyataan SQL yang benar sesuai dengan templat pertanyaan. Pernyataan SQL ini harus memperlakukan parameter dari templat pertanyaan sebagai variabel.

    Catatan

    Parameter dalam templat pertanyaan dan templat SQL dapat berbeda, tetapi harus saling terkait. Misalnya, parameter harus memiliki awalan yang sama, dan nilainya harus memiliki pemetaan satu-ke-satu. Untuk #{category} dan #{categoryCode}, jika nilai parameter untuk category adalah common trademark, special trademark, dan collective trademark, maka nilai categoryCode yang sesuai adalah 0, 1, dan 2. Untuk informasi selengkapnya, lihat contoh di bawah.

    Template parameters

    Parameter templat adalah string JSON dengan struktur yang terdiri dari tiga parameter: table_name, param_info, dan explanation. Parameter-parameter tersebut adalah sebagai berikut:

    • table_name string: Nama tabel dalam templat SQL.

    • param_info array: Deskripsi parameter dalam templat SQL.

      • param_name string: Nama parameter.

      • value array: Nilai sampel untuk parameter.

        Catatan
        • Jika parameter sesuai dengan himpunan nilai enumerasi terbatas, cantumkan semua nilai dalam value.

        • Jika hanya nilai sampel, Anda dapat mencantumkan 2 hingga 4 nilai.

        • Jika ada parameter yang saling berkaitan, Anda perlu memetakannya menggunakan indeks array. Untuk #{category} dan #{categoryCode}, "common trademark" dalam category sesuai dengan 0 dalam categoryCode, dan "special trademark" sesuai dengan 2 dalam categoryCode. Untuk informasi selengkapnya, lihat contoh di bawah.

    • explanation string: Informasi tambahan. Biasanya mencakup persyaratan untuk pernyataan SQL yang dihasilkan, seperti informasi apa yang harus ditampilkan atau deskripsi bidang.

    Catatan

    Jika Anda tidak perlu menentukan parameter templat, Anda dapat mengatur nilai parameter templat 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 status #{status}

    What are the courses with [Course Name] and [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 the year #{issueDate} for projects with the status #{projectStat}?

    What are the national standards planned for release in [Year] for projects with [Project Status]?

    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 the standard name (projectCnName), plan number, and project status"}]

    What are the trademarks of type #{category} and international classification #{intCls}?

    What are the trademarks of [Trademark Type] and [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 and varnishes","Cosmetics and cleaning preparations","Industrial oils and greases","Pharmaceuticals"]},{"param_name":"#{category}","value":["Common trademark","Special trademark","Collective trademark"]},{"param_name":"#{intClsCode}","value":[1,2,3,4,5]},{"param_name":"#{categoryCode}","value":[0,1,2]}],"explanation":"Output the 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."}]

    Menggunakan skenario dalam topik ini sebagai contoh, buat templat pertanyaan pertama dalam tabel di atas. Jalankan pernyataan SQL berikut:

    INSERT INTO `polar4ai_nl2sql_pattern` (`pattern_question`,`pattern_description`,`pattern_sql`,`pattern_params`) VALUES ('Query for courses with course name #{courseName} and status #{status}','What are the courses with [Course Name] and [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 tabel indeks kustom yang sesuai dengan spesifikasi database. Topik ini menggunakan pattern_index sebagai contoh. Pernyataan SQL untuk membuat tabel indeks templat pertanyaan adalah sebagai berikut:

    /*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 ditampilkan secara langsung di database. Untuk melihat informasi terkait, Anda dapat menjalankan pernyataan SQL /*polar4ai*/SHOW TABLES;.

    • Untuk menghapus tabel indeks templat pertanyaan, misalnya pattern_index, Anda dapat menjalankan pernyataan SQL /*polar4ai*/DROP TABLE IF EXISTS pattern_index;.

  3. Impor informasi dari tabel templat pertanyaan ke tabel indeks

    Catatan

    Tabel templat pertanyaan tidak boleh kosong. Sebelum menjalankan pernyataan SQL untuk mengimpor data ke tabel indeks, Anda harus menambahkan setidaknya satu catatan.

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='pattern') INTO pattern_index;

    Deskripsi parameter

    • _polar4ai_text2vec adalah model teks-ke-vektor.

    • Setelah INTO, tentukan nama tabel indeks templat pertanyaan yang Anda buat di Langkah 2. Buat tabel indeks templat pertanyaan.

    • Anda dapat mengonfigurasi beberapa parameter dalam WITH() untuk mengatur perilaku terkait:

      Parameter

      Wajib

      Deskripsi

      mode

      Ya

      Mode penulisan data. Nilainya tetap `async` untuk mode asinkron.

      resource

      Ya

      Jenis resource. Nilainya tetap `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: Buat tabel templat pertanyaan.

      Nilai default adalah polar4ai_nl2sql_pattern, yang melakukan vektorisasi pada tabel polar4ai_nl2sql_pattern. Saat mengatur ini, tentukan nama tabel templat pertanyaan yang diawali dengan polar4ai_nl2sql_pattern.

      Jika Anda ingin mempertahankan tabel indeks templat pertanyaan yang berbeda untuk skenario atau bisnis yang berbeda, Anda dapat menentukan nama tabel yang berbeda saat membuat tabel indeks templat pertanyaan. Misalnya, Anda dapat membuat tabel polar4ai_nl2sql_pattern_user untuk skenario terkait pengguna, lalu pada langkah kedua pembuatan indeks templat pertanyaan, atur nama indeks menjadi pattern_index_user. Saat mengimpor informasi ke tabel indeks, 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 untuk mengimpor data ke tabel indeks, task_id untuk tugas tersebut dikembalikan, misalnya bce632ea-97e9-11ee-bdd2-492f4dfe0918. Anda dapat menggunakan perintah berikut untuk memeriksa status impor.

    /*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`;

    Saat nilai kembali adalah finish, tugas telah selesai. Informasi templat pertanyaan kemudian dapat dirujuk oleh model. 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 Langkah 3. Impor informasi dari tabel templat pertanyaan ke tabel indeks.

  5. Gunakan templat pertanyaan online

    Anda dapat menjalankan pernyataan SQL berikut untuk menggunakan LLM-based NL2SQL dan templat pertanyaan secara online:

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

    Deskripsi parameter

    • Setelah SELECT, masukkan pertanyaan yang ingin Anda ubah menjadi pernyataan 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 WITH() untuk mengatur perilaku terkait. Untuk informasi selengkapnya tentang parameter lainnya, lihat Gunakan LLM-based NL2SQL online:

      Nama parameter

      Deskripsi parameter

      Rentang nilai

      pattern_index_top

      Jumlah templat pertanyaan paling mirip yang diambil.

      Nilai yang valid: [1,10].

      Nilai default adalah 2, yang memilih 2 templat paling optimal untuk templat pertanyaan saat ini.

      pattern_index_threshold

      Ambang batas yang digunakan untuk menentukan kesamaan templat pertanyaan yang diambil.

      Nilai yang valid: (0,1].

      Nilai default adalah 0,85. Templat pertanyaan dipilih hanya jika skor kecocokan vektornya melebihi 0,85.

Buat tabel konfigurasi

Jika Anda ingin pra-proses pertanyaan atau pasca-proses pernyataan SQL akhir yang dihasilkan, Anda dapat menggunakan tabel konfigurasi.

Skenario

  • Skenario 1: Ganti kata deterministik dalam pertanyaan, seperti nama, istilah industri, atau nama produk.

    Misalnya, untuk semua pertanyaan yang melibatkan Zhang San, Anda dapat mengganti Zhang San dengan ZS001. Dalam hal ini, untuk pertanyaan What were Zhang San's sales last month? dan What are Zhang San's total sales this year?, Anda dapat menggunakan tabel konfigurasi untuk pra-prosesnya menjadi What were ZS001's sales last month? dan What are ZS001's total sales this year? sebelum memanggil model bahasa besar.

  • Skenario 2: Tambahkan informasi tambahan ke pertanyaan yang mengandung kata tertentu.

    Misalnya, untuk semua pertanyaan yang melibatkan total sales, Anda dapat menambahkan rumus perhitungan untuk total sales: Total sales = SUM(sales). Sebelum memanggil model bahasa besar, Anda dapat menggunakan tabel konfigurasi untuk menambahkan informasi jenis ini, yang ditambahkan saat pertanyaan memenuhi kondisi yang sesuai.

  • Skenario 3: Petakan dan ganti nilai untuk tabel atau kolom tertentu.

    Misalnya, untuk semua pernyataan SQL akhir yang melibatkan tabel student_courses, Anda dapat mengganti status = 'on leave' dengan status = 0 sebagai langkah cadangan untuk pemetaan nilai kolom.

Sintaks

Pernyataan SQL untuk membuat tabel konfigurasi adalah sebagai berikut. 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 'Whether it is effective',
  `text_condition` text COMMENT 'Text condition',
  `query_function` text COMMENT 'Query processing',
  `formula_function` text COMMENT 'Formula information',
  `sql_condition` text COMMENT 'SQL condition',
  `sql_function` text COMMENT 'SQL processing',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Catatan

Saat data dalam tabel polar4ai_nl2sql_llm_config berubah, Anda tidak perlu melakukan operasi apa pun. Perubahan tersebut berlaku segera.

Deskripsi parameter

Nama kolom

Deskripsi

Rentang nilai

Contoh

is_functional

Menunjukkan apakah konfigurasi pada baris ini berlaku.

Saat tabel konfigurasi ada, tabel tersebut digunakan secara default untuk setiap operasi NL2SQL. Jika ada item konfigurasi yang tidak ingin Anda gunakan tetapi tidak ingin dihapus, Anda dapat mengatur is_functional ke 0 untuk menonaktifkan konfigurasi untuk baris tersebut.
  • 1 (default): Berlaku

  • 0: Tidak efektif

  • Jika is_functional=1, konfigurasi pada baris ini berlaku.

  • Jika is_functional=0, konfigurasi pada baris ini tidak berlaku.

text_condition

Pra-pemrosesan: Melakukan pemeriksaan kondisi teks pada pertanyaan.

Jika kondisi terpenuhi, kolom query_function dan formula_function digunakan untuk pemrosesan. Jika tidak, kolom tersebut tidak digunakan.
  • Tiga operator kondisional didukung: &&, ||, dan !!, yang masing-masing merepresentasikan AND, OR, dan NOT.

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

Jika text_condition adalah Zhang San||Li Si&&!!Wang Wu, kondisi terpenuhi jika pertanyaan mengandung Zhang San, atau jika mengandung Li Si dan tidak mengandung Wang Wu.

Misalnya:

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

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

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

query_function

Pra-pemrosesan: Memproses pertanyaan.

Ini digunakan saat text_condition terpenuhi.
  • Tiga metode pemrosesan didukung: append, delete, dan replace.

  • Formatnya harus berupa string JSON.

Jika query_function diatur ke {"append":["one","two"],"delete":["?"],"replace":{"Zhangsan":"a","Lisi":"b"}}, ini berarti bahwa saat text_condition cocok, one dan two ditambahkan ke kueri dan ? dihapus. Terakhir, Zhangsan dan Lisi diganti masing-masing dengan a dan b.

Misalnya:

  • Pertanyaan What are Zhang San's total sales this year?: Saat text_condition terpenuhi, diproses menjadi What are a's total sales this yearonetwo.

  • Pertanyaan What are Li Si's total sales this year?: Saat text_condition terpenuhi, diproses menjadi What are b's total sales this yearonetwo.

formula_function

Pra-pemrosesan: Menambahkan rumus perhitungan atau informasi lain yang terkait dengan logika bisnis atau konsep spesifik ke pertanyaan.

Ini digunakan saat text_condition terpenuhi.

-

Jika formula_function adalah Total sales: SUM(sales), maka selama pemrosesan akhir, rumus SUM(sales) digunakan sebagai informasi tambahan untuk "Total sales" dalam pertanyaan.

sql_condition

Pasca-pemrosesan: Melakukan pemeriksaan kondisi pada pernyataan SQL yang dihasilkan oleh model.

Jika kondisi terpenuhi, sql_function digunakan untuk memproses pernyataan SQL. Jika tidak, tidak digunakan.

  • Tiga operator kondisional didukung: &&, ||, dan !!, yang masing-masing merepresentasikan AND, OR, dan NOT.

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

Jika sql_condition=students||student_courses&&!!courses, kondisi terpenuhi jika tabel students atau tabel student_courses ada dalam pernyataan SQL, dan tabel courses tidak ada dalam pernyataan SQL.

Misalnya:

  • Pernyataan SQL SELECT * FROM student_courses: Kondisi terpenuhi.

  • Pernyataan SQL SELECT c.course_name FROM student_courses sc JOIN courses c ON sc.courses_id = c.id;: Kondisi tidak terpenuhi.

sql_function

Pasca-pemrosesan: Memproses pernyataan SQL. Ini dapat digunakan untuk menerapkan pemetaan nilai dalam logika bisnis.

Ini digunakan saat sql_condition terpenuhi.

  • Hanya metode pemrosesan replace yang didukung.

  • Formatnya harus berupa string JSON.

Jika sql_function={"replace":{"status = 'on leave'":"status = 0","status = 'present'":"status = 1"}}, artinya jika sql_condition terpenuhi, status = 'on leave' dalam pernyataan SQL diganti dengan status = 0, dan status = 'present' 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":{"Zhang San":"a","Li Si":"b"}}

1

Total sales: SUM(sales)

1

students||student_courses&&!!courses

{"replace":{"status = 'on leave'":"status = 0","status = 'present'":"status = 1"}}

  1. Sebelum menambahkan tabel konfigurasi, jalankan pernyataan SQL berikut:

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'Filter untuk 2 siswa dengan ketidakhadiran terbanyak, urutkan berdasarkan jumlah ketidakhadiran secara menurun, dan tampilkan nama serta jumlah ketidakhadiran mereka.') 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 sesuai dengan Sintaks.

  3. Tambahkan catatan konfigurasi. Jika tabel students atau tabel student_courses ada dalam pernyataan SQL, dan tabel courses tidak ada, ganti 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 pernyataan SQL dari Langkah 1. Pernyataan SQL yang dihasilkan sekarang memiliki nilai status yang diganti.

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'Filter untuk 2 siswa dengan ketidakhadiran terbanyak, urutkan berdasarkan jumlah ketidakhadiran secara menurun, dan tampilkan nama serta jumlah ketidakhadiran mereka.') 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;

Sesuaikan komentar tabel dan kolom

Jika Anda menemukan bahwa tidak dapat mengubah komentar tabel data atau kolom yang ada selama proses Standarisasi tabel data, Anda dapat menambahkan komentar baru untuk tabel dan kolomnya di tabel polar4ai_nl2sql_table_extra_info. Saat menggunakan LLM-based NL2SQL, komentar dalam tabel ini akan menimpa komentar asli.

Sintaks

Pernyataan SQL untuk membuat tabel komentar tabel dan kolom kustom adalah sebagai berikut. Nama tabel polar4ai_nl2sql_table_extra_info bersifat tetap dan 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

Saat data dalam tabel polar4ai_nl2sql_table_extra_info berubah, Anda harus menjalankan kembali langkah untuk mengimpor data dari tabel data ke tabel indeks pencarian agar perubahan dalam tabel polar4ai_nl2sql_table_extra_info berlaku.

Contoh

  1. Buat tabel komentar untuk tabel dan kolom kustom.

  2. Ubah komentar untuk kolom status di tabel student_courses. Dalam contoh ini, deskripsi opsi baru ditambahkan untuk kolom status: 2-Absent.

    INSERT INTO `polar4ai_nl2sql_table_extra_info` (`table_name`,`table_comment`,`column_name`,`column_comment`) VALUES ('student_courses','Course and student information table','status','Student status: 0-On leave, 1-Normal, 2-Absent.');
  3. Jalankan kembali langkah untuk mengimpor data dari tabel data ke tabel indeks pencarian.

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='schema') INTO schema_index;
  4. Periksa status tugas.

    Setelah menjalankan pernyataan untuk mengimpor data ke tabel indeks pencarian, task_id untuk tugas tersebut dikembalikan, misalnya bce632ea-97e9-11ee-bdd2-492f4dfe0918. Anda dapat menggunakan perintah berikut untuk memeriksa status impor. Saat taskStatus adalah finish, tugas telah selesai.

    /*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`;
  5. Gunakan LLM-based NL2SQL online.

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'Filter untuk 2 siswa dengan ketidakhadiran terbanyak, urutkan berdasarkan jumlah ketidakhadiran secara menurun, dan tampilkan nama serta jumlah ketidakhadiran mereka.') 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;

    Dari output di atas, Anda dapat melihat bahwa model LLM-based NL2SQL telah memetakan absent ke nilai kolom 2 untuk kolom status di tabel student_courses.

Dukungan 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, Anda dapat menggunakan proses berikut untuk mendukung tabel lebar.

Catatan

Saat menggunakan LLM-based NL2SQL online, baik basic_index_name maupun pattern_index_name dalam WITH() dapat menggunakan column_index_name yang sama. Berbeda dengan schema atau pattern, ini hanya untuk penyederhanaan informasi.

Untuk sebagian besar permintaan, parameter column_index_name tidak berpengaruh. Parameter ini hanya diperlukan untuk permintaan NL2SQL yang memicu batas panjang, di mana parameter ini menyederhanakan informasi tabel. Hal ini dapat menyebabkan sedikit penurunan akurasi tetapi secara efektif menghindari error pada model LLM-based NL2SQL yang disebabkan oleh prompt yang terlalu panjang.

  1. Buat tabel indeks kolom.

    Anda dapat menggunakan nama tabel indeks kolom kustom yang sesuai dengan spesifikasi database, tetapi nama tersebut tidak boleh sama dengan tabel yang sudah ada di database saat ini. Selain itu, hanya diperlukan satu tabel indeks kolom per database. Pernyataan `CREATE TABLE` adalah sebagai 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 secara langsung di database. Untuk melihat informasi terkait, Anda dapat menjalankan pernyataan SQL /*polar4ai*/SHOW TABLES;.

    • Untuk menghapus tabel indeks kolom, misalnya column_index, Anda dapat menjalankan pernyataan SQL /*polar4ai*/DROP TABLE IF EXISTS column_index;.

  2. Impor data dari tabel data ke tabel indeks kolom berdasarkan granularitas kolom.

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='column') into column_index;
  3. Periksa status tugas.

    Setelah menjalankan pernyataan untuk mengimpor data ke tabel indeks kolom, task_id untuk tugas tersebut dikembalikan, misalnya bce632ea-97e9-11ee-bdd2-492f4dfe0918. Anda dapat menggunakan perintah berikut untuk memeriksa status impor. Saat taskStatus adalah finish, tugas telah selesai.

    /*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`;
  4. Gunakan LLM-based NL2SQL untuk tabel lebar secara online.

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'Urutkan berdasarkan nama guru secara alfabetis menaik, dan tampilkan nama guru serta nama mata pelajaran yang mereka ajarkan.') WITH (basic_index_name='schema_index', column_index_name='column_index');

FAQ

Error sintaks saat mengeksekusi pernyataan SQL di DMS

Jika Anda mengalami error berikut saat menjalankan pernyataan SQL AI (pernyataan SQL yang diawali dengan /*polar4ai*/) untuk fitur PolarDB for AI di DMS: 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, periksa apakah endpoint koneksi DMS adalah Cluster Endpoint dari kluster PolarDB.

Fitur PolarDB for AI harus dijalankan pada node AI. Namun, DMS secara default menghubungkan ke kluster PolarDB menggunakan Primary Endpoint. Oleh karena itu, Anda perlu mengubah endpoint koneksi DMS sebagai berikut.

  1. Setelah menghubungkan ke kluster melalui DMS, di daftar Database Instances > Logged-in Instances di panel navigasi kiri, pilih kluster target, klik kanan, lalu pilih Edit Instance.image

  2. Di kotak dialog Edit Instance, ubah Basic Information > Entry Method menjadi Connection String, lalu masukkan Cluster Endpoint dari kluster tersebut. Klik Save.image

  3. Karena jendela SQL asli terhubung ke kluster menggunakan Primary Endpoint, Anda harus menutup jendela tersebut dan membuka jendela baru untuk menjalankan pernyataan SQL setelah mengubah Connection String.