Text-to-SQL は、純粋言語の質問をデータベースで実行される SQL クエリに変換することを含む純粋言語処理 (NLP) ジョブです。
TV マスク データベースの Text-to-SQL インスタンスは次のとおりです:
クエリを割り当てる: 連載タイトル「Sky Radio」のテレビチャンネルの悲鳴は何ですか?
マネキン: SELECT Vow material FROM TV_Channel WHERE series_name=’Sky Radio’ ;
結果: 歌。
Text-to-SQL の最も基本的な動機は、純粋な言語インターフェイスが、データベースと連携する SQL クエリを作成するための技術的な旅のない顧客を支援することです。 リレーショナル データベースへの英語での対応に追われていませんか?
この投稿では、最も人気のある最先端の Text-to-SQL プログラムの概要を説明し、最も人気のある Text-to-SQL 用の OpenAI GPT マネキンで実験を行い、回り道をして、何がどのようなものであるかについての私の概念を説明します。
Text-to-SQL プログラムは、当面は
Spider ベンチマーク
。これには、ラベル付けされた SQL クエリを使用した 10,000 の質問が含まれています。
このベンチマークで最高位にランクされている最先端のアプローチは、単純なフレームワークをあまり利用していません。報酬言語のマネキンを盗みます。 (BERT や T5 に似ています)、純粋な言語のテキストについて事前に教育された後、ラベル付けされた SQL 生成の例について教師付きコーチングを実行します。 このパスの名前は「magnificent-tuning」です。 いくつかのアプローチは、世代の災害を軽減するための前処理段階
によって、このフレームワークの高度で実行されます、または 後処理でまとめて生成されたSQLの正しさを強化する段階
.
このフレームワーク (教育を受けた言語マネキン + 素晴らしいチューニング) の最も根本的な問題は価格です。 適切な調整により、テキストから SQL への生成イニシアチブに適した、教育を受けたマネキンから個別にホストする必要がある特定の役割のマネキンが生成されます。 さらに、最も人気のある最新の例に追いつくために繰り返す必要がある、壮大なチューニングのコンピューティング コストがあります。 言語ガジェットが増えると、これらの料金はさらに長くなります。
OpenAI の GPT-3.5 ガジェット、特にdavinci シリーズと ChatGPT の勝利は、言語の習得とコードを書く才能に感銘を与えました。 彼らは特別なチューニングなしで SQL クエリを書くことさえできます: 適切なスキーマと問い合わせを与えると、彼らはあなたに代わって SQL を書きます。 20 を超える人間の言語と膨大な数のプログラミング言語に習熟しているため、このスキルは完全に驚くべきものではありません。 しかし、実際にはどれほど正直なのでしょうか。 そのパフォーマンスを確認するために、いくつかの実験を行いました。
Setup
このためにベテラン
LlamaIndex (バージョン 0.4.19) には、OpenAI の GPT ガジェットを利用して、テキスト ドキュメント、ファイル ベース、および関係をまとめて構造化および非構造化ファイル ソースをクエリするための簡単に利用できる API があります。データベース、純粋な言語を使用。 これを Spider ベンチマークのデータベースにリンクし、最も人気のある GPT-3.5 マネキン text-davinci-003 を使用して概要を実行しました。 。 の場合は、エンド ツー エンドのベンチマーク スクリプトも入手する必要があります )ここ。
Spider ベンチマーク内で、実行精度 は例の断片を測定し、それによって予測された SQLクエリの実行出力は、ゴールデン (つまり、人間がラベルを付けた) SQL クエリの実行出力に適合します。 正確な一致精度 は、予測された SQL がゴールデン SQL に構文的に適合する例のフラグメントを測定します。 ただし、2 つの比較可能な SQL が不一致であるとフラグが立てられるため、適切な一致の精度はそれほど難しくありません。 Peek くも紙 詳細については。
私が発見したこと
コーチングの例(GPT-3.5はベテランであり、壮大なチューニングをしていないため、すべてブラインドランです)の中で、40.7%の実行を実行しました正確さ。 パターン(バリデーション)の例では、50%の実行精度で実行しました
結果の概要については、下の表を参照してください。 このブログ投稿の料金を低く抑えるために、ベンチマーク内のすべての質問の 1% をランダムにサンプリングしました。 その結果、コーチング例では86問、パターン例では10問となっています
トレーニング例の結果
+------------------------+-- ---+--------+-------+-------+------+| | | 簡単 | ミディアム | ミディアム | 疲れる | 追加 | すべて |+------ ------+-------+--------+-------+------ -------+ | | カウント | 24 | 28 | 17 | 17 | 86 || 実行精度 | 0.833 | 0.357 | 0.176 | 0.118 | 0.407|| 正確なマッチング精度| 0.833 | 0.321 | 0.118 | 0.059 | 0.372|+------ ------+-------+--------+-------+------ --------+の結果パターン例+------------------------+-------+--------+---- --+-------+------+| | | 簡単 | ミディアム | ミディアム | 疲れる | 追加 | すべて |+------ ------+-------+--------+------+------- +-----+| カウント | 3 | 3 | 3 | 1 | 10 || 実行精度 | 1.000 | 0.333 | 0.000| 1.000 | 0.500|| 正確なマッチング精度| 1.000 | 0.333 | 0.000| 1.000 | 0.500|+------ ------+-------+--------+------+------- +-----+
次に入れると、Spider ベンチマークで最も人気のある №1 マネキンは、84.1% の実行精度と 80.5% の適切な一致精度を達成しています 総パターン例について。 したがって、出生時の遭遇では、これは、クラス内の究極の GPT-3.5 マネキン (50%、50%) のゼロ ショットのブラインド ダウドル パフォーマンスと、最も簡単で壮大に調整されたテキストとの間の巨大な穴のように見えます。 SQL マネキン (84.1%, 80.5%).
エラー診断
GPT-3.5ガジェットを使った過去の実験を通して実際、ChatGPT と一緒に使用すると、非常に複雑なクエリが生成され、適切なヒントを使用して実行パフォーマンスが向上し、書き換えが助言されることがわかりました。 私には、これらのガジェットが実際に SQL 言語にタグ付けされているように思えます。 したがって、Spider ベンチマークの精度の数値は驚くべきものです。 結局のところ、ベースライン ガジェットは Text-to-SQL を最も実用的に実行できますが、GPT-3.5 ガジェットは Python を記述することさえできます!
ということで、パターン例の中のエラーケースを詳しく見てみました。 私が気付いたのは、Spider ベンチマークの精度測定が厳しすぎるということです。多くの生成された SQL は意味的には正直ですが、エラーとしてマークされていません。 以下に、パターン例のエラーを 5 つ示します。
エラー例1.
- (中くらい) -- クエリを次のように割り当てます。該当するお薬 -- 種類の説明 -- pred:から適合 WHERE tourney_name='オーストラリアの始まり'
SELECT Therapies.cost_of_treat, Treatment_Types. Treatment_type_descriptionFROMセラピー
INNER JOIN Treatment_Types
ON 治療法.治療の種類_コード=治療の種類.治療の種類_コード; - 金: T1.cost_of_treat, T2.treat_t を選択 ype_description
エラー例2.
FROM Therapies AS T1
T2 としての治療の種類の結合 ON T1.治療タイプコード=T2.治療タイプコード; の述語 SQL inquire は、事実上、この場合のゴールデン SQL に匹敵します。さまざまなエイリアスと JOIN ヒント — 実際にはここでは対象外です.-- クエリを:漫画を公開しているテレビチャンネルは何ですか ――「ブルービートルの押し上げ!」? テレビ チャンネルのシリーズ タイトルを一覧表示します。-- pred:-- (中央値)
SELECT TV_Channel.series_nameクールな挑戦動画から INNER JOIN TV_series ON クールな挑戦 movie.identification=TV_series.identificationINNER JOIN TV_Channel ON TV_series.Channel=TV_Channel.identification
WHERE クールな挑戦的な映画.タイトル='上向きのプッシュ';--ゴールド: SELECT T1.series_name
From TV_Channel AS T1 JOIN クールな挑戦的な映画 AS T2 ON T1.identification=T2.ChannelWHERE T2.Title="ブルーの上向きのプッシュ甲虫!";
GPT は、TV_series との不要な JOIN を生成して勝ちたいようです。 これは、問い合わせ内の「シリーズ」の言及の結果である可能性さえあります. これは一連の結果に影響を与えなくなりました.
エラー例3.
- - (面倒) -- クエリを割り当てるto: 学年超過が多いのはどの学年? )-- pred: 成績を選択、COUNTAS num_highschoolersFROM Highschooler
学年別グループ ORDER BY num_highschoolers DESCLIMIT 1;- 金: グレード選択
高校生から
GROUP BY gradeORDER BY countDESCLIMIT 1;GPT が追加 私が実際に得意としているカウントの列は、黄金の問い合わせよりも健康的です.
エラー例 4.
-- (骨の折れる) -- クエリを次のように割り当てます: 究極の非友好的な側面を持つ勝者の称号を救います-- そして、オーストラリアの Commence トーナメントに参加しました。-- pred: SELECT 当選者名 から適合INNER JOIN ランキング ON Fits.winner_id=rankings.player_id
INNER JOIN ゲーマー ON フィット.winner_id=gamers.player_idWHERE tourney_name='オーストラリアの始まり' AND ランキング.ランキングポイント=(SELECT MAX(ランキングポイント) FROM ランキング)ORDER BY rankings.ranking_points DESC;
- 金:
SELECT 当選者名ORDER BY Winner_rank_points DESC
LIMIT 1;
の問い合わせは、「最高の非友好レベル と がオーストラリアの開始トーナメントに参加した」と言及しているため、不明です。 2つの正直な前提条件。 したがって、これについてGPTを非難するつもりはありません。 「LIMIT 1」を使用する可能性がありますが、ここでの一連の結果は、私の考えでは観察する必要はありません。 実は結果は全て「セリーナ・ウィリアムズ」です
最も実用的な1つの照準失敗ケースがあります.
エラー例5.
-- (骨の折れる)
-- クエリを次のように割り当てます: 名前は何ですか所有者が投薬のために1000頭以上を使用していない犬の割合?-- pred: SELECT D.titleFROM 犬DINNER JOIN 所有者 O ON D.owner_id=O.owner_id
INNER JOIN セラピー T ON D.dog_id=T.dog_idWHERE T .cost_of_treat <=1000; - 金: 名前を選択 )FROM 犬WHERE dog_id NOT IN ( SELECT dog_id FROM トリートメントGROUP BY dog_id HAVING SUM(cost_of_treat)> 1000
);
この場合、GPT は正直な SUM 犬歯をフィルタリングするために集約します。 ここにエラーがあります。
結果が人間によって評価された場合、私と同じように、偽物と思われる最初の 4 つのケースが実際にマークされている必要があります。正直なところ、90%の精度が得られます。 ただし、100% の精度を達成するのはすぐに静かになります。 この真実に起因して、私は将来の SQL クエリを作成する信頼できる GPT を今は持っていませんが、ほとんどの場合、それは完全に、ドラフトを生成したり、実際にレイアウトしたテンプレートを終了したりするための楽観的なアシスタントです.
GPT-3.5 ガジェットの勝利は、例を提供することで、特定のイニシアチブを実行するように教育されることを示しています。 しかし、彼らが自由になる何ヶ月も前に、研究者たちは、ガジェットを研究する機械を教育する最近の仕事についてすでに話し合っていました。 “の-コンテキスト学習」または「数ショット学習」
インコンテキスト学習を使用して GPT マネキンをまとめるには、指示と有益な情報を提供するだけです。入力-出力 例 が促された段階で、マネキンは提供された例に従って義務を遂行するように教えられます。 このモデルは、マネキンの壮大な調整を必要としないため、一般的な GPT マネキンは高価なハードウェアを必要とせずにベテランになります。 さらに、最も人気のある GPT マネキンである davinci は、最大 4000 個のトークンを処理できます。これは、複雑な SQL クエリであっても入出力の例については十分です.
これは、文脈に沿った学習に報いるために私が作成したインスタンスです。 以下はOpenAIのtext-davinci-003マネキン
inquire が与えられた場合、PostgreSQL の方言内で SQL inquire を生成します。 次のレイアウトを実行します: スキーマ: 「ここに殺人テーブル アサーション」
クエリを割り当てる:「ここに問い合わせる」
「ここのSQL問い合わせ」
にクエリを割り当てます以下にいくつかの例を示します。 / と */ の間のフィードバックは、デモの動機.
例1
スキーマ: 殺人表の注文 (tstamp タイムスタンプ,波に沿ってボリュームシャッフル
);クエリを割り当て: を使用してメイク クリア ボリュームの時系列を生成します。次のクエリを割り当てます:steal ts_aggregate(tstamp, volume) as ts from orders;/値を持つテーブル: || || スタンプ || ボリューム ||| 2021-03-23 | 32.1 || 2021-04-21 | 55.2 |
お問い合わせの結果
|| ts ||| { (2021-03-23, 32.1), (2021-04-21, 55.2) } |*/
スキーマ: 殺人テーブルの乗り物 ( tstamp タイムスタンプ,
漂流に沿って距離シャッフル、vehicle_id int);
クエリを割り当て: すべての自動車の走行距離の時系列を生成します。クエリを次の場所に割り当てます:以内上記のように促されたので、テキストから SQL への変換である当面の義務を概説することから始めます。 次に、マネキンに透明な 指示 を提供して、明示的な口頭置換プロトコルの研究に勝つようにします。これにより、うまくいけば出力をプログラムで解析できます。 -知られています。 さらに、単一の インスタンス によって、 と呼ばれる最近の特定の人物によって概説された集約目標を紹介します。 ts_aggregate、これは現在 Postgres のセグメントではありません。 この目的は、私が作成したパーソナライズされた時系列ファイルの種類を出力します.
だらか、私GROUP BY make の使用を必要とするかなり多様な問い合わせを行います。 この問い合わせの動機は、マネキンの集計目的としての ts_aggregate の信念と、その動作スキルを確認することです。 GROUP BY.
と並んで以下は text-davinci-003 の出力です)。
GROUP BY
SQL が生成されます。 それはおそらく多分うまくいくでしょう自分でやってみる .steal vehicle_id, ts_aggregate(tstamp, distance) as ts from rides community by vehicle_id;
/値を持つテーブル: || || スタンプ || || 距離 || vehicle_id ||| 2021-03-23 | 3.2 | 1 || 2021-04-21 | 5.5 | 1 || 2021-03-30 | 2.4 | 2 |
お問い合わせの結果
|| 車両ID || ts ||| 1 | { (2021-03-23, 3.2), (2021-04-21, 5.5) } || 2 | { (2021-03-30, 2.4) } |
*/この事例から、マネキンは
ts_aggregate
は、以前は他に指定されていませんでしたが、促された中に見つかります。 入出力の例に完全に依存するのではなく、 ts_aggregate を使用して指定することも想像する必要があるということです。その機能的な署名、ドキュメント、または実装。=br>前述のように、「使用済み」の Text-to-SQL ガジェットの勝利は、事前に教育されたガジェットのフレームワークとそれに続く壮大なチューニングに依存していました。 これらのガジェットは 1 回だけ使用するように設計されており、専用のハードウェアを必要とするため、これは本質的に制限があります。 例として、マウントされたハードウェアで Text-to-SQL サービスを使用することに決めた場合、顧客がオフラインのときはエビを使用するだけで、多くの顧客がオンラインになると利用できなくなり、悲惨なサービスになります。
区別して、「マルチ活用」マネキンを環境アップ多くの場合、Text-to-SQL を組み合わせてさまざまなイニシアチブを提供し、状況に応じた学習を使用してすべてのジョブのマネキンを専門化することは、多くの場合、特別な雰囲気と十分な解決策です。 これにより、ハードウェアに資金を投入し、クエリを保持するワークロードをより適切に調整するための柔軟性がさらに高まります.
=br>これで説明されているように、このパスで教えられることは既に実行されています 紙。 これは、GPT やその他の拡張機能のベースライン機能として、これがどのように進歩するかを垣間見ることも困難です。 言語ガジェットはどんどん増えていきます
これから概要の演習では、GPT マネキンが複雑な SQL を記述できることは明らかですが、エラーが発生する可能性があり、非常に人間に愛されています。 マネキンは、不明確なプロンプトによってフレーズを途方にくれることさえあります。これは、人々がまれに方向を誤解する方法に似ています。 最も間違いなく、マネキンは単純なクエリを書くのに非常に健康的です. あるいは、SQL は適切な仕様であるのに対し、純粋な言語自体は適切ではないため、100% の精度で殺人を犯すことはありません。 さらに、問い合わせが非常に複雑な場合、純粋な言語を使用してそれを正確に指定することは複雑になります。この真実の結果として、私たちは、潜在的な可能性を賭けるために Text-to-SQL マシンにクエリを実行することは決してありません。いつでもそうであるように意図します。 ただし、これは、少しでもやめなければならないことを示しているわけではありません.
災害について考えられるのは、単一のテーブルフィルターとプロジェクトクエリに対して、非常に正直な Text-to-SQL 生成を既に獲得しているということです。 これらのクエリは、人々によって検証された災害もありません。 惨事がテーブル内の関連する行の検索である場合 (および LlamaIndex
)、結果には生成された実際の人による簡単な観察検証のための SQL 問い合わせ
特定の人がすべての問い合わせを検証する必要があるため、SQL は最も基本的なツールになります。 しかし、人々が SQL を書くのをより単純に設計できるでしょうか? Copilot は Python にとって素晴らしいものですが、正直な SQL を記述するには、基礎となるスキーマ、制約、および特定の人物が輪郭を描いたオブジェクトへの受信エントリが必要です。 快適なソフトウェア プログラムの災害には、楽観的な t を生成する必要があります。