paint-brush
ChatSQL: ChatGPT を有効にしてプレーン テキストから SQL クエリを生成する@ademakdogan
6,963 測定値
6,963 測定値

ChatSQL: ChatGPT を有効にしてプレーン テキストから SQL クエリを生成する

adem17m2023/06/21
Read on Terminal Reader

長すぎる; 読むには

私たちの目的は、プレーンテキストを使用してデータベースから情報を取得することです。私たちの作業では、ターゲット データベースとして MySQL を利用しました。ただし、このアプローチは、他のデータベースに対するクエリの生成にも使用できます。サンプルデータベースを以下に示します。
featured image - ChatSQL: ChatGPT を有効にしてプレーン テキストから SQL クエリを生成する
adem HackerNoon profile picture
0-item

ChatGPT は 2020 年 6 月にリリースされ、OpenAI によって開発されました。それは多くの分野で革命的な発展をもたらしました。これらの領域の 1 つは、データベース クエリの作成です。データベース クエリは、 ChatGPTを介してプレーン テキストから生成できます。ほとんど知識のないデータベースを扱うのに役立ちます。


私たちの日常生活に徐々に統合されている人工知能は、ChatGPT の台頭により大きな勢いを増しています。プロジェクトに移る前に、ChatGPT について簡単に見てみましょう。


ChatGPT の機能を完全に理解するには、その基礎となるアーキテクチャをしっかりと理解することが不可欠です。 ChatGPT はGPTアーキテクチャに基づいて開発されました。それでは、まずトランスについて見てみましょう。


プロジェクトに直接アクセスするには、ここをクリックしてください。


図 1. トランスフォーマーのエンコーダーとデコーダー

トランスフォーマーは seq2seq フレームワークを利用し、あるシーケンスを別のシーケンスに変換できます。シーケンスには順序が定義されています。実例として、文は一連の単語として見ることができます。 Transformers は、テキスト翻訳などの NLP を解決するためにも使用できます。このアーキテクチャをトレーニングするには、ラベル付きの大量のデータが必要です。これを変圧器が学習するのは困難です。この問題を解決するには転移学習を使用できます。トランスフォーマーは、エンコーダーとデコーダーという 2 つのコンポーネント (図 1) で構成されており、どちらも熟練した言語表現を取得することに優れています。


この熟練度により、各コンポーネントから言語モデルを構築できるようになります。エンコーダをスタックすることにより、一般にBERTとして知られるトランスフォーマ双方向エンコーダ表現が得られます。同様に、デコーダユニットをスタックすることにより、GPT であるGenerative P re- Trainingを実現できます。私たちの場合は GPT に焦点を当てています。 GPT のコンテキストで転移学習について考えてみましょう。モデルを最初からトレーニングする場合、パラメーターは最初にランダムに設定されるため、通常は大量のデータが必要になります。ただし、パラメータが必要な値と偶然一致するシナリオを想像してください。このような場合、望ましい結果を達成するために大規模なデータセットは必要ありません。理解されるように、BERT と GPT は転移学習の概念で使用されます。


したがって、GPT トレーニングは 2 つの部分に分かれています。言語とは何かを理解するために GPT アーキテクチャをトレーニングする事前トレーニング パートと、特定の言語タスクで適切に実行できるように GPT アーキテクチャをさらにトレーニングするために転移学習を使用する微調整パートがあります。


図 2. 次の単語の予測のサンプル

GPT はランダムな単語列を入力として、次に最適な単語を予測する構造を持っています。予測の例を図 2 に示します。


言語モデリングは、言語の基本的な側面を理解するための理想的な基盤として選択されており、簡単に微調整できます。文自体が入力ラベルと出力ラベルの両方として機能するため、これは一般に自己教師ありタスクとして知られています。

図 3. ChatGPT 図 — 出典


