こちらの続編的な記事です。
こちらでは単にOpenAI APIを呼び出していただけでした。
巷ではコーディングにも使えるとは聞いていましたが、ある方と会話している際にアイデアをいただきました。
ChatGPTにDatabricksのSQLを生成させられるのでは。さらには、そのまま実行できるのでは。
なるほど。早速やってみます。クラスターにopenaiライブラリをインストールして起動します。APIキーはDatabricksシークレットから読み込みます。
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")
コンプリーションを返却するように関数を変更します。
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を生成してください。文字列には日本語を使用してください。
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
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', '絵を描くのが好きです。');
テーブルが作成され、行が追加されます。なんだ、このプログラミング体験。
なお、プロンプト間では文脈が共有されないようで、テーブル作成と行追加を別のプロンプトにするとテーブルの構造が考慮されません。
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でこれをやるには勇気が必要です。
sql = openai_completion("テーブルtakaakiyayoi_db.openai_testから5行取得するSQLを生成してください。")
print(sql)
display(spark.sql(sql))
SELECT *
FROM takaakiyayoi_db.openai_test
LIMIT 5;
もっと色々探索してみます。