Text-to-SQL(Text2SQL)是一種自然語言處理(NLP)技術,旨在將自然語言文本自動轉換為SQL查詢語句。這項技術的核心在於將用戶輸入的自然語言描述轉換為結構化的SQL查詢,使這些查詢可以在關聯式資料庫中執行。
在現代化的數據平台中,通常會提供自助服務環境,讓使用者在獲得資料存取權限後,可以自行進行數據分析。然而,有時使用者所面臨的問題並不需要將資料匯入Power BI或Tableau等BI工具進行可視化分析,而只是希望在資料中透過查詢、篩選、聚合運算找到答案。
在這種情境下,對於不熟悉SQL的使用者來說,Text-to-SQL服務是一個很好的解決方案,因為它可以幫助使用者輕鬆地將自然語言轉換為SQL查詢,從而快速獲得所需的數據。
拜大型語言模型(LLM)的普及,Text-to-SQL可以很容易的透過LLM完成。以下透過建立Chinook這個SQLite範例資料庫來當作Text-to-SQL任務中查詢用的關聯式資料庫:
1 | import sqlite3 |
查詢資料表清單可以看到這個範例資料庫裡面包含了總共有11張資料表
1 | con = sqlite3.connect("Chinook.db") |
1 | >> [('Album',), ('Artist',), ('Customer',), ('Employee',), ('Genre',), ('Invoice',), ('InvoiceLine',), ('MediaType',), ('Playlist',), ('PlaylistTrack',), ('Track',)] |
以Employee這張資料表為例子,可以將資料表名稱和欄位清單提供給Gemini,並請Gemini將問題轉成SQL:
1 | import os |
可以看到Gemini依據prompt生成了一段SQL,直接讀這段SQL也有符合前面給的問題。
1 | >>> |
直接把這段SQL拿去查詢資料庫也能得到正確答案,所以在提供資料表和欄位清單的情況下,LLM確實可以生成出能執行的SQL。
1 | cursorObj.execute(""" |
1 | >> [(8,)] |
到這裡可以發現,如果要作出一個簡單的Text-to-SQL服務,只要依據使用者的問題找到正確的資料表,接著將提示詞、資料表資訊與問題提供給LLM就可以詠唱出一段「可能」可以執行的SQL語法。