ChatGPT に移りましょう。図 3 からわかるように、ChatGPT プロセス全体は 3 つの主要なステップに分割できます。最初のステップでは、言語自体の理解について事前にトレーニングされた GPT モデルが使用されます。次のステップでは、ユーザー プロンプトを効果的に処理し、それらのプロンプトに基づいて適切な応答を生成するようにモデルを微調整します。このプロセスを容易にするために、プロンプトを提供するだけでなく、各プロンプトに対して望ましい応答を指定するラベラーと連携して、ラベル付きデータを取得します。これにより、入力プロンプトと対応する出力応答の両方があるため、GPT モデルの教師付き微調整を行うことができます。


次のステップでは、最初のステップで取得した教師あり微調整モデルが使用されます。単一のプロンプトがモデルに渡され、複数の応答が生成されます。次に、ラベル作成者はこれらの応答の品質を評価し、ランク付けします。生成された各応答には、対応する報酬が割り当てられ、報酬モデルとして知られる別の GPT モデルをトレーニングするために利用されます。報酬モデルはそれ自体がモデルであるため、最初のプロンプトと応答の 1 つを入力として受け取り、出力として報酬を生成することによって機能します。この報酬は、応答の質または良さを定量化します。


3 番目のステップでは、目に見えないプロンプトが取得され、教師付き微調整モデルのレプリカに渡されます。これにより応答が生成され、報酬モデルを使用して評価され、そのランクや品質が決定されます。取得したランクは、すでに微調整されたモデルをさらに改良するために使用されます。これは、ランクを PPO モデルの損失関数に組み込むことで実現され、バックプロパゲーションを通じてモデルのパラメーターを更新できるようになります。特に興味深いのは、このプロセスがモデルが非毒性の動作を示すのに役立つだけでなく、事実に基づく応答を生成できることです。これは、報酬自体が応答の品質に基づいて生成されたためです。

チャットSQL

ではPythonを使ってChatGPTでプロジェクトを作ってみましょう。このプロジェクトでは LangChain フレームワークが使用されます。


私たちの目的は、プレーンテキストを使用してデータベースから情報を取得することです。私たちの作業では、ターゲット データベースとして MySQL を利用しました。ただし、このアプローチは、他のデータベースに対するクエリの生成にも使用できます。サンプルデータベースを以下に示します。


