DatabricksからChatGPTを呼び出してボイラープレートコードを効率的に作成・活用する

こちらの続編的な記事です。

https://qiita.com/taka_yayoi/items/d52a90d8b694d730d139

こちらでは単にOpenAI APIを呼び出していただけでした。

巷ではコーディングにも使えるとは聞いていましたが、ある方と会話している際にアイデアをいただきました。

> ChatGPTにDatabricksのSQLを生成させられるのでは。さらには、そのまま実行できるのでは。

なるほど。早速やってみます。クラスターにopenaiライブラリをインストールして起動します。APIキーは[Databricksシークレット](https://qiita.com/taka_yayoi/items/7e4eae0786b94cb7a5de)から読み込みます。

```py:Python
import os
import openai

# Load your API key from an environment variable or secret management service
openai.api_key = dbutils.secrets.get("demo-token-takaaki.yayoi", "openai")
```

コンプリーションを返却するように関数を変更します。
```py:Python
def openai_completion(prompt):
  response = openai.Completion.create(model="text-davinci-003", prompt=prompt, max_tokens=3000)
  #print(response)
  return response.choices[0].text
```

このようなプロンプトでChatGPTを呼び出します。ダミーデータを保持するテーブルを作成してみます。

> Databricksのhive_metastoreのデータベースtakaakiyayoi_dbにopenai_testというテーブルを作成するSQLを生成してください。カラムは4つで文字列と日付型を含めてください。ダミーのレコードを10行追加するSQLを生成してください。文字列には日本語を使用してください。

```py:Python
sql = openai_completion("Databricksのhive_metastoreのデータベースtakaakiyayoi_dbにopenai_testというテーブルを作成するSQLを生成してください。カラムは4つで文字列と日付型を含めてください。ダミーのレコードを10行追加するSQLを生成してください。文字列には日本語を使用してください。")
print(sql)
```

```sql
CREATE TABLE takaakiyayoi_db.openai_test( 
    ID int,
    Name varchar(255),
    Birthday date,
    Description text
);

INSERT INTO takaakiyayoi_db.openai_test(ID, Name, Birthday, Description)
VALUES 
(1, '鈴木一郎', '2001-06-01', '趣味は野球です。'),
(2, '高橋太郎', '2000-04-03', '好きな食べ物は穀物です。'),
(3, '山本花子', '1999-11-05', 'よく散歩をします。'),
(4, '佐藤良子', '1998-09-12', '趣味は読書です。'),
(5, '田中龍', '1997-07-15', '好きな歌はJ-Popです。'),
(6, '中山りな', '1996-03-17', '趣味はダンスです。'),
(7, '加藤恵子', '1995-12-19', 'よく旅行をします。'),
(8, '伊藤かおり', '1994-10-21', '好きな本が小説です。'),
(9, '吉田真一', '1993-08-23', 'よく釣りをします。'),
(10, '山口一郎', '1992-06-25', '絵を描くのが好きです。');
```

おおー、すごい。しかし、これはエラーになります。文字列のデータ型は`text`ではなく`STRING`なので修正します。

Databricksの楽なところは、PythonでChatGPTを呼び出したのと同じノートブックでこのSQLを編集して実行できることです。次のセルを追加して、マジックコマンド`%sql`を記述します。これでこのセルではSQLが実行されるようになります。

```sql:SQL
%sql
CREATE TABLE takaakiyayoi_db.openai_test( 
    ID int,
    Name varchar(255),
    Birthday date,
    Description STRING
);

INSERT INTO takaakiyayoi_db.openai_test(ID, Name, Birthday, Description)
VALUES 
(1, '鈴木一郎', '2001-06-01', '趣味は野球です。'),
(2, '高橋太郎', '2000-04-03', '好きな食べ物は穀物です。'),
(3, '山本花子', '1999-11-05', 'よく散歩をします。'),
(4, '佐藤良子', '1998-09-12', '趣味は読書です。'),
(5, '田中龍', '1997-07-15', '好きな歌はJ-Popです。'),
(6, '中山りな', '1996-03-17', '趣味はダンスです。'),
(7, '加藤恵子', '1995-12-19', 'よく旅行をします。'),
(8, '伊藤かおり', '1994-10-21', '好きな本が小説です。'),
(9, '吉田真一', '1993-08-23', 'よく釣りをします。'),
(10, '山口一郎', '1992-06-25', '絵を描くのが好きです。');
```
テーブルが作成され、行が追加されます。なんだ、このプログラミング体験。
![Screenshot 2023-03-31 at 15.06.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d00f4856-b08f-1607-ec6b-7673dbecdb29.png)
![Screenshot 2023-03-31 at 15.06.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/525de5b1-afbd-6fdf-ae64-e2e496e9e4be.png)

なお、プロンプト間では文脈が共有されないようで、テーブル作成と行追加を別のプロンプトにするとテーブルの構造が考慮されません。

```py:Python
sql = openai_completion("テーブルtakaakiyayoi_db.openai_testに10行追加するSQLを生成してください。")
print(sql)
```
```
INSERT INTO takaakiyayoi_db.openai_test(column1, column2, column3, column4)
VALUES
(1, 11, 111, 1111),
(2, 22, 222, 2222),
(3, 33, 333, 3333),
(4, 44, 444, 4444),
(5, 55, 555, 5555),
(6, 66, 666, 6666),
(7, 77, 777, 7777),
(8, 88, 888, 8888),
(9, 99, 999, 9999),
(10, 101, 1011, 10111);
```

それにしても、これはすごい。もう少ししたら、このような機能がIDEにも組み込まれて、新たなプログラミングスタイルが確立されそう。そもそも、勝手にコーディングされて実行されそう([実際にされているケース](https://qiita.com/taka_yayoi/items/4dca63f26a654c296588#29-%E3%83%AA%E3%82%B9%E3%82%AF%E3%81%AE%E3%81%82%E3%82%8B%E7%B7%8A%E6%80%A5%E8%A1%8C%E5%8B%95%E3%81%AE%E5%8F%AF%E8%83%BD%E6%80%A7)があるようですが)。

なお、関数の戻り値を直接`spark.sql`に渡せば、人手を介さずにChatGPTの出力が実行されます。更新系のSQLでこれをやるには勇気が必要です。

```py:Python
sql = openai_completion("テーブルtakaakiyayoi_db.openai_testから5行取得するSQLを生成してください。")
print(sql)
display(spark.sql(sql))
```
```sql
SELECT * 
FROM takaakiyayoi_db.openai_test
LIMIT 5;
```
![Screenshot 2023-03-31 at 15.12.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/27f7fc6e-48b4-462a-a90b-6cadbc59bfff.png)

もっと色々探索してみます。

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)