scaf-code - ChatGPTに複数のファイルを参照させつつ指示を出して雛形コードを生成する

目次

はじめに

先日 OpenAI から gpt-4-1106-preview というモデルがリリースされました。 128k token というかなり長いテキストを扱えるようになったので、通常のテキストファイルならいくつかあっても問題なく参照できるようになりました。

そこで 「前に作った似たようなプログラムを参考に、こういう仕様や型定義を参考にしつつ、こういうプログラムを書きたいなー」というような時に、ちゃちゃっと ChatGPT に雛形っぽいファイルを作ってもらうコマンド scaf-code を作ったので共有します。

scaf-code の説明

ちなみに scaffold code というニュアンスです。 使うためには OpenAI の API Key が必要です。 ※ (料金もそちらにかかります)

Install 方法

pip install scaf-code

使い方

まず OpenAI の API Key を環境変数にセットしてください。

export OPENAI_API_KEY=<your_openai_api_key>

最も単純な使い方

一番単純な使い方は --out--spec を指定する方法です。

scaf_code --out tmp/add.py --spec "コマンドラインから複数の数値を入力にして全て足し合わせて出力するコマンドを作って"

とすると、以下のようなファイルができます。

import sys

def main():
    # Initialize the sum
    total_sum = 0

    # Iterate over the arguments
    for arg in sys.argv[1:]:  # Skip the script name
        try:
            # Convert each argument to an integer and add it to the sum
            total_sum += int(arg)
        except ValueError:
            # Handle the case where the argument is not an integer
            print(f"Error: '{arg}' is not a valid number.")
            return

    # Output the sum
    print(f"The sum is: {total_sum}")

if __name__ == "__main__":
    main()

今のバージョンだと邪魔なコードフェンスが付いていてちょっと除去してあげないといけないのですが、除去すると一応実行できました。

python tmp/add.py 1 2 3 4
The sum is: 10

まあ、これくらいは今までもできました。

他のファイルを参照しつつコードを生成する

--ref Option で 複数のファイルを指定することで参照させることができます。ChatGPT には ファイル名部分だけは伝えているので 〜 を参考に というような指示も有効です。

scaf_code --out tmp/mul.py --spec "add.py を参考に引数を掛け算するコマンドを作って" --ref tmp/add.py

とすると、tmp/mul.py が生成されます。

本気な使い方

反復的にコードを作るような時は、ベースクラスや型ファイルや共通の仕様や指示などを念頭に置いてほしかったりします。なるべくそういうのをテキスト化しておいてから指定すると便利なような気がしています(しているだけですが)。

--spec-file Option で 「指示」の部分をファイルから読むようにできます。

ので、

# 新しい task を生成!
scaf_code --out src/tasks/new_awesome_task.py \
  --spec-file doc/tasks/new_awesome_spec.md doc/task_guideline.md \
  --ref src/tasks/{similar_task.py,task_base_class.py}

# 一緒に test も生成!
scaf_code --out tests/tasks/test_new_awesome_task.py \
  --spec-file doc/tasks/new_awesome_spec.md doc/task_guideline.md \
  --ref src/tasks/new_awesome_task.py tests/tasks/test_similar_task.py

みたいな感じで生成できないかな、という期待があります。

VSCode + GithubCopilotChat で良いんじゃない?

Copilot でも似たような感じはできますが、なかなか明確にファイルを指定しにくかったり、PyCharm とか別の Editor を使っているとパッとそういうふうにはしにくかったりします。あと、CLI から使えるとやはり色々な反復に強いというのもあるかな、と。

128K Token 受け付けられるようになったことで、普通のドキュメントや他の色々なファイルについても「〜を参考にしつつ、こういうの作りたい」というケースが出てきそうだなーと思ってとりあえず作っておきました。

さいごに

まあ、まだまだ荒削りですが、画像も参照できるようにしたり、色々なファイル形式(docx とか?)も扱えるようにしたり、URL からファイルをとってきたり、CodeInterpreter と連携したり、と色々拡張できて楽しそうです。