DB-GPT-Hub:text2sql的微調框架及基準測試套件 原創
text2sql任務是將自然語言問題轉換為SQL查詢。使用大模型來進行 sql 生成的方式也越來越常見。根據大模型用于文本到SQL生成的方式,text2sql可以分為兩種場景:零樣本/少樣本提示和微調。
盡管少樣本提示的大模型取得了顯著進展,但僅依靠其參數知識和提示來準確處理高度復雜的SQL查詢對于預訓練的大型語言模型來說仍然是一個巨大的挑戰。DB-GPT-Hub側重于微調更大的大型語言模型。
框架設計
DB-GPT 框架下提出了一個端到端大模型 Text2SQL 微調子框架 DB-GPT-Hub。在 DB-GPT 框架下,構架了 Text2SQL 領域下的數據預處理 - 模型微調 - 模型預測 - 模型驗證 - 模型評估的全鏈路工作流程,如下圖所示:
DB-GPT-Hub 的架構流程圖
代碼庫設計
- 數據集構建:將原始文本到SQL數據加工成適合微調LLM的格式(例如,列表1中顯示的TRF),這包括將模式和數據庫描述整合到提示中作為指令,以及在訓練和評估期間增強性能的各種問題表示。此外,我們還將選擇不同的少樣本策略,例如示例選擇和組織,來構建評估數據集(Gao等人,2023)。
- 訓練:支持使用PEFT策略對開源LLM進行微調。我們支持從小到大的模型規模的大多數公共架構,例如Qwen、Llama、Baichuan和ChatGLM。
- 預測:支持對開源LLM的微調版本以及閉源LLM進行SQL查詢推理。我們支持少樣本和零樣本方法,以生成特定場景下的SQL。
- 評估:包含不同的指標(EX、EM、有效效率得分(VES)),以從不同角度評估生成的SQL的性能。
數據集
Spider是一個大規模跨域數據集,包含10,181個自然語言查詢,5,693個獨特的復雜SQL查詢,涵蓋200個數據庫,覆蓋138個領域。該數據集的標準協議將其分為8,659個訓練樣本和2,147個測試樣本,分布在34個數據庫中。SQL查詢分為四個難度級別,即簡單、中等、困難和超難。如下:
簡單:
Question: What is the number of cars with more than 4 cylinders?
SQL:SELECT COUNT (*)FROM cars_dataWHERE cylinders > 4
中等:
Question: For each stadium, how many concerts are there?
SQL:SELECT T2.name, COUNT (*) FROM concert AS T1 JOIN stadium AS T2ON T1.stadium_id = T2.stadium_idGROUP BY T1.stadium_id
較難:
Question: Which countries in Europe have at least 3 car manufacturers?
SQL:SELECT T1.country name FROM countries AS T1 JOIN continents AS T2 ON T1.continent T2.cont_id JOIN car makers AS T3 O N T1.country_id = T3.country WHERE T2.continent = 'Europe' GROUPBY T1.country_name HAVINGCOUNT (*) >= 3
極難:
Question: What is the average life expectancy in the countries where English is not the official language?
SQL:SELECT AVG(life_expectancy) FROM country WHERE name NOT IN ( SELECT T1.name FROM country AS T1 JOIN country_language AS T2 ON T1.code = T2.country_code WHERE T2.language = "English" AND T2.is_official = "T")
其他數據集:
- WikiSQL: 一個大型的語義解析數據集,由80,654個自然語句表述和24,241張表格的sql標注構成。WikiSQL中每一個問句的查詢范圍僅限于同一張表,不包含排序、分組、子查詢等復雜操作。
- CHASE: 一個跨領域多輪交互text2sql中文數據集,包含5459個多輪問題組成的列表,一共17940個<query, SQL>二元組,涉及280個不同領域的數據庫。
- BIRD-SQL:數據集是一個英文的大規模跨領域文本到SQL基準測試,特別關注大型數據庫內容。該數據集包含12,751對文本到SQL數據對和95個數據庫,總大小為33.4GB,跨越37個職業領域。BIRD-SQL數據集通過探索三個額外的挑戰,即處理大規模和混亂的數據庫值、外部知識推理和優化SQL執行效率,縮小了文本到SQL研究與實際應用之間的差距。
- CoSQL:是一個用于構建跨域對話文本到sql系統的語料庫。它是Spider和SParC任務的對話版本。CoSQL由30k+回合和10k+帶注釋的SQL查詢組成,這些查詢來自Wizard-of-Oz的3k個對話集合,查詢了跨越138個領域的200個復雜數據庫。每個對話都模擬了一個真實的DB查詢場景,其中一個工作人員作為用戶探索數據庫,一個SQL專家使用SQL檢索答案,澄清模棱兩可的問題,或者以其他方式通知。
按照NSQL的處理模板,對數據集做簡單處理,共得到約20w條訓練數據
為了充分利用數據庫中的表和字段等相關信息,對 Spider 中的原始數據進行處理,用自然語言表示數據庫包含的表結構以及表結構包含的字段以及相應的主鍵和外鍵等,經過數據預處理后,可以得到如下的數據格式:
{
"instruction": "concert_singer(數據庫名) contains tables(表) such as stadium, singer, concert, singer_in_concert. Table stadium has columns(列) such as stadium_id, location, name, capacity, highest, lowest, average. stadium_id is the primary key(主鍵). Table singer has columns such as singer_id, name, country, song_name, song_release_year, age, is_male. singer_id is the primary key. Table concert has columns such as concert_id, concert_name, theme, stadium_id, year. concert_id is the primary key. Table singer_in_concert has columns such as concert_id, singer_id. concert_id is the primary key. The year of concert is the foreign key(外鍵)of location of stadium. The stadium_id of singer_in_concert is the foreign key of name of singer. The singer_id of singer_in_concert is the foreign key of concert_name of concert.",
"input": "How many singers do we have?",
"response": "select count(*) from singer"
}
{
"instruction": "concert_singer(數據庫名)包含表(表),例如stadium, singer, concert, singer_in_concert。表體育場有列(列),如stadium_id、位置、名稱、容量、最高、最低、平均。Stadium_id是主鍵(主鍵)。表singer有這樣的列:singer_id、name、country、song_name、song_release_year、age、is_male。Singer_id為主鍵。表concert有如下列:concert_id、concert_name、theme、stadium_id、year。Concert_id是主鍵。表singer_in_concert有如下列:concert_id, singer_id。Concert_id是主鍵。演唱會年份是場館位置的外鍵(外鍵)。singer_in_concert的stadium_id是歌手名的外鍵。singer_in_concert的singer_id是concert的concert_name的外鍵。",
"input": "我們有多少歌手?",
"response": "select count(*) from singer"
}
為了更好的利用大語言模型的理解能力,使用了 prompt dict 以優化輸入,如下所示:
SQL_PROMPT_DICT = {
"prompt_input": (
"I want you to act as a SQL terminal in front of an example database. "
"Below is an instruction that describes a task, Write a response that appropriately completes the request.\n\n"
"###Instruction:\n{instruction}\n\n###Input:\n{input}\n\n###Response: "
),
"prompt_no_input": (
"I want you to act as a SQL terminal in front of an example database. "
"Below is an instruction that describes a task, Write a response that appropriately completes the request.\n\n"
"###Instruction:\n{instruction}\n\n### Response: "
),
}
Spider數據集上TRP格式的查詢-響應對
指標:
使用兩個常用的指標,精確集匹配準確率(EM)和執行準確率(EX),來評估所有模型的性能。EM衡量預測SQL查詢與其對應真實值之間的匹配SQL關鍵字,而EX比較預測SQL查詢的執行輸出與某些數據庫實例上真實SQL查詢的執行輸出。由于對于給定問題可能存在多個有效的SQL查詢,EX提供了對模型性能更精確的估計。在這兩種指標中,較高的值被認為更好。主要使用EX來評估論文中SQL的準確性。
LLM
支持基座模型
微調資源
為了確保公平比較,對所有LLM使用相同的最大上下文長度2048。在評估期間,留下512個token用于響應生成。將參數溫度設置為0,以消除隨機性的影響。
實驗
參考文獻
- paper:DB-GPT-Hub: Towards Open Benchmarking Text-to-SQL Empowered by Large Language Models,https://arxiv.org/abs/2406.11434
- code:https://github.com/eosphoros-ai/DB-GPT-Hub
- text2sql benchmark:https://github.com/eosphoros-ai/Awesome-Text2SQL
本文轉載自公眾號大模型自然語言處理 作者:余俊暉