すべてのコードはここにあります( https://github.com/ademakdogan/ChatSQL )

 +-----+--------------------------------------------------------+------------------------+-------------------+--------+------------------+ | ID | Title | Author | Genre | Height | Publisher | +-----+--------------------------------------------------------+------------------------+-------------------+--------+------------------+ | 1 | Fundamentals of Wavelets | Goswami, Jaideva | signal_processing | 228 | Wiley | | 2 | Data Smart | Foreman, John | data_science | 235 | Wiley | | 3 | God Created the Integers | Hawking, Stephen | mathematics | 197 | Penguin | | 4 | Superfreakonomics | Dubner, Stephen | economics | 179 | HarperCollins | | 5 | Orientalism | Said, Edward | history | 197 | Penguin | | 6 | Nature of Statistical Learning Theory, The | Vapnik, Vladimir | data_science | 230 | Springer | | 7 | Integration of the Indian States | Menon, VP | history | 217 | Orient Blackswan | | 8 | Drunkard's Walk, The | Mlodinow, Leonard | science | 197 | Penguin | | 9 | Image Processing & Mathematical Morphology | Shih, Frank | signal_processing | 241 | CRC | | 10 | How to Think Like Sherlock Holmes | Konnikova, Maria | psychology | 240 | Penguin | | 11 | Data Scientists at Work | Sebastian Gutierrez | data_science | 230 | Apress | | 12 | Slaughterhouse Five | Vonnegut, Kurt | fiction | 198 | Random House | | 13 | Birth of a Theorem | Villani, Cedric | mathematics | 234 | Bodley Head | | 14 | Structure & Interpretation of Computer Programs | Sussman, Gerald | computer_science | 240 | MIT Press | | 15 | Age of Wrath, The | Eraly, Abraham | history | 238 | Penguin | | 16 | Trial, The | Kafka, Frank | fiction | 198 | Random House | | 17 | Statistical Decision Theory' | Pratt, John | data_science | 236 | MIT Press | | 18 | Data Mining Handbook | Nisbet, Robert | data_science | 242 | Apress | | 19 | New Machiavelli, The | Wells, HG | fiction | 180 | Penguin | | 20 | Physics & Philosophy | Heisenberg, Werner | science | 197 | Penguin | | 21 | Making Software | Oram, Andy | computer_science | 232 | O'Reilly | | . | ....... | ....... | .... | ... | .... | | . | ....... | ....... | .... | ... | .... |

ChatSQL は 2 つの主要な部分で構成されます。まず、ChatGPT を介して、指定されたプレーン テキストから mysql クエリが生成されます。これらの生成されたクエリが実行されます。 2 番目のステップでは、データベースに返された結果が評価されます。この段階では、結果はユーザーに直接提示することも、さらなる分析と解釈のために ChatGPT に送り返すこともできます。そのため、ChatGPT を使用してデータベースについてチャットできます。


ユーザーが「身長が 175 より大きく 178 より小さい本のタイプのフィクションを見せてください。作者は 'ドイル、アーサー コナン' であってはなりません。」と望んでいるとします。したがって、この場合は次のコマンドを使用できます。


 python3 chatsql.py -p 'Show me the book type fiction which they height bigger than 175 and smaller than 178. The author shouldn't be 'Doyle, Arthur Conan'. '


その結果、以下の情報が得られる。

 CHATGPT QUERY------------------: SELECT * FROM bt WHERE Genre = 'Fiction' AND Height > 175 AND Height < 178 AND Author != 'Doyle, Arthur Conan' RAW RESULT------------------: [(32, 'Pillars of the Earth, The', 'Follett, Ken', 'fiction', 176, 'Random House'), (37, 'Veteran, The', 'Forsyth, Frederick', 'fiction', 177, 'Transworld'), (38, 'False Impressions', 'Archer, Jeffery', 'fiction', 177, 'Pan'), (72, 'Prisoner of Birth, A', 'Archer, Jeffery', 'fiction', 176, 'Pan'), (87, 'City of Joy, The', 'Lapierre, Dominique', 'fiction', 177, 'vikas'), (128, 'Rosy is My Relative', 'Durrell, Gerald', 'fiction', 176, 'nan')] PROCESSED RESULT------------------ : The books 'Pillars of the Earth, The' by Ken Follett, 'Veteran, The' by Frederick Forsyth, 'False Impressions' by Jeffery Archer, 'Prisoner of Birth, A' by Jeffery Archer, 'City of Joy, The' by Dominique Lapierre, and 'Rosy is My Relative' by Gerald Durrell are all fiction books with 176 or 177 pages published by Random House, Transworld, Pan, Vikas, and Nan, respectively.


データベースの列に適切な名前が付けられている場合、chatgpt はこれらの名前を理解し、それに応じてクエリに応答します。ただし、データベース内の列名が意味を持たない場合や、ChatGPT がそのコンテキストを完全に理解できない場合があります。したがって、システムが正しく機能することを保証するには、ChatGPT にデータベースに関する事前情報を提供する必要があります。 Info.json ファイルを使用して情報を追加できます。

 +-----+--------------------------------------------------------+------------------------+-------------------+------+------------------+ | ID | aa | bb | cc | dd | ee | +-----+--------------------------------------------------------+------------------------+-------------------+------+------------------+ | 1 | Fundamentals of Wavelets | Goswami, Jaideva | signal_processing | 228 | Wiley | | 2 | Data Smart | Foreman, John | data_science | 235 | Wiley | | 3 | God Created the Integers | Hawking, Stephen | mathematics | 197 | Penguin | | 4 | Superfreakonomics | Dubner, Stephen | economics | 179 | HarperCollins | | 5 | Orientalism | Said, Edward | history | 197 | Penguin | | . | ....... | ....... | .... | ... | .... | | . | ....... | ....... | .... | ... | .... |

例として、以下のような不適切な名前のデータベースがあるとします。この場合、データベースに関する必要な情報が info.json ファイルに入力されます。


{"bt": "テーブル名"、"aa": "本のタイトル"、"bb": "本の著者"、"cc": "本の種類"、"dd": "本の高さ" book", "ee": "書籍出版社"}

次に、同じコマンドを使用します。

 python3 chatsql.py -p 'Show me the book type fiction which they height bigger than 175 and smaller than 178. The author shouldn't be 'Doyle, Arthur Conan'. '


データベース内の列名が適切に選択されていない場合でも、正しい情報が提供されているため、chatgpt は正しいクエリを生成します。

 {'query': "SELECT aa, bb, cc, dd FROM bt WHERE cc = 'fiction' AND dd > 175 AND dd < 178 AND bb != 'Doyle, Arthur Conan'", 'raw_result': "[('Pillars of the Earth, The', 'Follett, Ken', 'fiction', 176), ('Veteran, The', 'Forsyth, Frederick', 'fiction', 177), ('False Impressions', 'Archer, Jeffery', 'fiction', 177), ('Prisoner of Birth, A', 'Archer, Jeffery', 'fiction', 176), ('City of Joy, The', 'Lapierre, Dominique', 'fiction', 177), ('Rosy is My Relative', 'Durrell, Gerald', 'fiction', 176)]", 'processed_result': '\nThe books "Pillars of the Earth, The" by Ken Follett, "Veteran, The" by Frederick Forsyth, "False Impressions" by Jeffery Archer, "Prisoner of Birth, A" by Jeffery Archer, "City of Joy, The" by Dominique Lapierre and "Rosy is My Relative" by Gerald Durrell are all fiction and have page lengths of 176 or 177.'}


次のプロジェクトは、無料モデル (Llama) を使用してプロンプトからクエリ (mongo、sql) を生成することになる可能性があります。


プロジェクトリポジトリ: https://github.com/ademakdogan/ChatSQL

Github : https://github.com/ademakdogan

Linkedin : https://www.linkedin.com/in/adem-akdoğan-948334177/

参考文献

[1] Brown, TB、Mann, B.、Ryder, N.、Subbiah, M.、Kaplan, J.、Dhariwal, P.、および Amodei, D. (2020)。言語モデルは少数回の学習です。 arXiv プレプリント arXiv:2005.14165。


[2] Radford, A.、Wu, J.、Child, R.、Luan, D.、Amodei, D.、Sutskever, I. (2019)。言語モデルは教師なしのマルチタスク学習者です。 OpenAI ブログ。


[3] Vaswani, A.、Shazeer, N.、Parmar, N.、Uszkoreit, J.、Jones, L.、Gomez, AN、および Polosukhin, I. (2017)。必要なのは注意力だけです。神経情報処理システムの進歩 (pp. 5998–6008)。


[4] Devlin, J.、Chang, MW、Lee, K.、Toutanova, K. (2019)。 BERT: 言語理解のための深い双方向トランスフォーマーの事前トレーニング。計算言語学協会北米支部の 2019 年会議議事録: 人間の言語技術 (Vol. 1、pp. 4171–4186)。


[5] Lewis, M.、Liu, Y.、Goyal, N.、Ghazvininejad, M.、Mohamed, A.、Levy, O.、および Zettlemoyer, L. (2019)。 BART: 自然言語の生成、翻訳、理解のためのシーケンス間の事前トレーニングのノイズ除去。 arXiv プレプリント arXiv:1910.13461。


[6] Raffel, C.、Shazeer, N.、Roberts, A.、Lee, K.、Narang, S.、Matena, M.、… & Liu, PJ (2019)。統合されたテキストからテキストへの変換機能を使用して転移学習の限界を探ります。 arXiv プレプリント arXiv:1910.10683。


[7] Vaswani、A.、他。 (2017年)。 Transformer-XL: 固定長のコンテキストを超えた注意深い言語モデル。 arXiv プレプリント arXiv:1901.02860。