LoginSignup
19
18

More than 1 year has passed since last update.

【ツール開発】OpenAIのGPT-3によってデータの加工処理や可視処理のコードを自動生成する🛠コマンドを作成してみた

Last updated at Posted at 2023-02-06

昨今話題となっているOpenAIによって公開されたChatGPTが話題となっておりますが、ソースコードも生成させることができるようです。このモデル(GPT-3 text-davinci-003)を使ってデータの加工処理や可視化の処理などデータに関係する処理を自動生成するコマンドを作成し公開してみた話です。

作成したコマンドのデモ

いい感じで使えるコードを出力してくれます。是非使ってみてください。
dim_generate_from_file_path.gif

今回開発したコマンドは以前Qiitaにも紹介したオープンデータパッケージマネージャ dimというツールに組み込んだ形で公開しました。

コマンドのインストール手順は以下の記事のインストール手順かリポジトリのREADMEのInstall the dimを参照してみてください。

Githubリポジトリ

デモの流れと共にコマンドを解説

1. コード自動生成 コマンドの実行

※ 注意:実際にこのコマンドを実行するにはOpenAIのAPIKeyを環境変数OPENAI_API_KEYに設定する必要があります。APIKeyはOpenAI公式で無料で入手できます。

$ export OPENAI_API_KEY=xxxxxxxxx

コード生成機能はdim generateコマンドによって実行されます。
引数ではpropmtというGPT-3に命令するための文章を渡します。
今回は「csvデータをgeojsonに変換するpythonコード」というpromptを渡しています。

$ dim generate "python code that converts this csv data to geojson"

このpromptの記述がかなり重要となってくるのでイイ感じに使えるprompt一覧を後述いたします。

2. 対象データの指定

このコマンドの存在価値となるのがこのプロセスです。ここでは変換の対象となるデータを指定しております。
この対象データ先ほど渡したpromptをイイ感じに組み合わせてGPT-3(completion API)に送信してくれます。
今回のケースでは指定したファイルを対象としてcsvからgeojsonに変換するPythonコードをGPT-3によって出力させます。

ここでは対話形式でファイルパスを聞かれます。

 ? Enter the target data name or file path to send to GPT-3 API. › ./data.csv

今回はサンプルのdata.csvというファイル名を指定しています。
data.csvの中身は適当にG空間センター 131202_東京都_練馬区_学校教育施設の区立幼稚園データを使いました。

そのほかの指定

  • コマンド実行時に-tで対象データのファイルパスを指定することも可能
    • -tを指定した場合は対話形式で聞かれなくなります
  • ここの対話形式や-tで指定できるのはファイルパスだけではなく本ツールオープンデータパッケージマネージャ dimで管理されたデータ名を指定することも可能
    • dimの管理に関しては前のQiita記事を参照

注意すべき点

  • ファイルのtoken数(APIが計測する文字列の数)が多いとBad requestとなってしまうので対象データのデータ量には注意が必要
    • 一度に送信できるtokenの限界値が4096なのでpromptも含めて収まるようにしなければなりません。
  • 対策としては、APIへの送信において構造さえ伝われば良いので構造を保ったままデータの件数を減らして対象ファイルを指定する
    (将来的には対象データの構造を読み取って簡略化する機能を実装したい)

3. 生成したコードを保存するかどうか

今回は以下のようなPythonコードが生成されました。
このまま生成されたコードをファイルに保存する機能があるので、対話形式で保存に進んで良いか確認されます。

import csv
import json

csv_file = open('data.csv', 'r')
reader = csv.DictReader(csv_file)

geojson = {
    'type': 'FeatureCollection',
    'features': []
}

for row in reader:
    feature = {
        'type': 'Feature',
        'properties': {
            'name': row['名称'],
            'address': row['所在地'],
            'phone': row['電話']
        },
        'geometry': {
            'type': 'Point',
            'coordinates': [
                float(row['経度']),
                float(row['緯度'])
            ]
        }
    }
    geojson['features'].append(feature)

with open('data.geojson', 'w') as f:
    json.dump(geojson, f, indent=4)

生成されたコードが気に入ったらyを入力します。

 ? Hit to save the file. (Y/n) › Yes

