深圳網(wǎng)站建設怎樣容易南寧網(wǎng)絡推廣品牌
在眾多的 AI 大模型的應用場景中,Text-to-SQL,也就是文本轉(zhuǎn) SQL,是其中實用性很高的一個。Text-to-SQL 充分利用了大模型的優(yōu)勢,把用戶提供的自然語言描述轉(zhuǎn)換成 SQL 語句,還可以執(zhí)行生成的 SQL 語句,再把查詢結(jié)果返回給用戶。
在實際的業(yè)務系統(tǒng)中,絕大部分數(shù)據(jù)都保存在數(shù)據(jù)庫中,其中以關系數(shù)據(jù)庫為主流。這使得 SQL 成為了很多人的必備技能,除了程序員之外,還包括大量非技術的分析人員。這些人沒有技術背景, 學習 SQL 對他們來說有一定的難度。但是他們懂得自己的數(shù)據(jù)需求,知道如何用自然語言來描述自己的需求,但是 SQL 嚴格的語法會成為他們的障礙。大模型可以成為他們的助手。只需要把查詢需求輸入大模型,大模型可以根據(jù)描述生成 SQL 語句。通過大模型的方法調(diào)用,還可以直接運行生成的 SQL 語句,得到結(jié)果之后返回給用戶。
文本轉(zhuǎn) SQL 的實現(xiàn)所涉及的方面比較多,可以很簡單,也可以很復雜。實現(xiàn)的復雜度和幾個因素有關。
第一個因素是數(shù)據(jù)庫中表的數(shù)量。在給大模型的提示中,需要包含數(shù)據(jù)庫中表的元數(shù)據(jù),包括表的名稱、描述、表中列的名稱、類型和描述等。大模型根據(jù)這些信息來生成 SQL。如果數(shù)據(jù)庫中的表的數(shù)量較少,全部這些表的元數(shù)據(jù)可以直接內(nèi)嵌在提示中。如果數(shù)據(jù)庫中的表很多,超過了大模型的上下文窗口的長度限制,那就需要用到檢索增強生成(RAG)技術。把全部數(shù)據(jù)庫和表的元數(shù)據(jù),保存在向量數(shù)據(jù)庫中。根據(jù)用戶的查詢,從向量數(shù)據(jù)庫中檢索到可以滿足用戶查詢需求的表的元數(shù)據(jù),僅把這些表的元數(shù)據(jù)包含在提示中就足夠了。
第二個因素是生成 SQL 語句的驗證。大模型生成的 SQL 語句,不一定總是正確的,可能有語法錯誤,也可能有邏輯錯誤。具體的問題,只有真正執(zhí)行了 SQL 語句之后才能知道??梢园褕?zhí)行時的錯誤信息,和 SQL 語句一起,再次發(fā)送給大模型,由大模型對錯誤的 SQL 語句進行修改。這樣重復迭代多次,從而得到最終正確的結(jié)果。
這里給出了一個簡單的代碼示例,不考慮使用檢索增強生成,以及 SQL 的驗證。對于較小規(guī)模的數(shù)據(jù)庫,以及相對簡單的查詢需求,一次生成的 SQL 語句的準確性已經(jīng)比較高了。
這個例子使用 Spring AI 開發(fā),使用 JDBC 提取出數(shù)據(jù)庫的元數(shù)據(jù),以 JSON 格式嵌入在發(fā)送給大模型的提示中,另外創(chuàng)建了一個大模型使用的工具,可以執(zhí)行 SQL 語句。完整的代碼在 GitHub (https://github.com/JavaAIDev/simple-text-to-sql) 上。
這里通過一個 Netflix 上的節(jié)目的數(shù)據(jù)庫來作為演示,這個數(shù)據(jù)庫里面只有一張表。表的結(jié)構(gòu)和包含的數(shù)據(jù)如下所示。
使用 JDBC 提取出來數(shù)據(jù)庫的元數(shù)據(jù),所生成的 JSON 格式的內(nèi)容如下所示。
輸入的查詢是, how many movies are produced in United States?,意思是“在美國制作的電影的數(shù)量”。大模型的輸出如下所示,數(shù)量是 2058。
所生成的 SQL 語句如下所示。在生成的 SQL 語句中,根據(jù) type 和 country 進行了過濾。在 SQL 客戶端中執(zhí)行所生成的語句,可以得到同樣的結(jié)果。
以上就是使用大模型進行文本轉(zhuǎn) SQL 的基本實現(xiàn)方式。