LoginSignup
2
0

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

Last updated at Posted at 2023-11-09

はじめに

先日 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 "コマンドラインから複数の数値を入力にして全て足し合わせて出力するコマンドを作って"

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

tmp/add.py の 中身
tmp/add.py
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 と連携したり、と色々拡張できて楽しそうです。

2
0
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
0