確認する理由

  • prompt次第で微妙なコードを生成する場合がある
  • 実行するたびに揺らぎ(変化)もあるので気に入らない処理が生成される可能性がある
    • 揺らぎはAPIへ送るパラメータで限界まで抑えていますが、それでも揺らぎが発生することがある

4. ファイルパスを指定してコードを保存

対話形式で保存するファイルパスを指定すると記載通りにコードが保存されます。

 ? Enter a output file path. › ./convert_to_geojson.py

5. 保存したコードの実行

今回は生成されるコードを予測してデータのファイルパスの配置なども準備しておいたので、そのまま実行できる状態でした。

$ python3 ./convert_to_geojson.py

注意すべき点

  • 生成されたコード内に埋め込まれたファイルパス(ファイル名)が大体適当な./data.csvなどになっているので状況に応じて変更が必要な場合がある
    • ファイル名をpromptでうまく指定することできそうですが、この程度であれば直接書き換えを行ってしまっても手間ではないかと思います
  • 地図の可視化などをpromptで命令すると外部ライブラリを前提としたコードを出力してくる

以上がデモの流れの解説でした。

リポジトリのREADMEでもコマンドの使用例が記載されていますのでご覧ください。

イイ感じに使えるコードを出力できるprompt一覧

データ処理においてAPIへ送信する、いい感じのprompt一覧をまとめておきます。

  • 言語などファイルフォーマットなどはこのpromptをベースにいい感じで変更して応用してもらえればと思います。
  • 日本語を使ったり、自作の文で挑むと余計な自然言語が含まれてしまう可能性もあるので、以下のpromptを参考にするのがオススメです。
  • 他にもいい感じのpromptがあったらコメントなどで報告してもらえると嬉しいです。

csvデータをgeojsonに変換するPythonコード

Python code that converts this csv data to geojson

csvデータからid列を削除するPythonコード

Python code that remove id column from this csv data

csvデータを地図に可視化するPythonコード

Python code that visualizes this csv data as a map

csvデータをグラフに可視化するPythonコード

Python code that visualizes this csv data as a map

csvデータをHTMLページに可視化するPythonコード

Python code that visualizes this csv data as HTML page

csvデータをPostgreSQLに保存するPythonコード

Python code that saves this csv data to PostgreSQL

csvファイルの全角数字を半角数字に変換するPythonコード

Python code that converts full-width numbers in this csv file to half-width numbers

csvファイルの半角カタカナを全角カタカナに変換するPythonコード

Python code to convert half-width katakana in this CSV file to full-width katakana

振り返り

作成した理由

最後に語るような内容でもないですが、本ツールオープンデータパッケージマネージャ dimはオープンデータを体系的に管理していくためのツールで、そのプロセスの中には後処理と呼ばれる加工処理(xlsxをcsvに変換、文字コード変換等)がありました。dimはこの後処理をいくつか内蔵していますが、あらゆる処理を汎用的に用意することが難しいと感じておりました。データごとに異なる非汎用的な処理に関しては結局独自にコードを書く必要がありました。
そこで今回、GPT-3を使えばデータごとの非汎用的な後処理を生成できると思いコード生成機能をdimに実装することにしました。

実はこのIaCが生成できるツールにインスパイアされました。https://github.com/gofireflyio/aiac

作成してみて

思ったよりイイ感じに動いたというのが感想です。それもOpenAIによるGPT-3の精度おかげです。しかし、まだプログラマーが不要なレベルではなく、ソースコードのたたき台を作成してくれるイメージです。前述したようにケースによっては生成したコードの一部を修正する必要があったり、生成するコードには揺らぎがあり完璧ではない可能性もあります。それでもGoogleで検索して動く動かないの動作確認をするよりも楽にはなる気がします。

今後

本コマンドはもう少し便利になる気がするので今後も開発を継続していきます。

  • 便利なpromptのエイリアス
  • 対象データファイルの複数指定
  • tokenの制限を回避するため、対象データファイルの簡略化機能
  • dimの管理情報ファイル(dim.json)に生成したファイルを後処理として追記する機能

コントリビューションもお待ちしております。

19
18
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
19
18