2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-03-31

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

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

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

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

なるほど。早速やってみます。クラスターにopenaiライブラリをインストールして起動します。APIキーはDatabricksシークレットから読み込みます。

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")

コンプリーションを返却するように関数を変更します。

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を生成してください。文字列には日本語を使用してください。

Python
sql = openai_completion("Databricksのhive_metastoreのデータベースtakaakiyayoi_dbにopenai_testというテーブルを作成するSQLを生成してください。カラムは4つで文字列と日付型を含めてください。ダミーのレコードを10行追加するSQLを生成してください。文字列には日本語を使用してください。")
print(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
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
Screenshot 2023-03-31 at 15.06.38.png

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

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にも組み込まれて、新たなプログラミングスタイルが確立されそう。そもそも、勝手にコーディングされて実行されそう(実際にされているケースがあるようですが)。

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

Python
sql = openai_completion("テーブルtakaakiyayoi_db.openai_testから5行取得するSQLを生成してください。")
print(sql)
display(spark.sql(sql))
SELECT * 
FROM takaakiyayoi_db.openai_test
LIMIT 5;

Screenshot 2023-03-31 at 15.12.16.png

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

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

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

Databricks無料トライアル

Databricks無料トライアル

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?