ChatGPTにCSVのサンプルデータ作ってもらう

2023.03.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データアナリティクス事業本部の荒木です。

日々の業務の中でChatGPT使って何かできることないかなーと考えてまして、検証時などにサンプルのCSVデータ作るときがあるのですが、いつも適当な文字を入れてコピペで同じ行を作ったりしていたので、ChatGPTならデータをそれっぽく良い感じのにして作ってくれるんじゃないかなと思ったので試してみようと思います。

環境

  • Windows
  • WSL2(Ubuntu 20.04.4 LTS)
  • Python(3.8.10)

本題

ChatGPTブラウザから確認

ChatGPT自体の機能ではCSVファイル等を作ったりすることはできないので、ChatGPTに提案してもらったデータをPythonでCSVファイルにする必要があります。(ChatGPTからサンプルのコードまで教えてくれます。。すごい。。。)

まずはブラウザのChatGPTから欲しいサンプルデータを作ってもらえるのか試してみます。

CSVの中身となるデータをランダムに作成してくれているのでサンプルデータを作ることはできそうです。
なので、後はPythonからAPIを実行してCSVファイルに変換しようと思います。

PythonからAPI実行

Pythonからopenai.Completion.createのAPIを実行を実行してサンプルデータをCSVデータにするにあたり、以下のような点でうまくサンプルのデータだけを抽出することができませんでした。

  • レスポンスは文字列でデータ型を指定できない
  • 欲しいサンプルデータ以外の文字などが含まれてしまう

なので、API実行時のメッセージに細かい条件などを指定して実施しました。 条件をうまく設定しないと求めているサンプルのデータが得られず色々と試しました。。

import openai
import json
import pandas as pd

openai.api_key = os.getenv("OPENAI_API_KEY")

columns=["名前","年齢","住所","電話番号"]
rows_list = []

message = """
以下の条件でJSON形式のデータjson_dataを作成してください。

・Keyは{0}の要素とし、Valueのデータを作成する。
・作成するデータは2つとする。
・データはリストに格納する。
・json_dataはKeyがdataである。
・dataの値は、データが格納されたリストとする。
・住所は番地まで含むデータとする。
・レスポンスにjson_dataのデータ以外の文字は含まない。
""".format(columns)

response = openai.Completion.create(
  model="text-davinci-003",
  prompt=message,
  temperature=0.9,
  max_tokens=200,
  top_p=1,
  frequency_penalty=0,
  presence_penalty=0.6,
)

_json_data = response["choices"][0]["text"].replace(" ", "").replace("\t", "").replace("\n", "")
idx = _json_data.find("=")
json_data = _json_data[idx+1:]
result = json.loads(json_data)
datas = result["data"]

for data in datas:
    value_list = []
    for column in columns:
        value_list.append(data[column])
    rows_list.append(value_list)

df = pd.DataFrame(rows_list, columns=columns)
df.to_csv("example.csv", index=False, encoding="utf-8")
  • 取得したいレスポンスがテキストになってしまうことについては、JSON形式でデータを作成しPythonの辞書型に変換するようにしました。
  • サンプルデータ以外の文字(ChatGPTの会話口調の文字など)は条件に目的のデータ以外の文字を含まないことを指定することで除去することができました。

上記Pythonを実行すると以下のようなCSVファイルを作成することができました!

名前,年齢,住所,電話番号
田中次郎,26,東京都新宿区西新宿1-2-3,090-1111-2222
鈴木花子,25,大阪市港区南港1-2-4,080-3333-4444

懸念点

最初API実行した際に、サンプルデータを10個くらい作ろうとしましたが、レスポンスの文字列が途中で切れてしまっていました。
これはAPI実行時にmax_tokensを200に設定したため、200トークン分のテキストしか取得できなかったことが原因です。
なのでmax_tokensについてはあらかじめレスポンスのトークンがどのくらいになるか確認する必要があります。
また、設定できるトークンにも上限があるみたいなので長すぎるメッセージを送ることや、レスポンスで返すことはできないみたいです。

どのくらいのテキストがどのくらいのトークンになるかは以下の公式ページから確認できます。 tokenizer tool

One limitation to keep in mind is that your text prompt and generated completion combined must be no more than the model's maximum context length (for most models this is 2048 tokens, or about 1500 words).

まとめ

今回ChatGPTにサンプルデータを作ってもらいましたが、それっぽいデータを簡単に作れたのでめちゃくちゃいいなと思いました!

実際にサンプルデータを作るときはもっといろんな項目がありますが、条件さえ設定すればどんな項目でもできそうな気がします。

ただトークンに上限があるので、データの量が多いCSV等を作成するのはもう少し工夫が必要かもしれませんが、今回のような少ないものであれば問題なくできそうなので使えるときに使っていこうと思います!

参照

OpenAI 公式ドキュメント