💨

gpt-engineer試してみた

2023/06/24に公開
4

OpenAIのGPTを使ったすごいのができたということで早速試してみました。

使用ツール

  • VS Code
  • Docker (Docker for Desktop)
  • Dev Containers (VS Code拡張機能)
  • gpt-engineer

https://github.com/AntonOsika/gpt-engineer

Dev Containers

入れ間違いはないと思いますが念のため。立方体のアイコンです。

事前準備として、上記のツールはインストールしておく必要があります。

コンテナ起動

gpt-engineerはpythonで作られているので、pythonが入ったコンテナを作成して、そこで動かしていきます。

  • VS Codeの左下の青いアイコンをクリック
  • 「新しい開発コンテナ」をクリック


コンテナの構成を選択するリストが表示されます。

今回はpythonが入っていて欲しいので、pythonと入力して絞り込みます。

  • 一番上の「Python 3 devcontainers」をクリック
  • 続けて「Dev Container の作成」をクリック


コンテナの作成が始まります。
最初は作られるまで数分程度時間がかかります。

右下の「開発コンテナーの作成」が消えたら作成完了です。

gpt-engineerのセットアップ

コンテナが立ち上がったら、本家の手順を参考に進めていきます。
https://github.com/AntonOsika/gpt-engineer#usage

gpt-engineerのソースを取得

git clone git@github.com:AntonOsika/gpt-engineer.git
cd gpt-engineer
make install && source venv/bin/activate

※githubでSSH認証を使用していると権限のエラーが出ますので、適宜キーを生成してgithubに登録しましょう。

vscode ➜ /workspaces/python-5 $ git clone git@github.com:AntonOsika/gpt-engineer.git
Cloning into 'gpt-engineer'...
Warning: Permanently added the ECDSA host key for IP address '20.27.177.113' to the list of known hosts.
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

SSHキーの登録手順はこちら

うまく動作すると下記のような実行結果になります。

vscode ➜ /workspaces/python $ git clone git@github.com:AntonOsika/gpt-engineer.git
Cloning into 'gpt-engineer'...
remote: Enumerating objects: 1023, done.
remote: Counting objects: 100% (644/644), done.
remote: Compressing objects: 100% (279/279), done.
remote: Total 1023 (delta 472), reused 414 (delta 353), pack-reused 379
Receiving objects: 100% (1023/1023), 188.21 KiB | 427.00 KiB/s, done.
Resolving deltas: 100% (592/592), done.
vscode ➜ /workspaces/python $ cd gpt-engineer/
vscode ➜ /workspaces/python/gpt-engineer (main) $ make install && source venv/bin/activate
Creating virtual environment...
Upgrading pip...
Installing dependencies...
Installing pre-commit hooks...
pre-commit installed at .git/hooks/pre-commit
All done!
(venv) vscode ➜ /workspaces/python/gpt-engineer (main) $ 

画像

OpenAIのAPI Keyを設定

生成したAPI Keyを環境変数に設定します。

export OPENAI_API_KEY=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

※こちらのキーは本ブログ用に生成したもので、すでに削除していますので大丈夫です。
実際に使用するキーは公開しないよう注意しましょう。

API Keyの生成はこちらから
https://platform.openai.com/account/api-keys

プロジェクト作成

cp -r projects/example/ projects/my-new-project

exampleからmy-new-projectという名前で新たにディレクトリ毎コピーしています。

VS Codeの左側のツリーでも作成されてることが確認できます。

my-new-projectというプロジェクトの中にmain_promptという名前のファイルがおかれています。
このプロンプトに沿って自動的に生成されるようです。

コード生成

gpt-engineer projects/my-new-project

私のOpenAIアカウントがgpt-4の申し込みをしていなかったので、下記のようなメッセージが表示されました。

INFO:openai:error_code=model_not_found error_message="The model 'gpt-4' does not exist" error_param=model error_type=invalid_request_error message='OpenAI API error received' stream_error=False
Model gpt-4 not available for provided API key. Reverting to gpt-3.5-turbo. Sign up for the GPT-4 wait list here: https://openai.com/waitlist/gpt-4-api
Clarification needed:
1. What are the specific components of the MVC architecture that need to be split into separate files?
2. How should the keyboard control be implemented in the game?

(answer in text, or "c" to move on)

作成するアプリケーションの仕様決めで止まったようです。
この辺はAutoGPTと同じ雰囲気なのかもしれないです。
gpt-engineerにお任せでよければcを入力してエンターで勝手に考えて作成してくれます。

長いので途中省略しますが下記のような感じで何をやったか出力してくれています。
また作成したコードはmy-new-project/workspaceのようにプロジェクトのディレクトリ下のworkspaceに作成されていきます。

Based on the requirements, the following classes, functions, and methods will be necessary:

~~ 中略 ~~

If yes, press enter. Otherwise, type "no"

また入力を求められました。
作成したものが問題ないかを聞かれてそうです。
とりあえずOKということで、エンター

Executing the code...

Note: If it does not work as expected, consider running the code in another way than above.

You can press ctrl+c *once* to stop the execution.

ERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt'
Traceback (most recent call last):
  File "/workspaces/python/gpt-engineer/projects/my-new-project/workspace/main.py", line 3, in <module>
    from controller import Controller
  File "/workspaces/python/gpt-engineer/projects/my-new-project/workspace/controller.py", line 1, in <module>
    import keyboard
ModuleNotFoundError: No module named 'keyboard'

エラーに。。。
keyboardモジュールが足りないってことのようです。

※いろいろ試したのですが、pygameパッケージを用いたアプリを作ろうとするのですが、コンテナがubuntu環境なので、pygameが起動しませんでした。
windowsやmac上で生成すれば起動しそうですが、コンテナで作成するものに変更します。

コード生成(修正版)

ということで、プロンプトを修正します。
gpt-engineer/projects/my-new-project/main_prompt

We are writing snake in python. MVC components split in separate files. Keyboard control. not use pygame.

修正したのは最後の「not use pygame.」のみです。

保存したら、改めてコマンド実行としたいですが、
同じプロジェクトで先ほどのコマンドを実行すると、前に生成したソースが残ったままになるので、workspaseディレクトリごと削除します。

(venv) vscode ➜ /workspaces/python/gpt-engineer (main) $ gpt-engineer projects/my-new-project
INFO:openai:error_code=model_not_found error_message="The model 'gpt-4' does not exist" error_param=model error_type=invalid_request_error message='OpenAI API error received' stream_error=False
Model gpt-4 not available for provided API key. Reverting to gpt-3.5-turbo. Sign up for the GPT-4 wait list here: https://openai.com/waitlist/gpt-4-api
Clarification needed:
- Can you provide more details on the specific MVC components that need to be split into separate files?
- How should the keyboard control be implemented without using pygame? 
- Are there any specific requirements or constraints for the snake game?

(answer in text, or "c" to move on)
c

c + エンター

Based on the requirements, here are the core classes, functions, and methods that will be necessary for the Snake game:

~~ 中略 ~~

If yes, press enter. Otherwise, type "no"

エンターで続行

Executing the code...

Note: If it does not work as expected, consider running the code in another way than above.

You can press ctrl+c *once* to stop the execution.

ERROR: Ignored the following versions that require a different python version: 0.7 Requires-Python >=3.6, <3.7; 0.8 Requires-Python >=3.6, <3.7
ERROR: Could not find a version that satisfies the requirement dataclasses==0.8 (from versions: 0.1, 0.2, 0.3, 0.4, 0.5, 0.6)
ERROR: No matching distribution found for dataclasses==0.8
Traceback (most recent call last):
  File "/workspaces/python/gpt-engineer/projects/my-new-project/workspace/main.py", line 1, in <module>
    from .game import Game
ImportError: attempted relative import with no known parent package

生成コードでエラー発生です。

生成されたコードは必ずしも動くわけではなく、
若干のプログラム修正が必要な場合が多そうです。
今回試した感じでは生成されたコードはすべて修正が必要でした。

コード修正

コード修正していきます。
生成されたファイルは以下のとおり。

生成時に出たエラーはインポートのエラーのようですので、まずはそこを直しにいきます。

  File "/workspaces/python/gpt-engineer/projects/my-new-project/workspace/main.py", line 1, in <module>
    from .game import Game
ImportError: attempted relative import with no known parent package

main.py 短いので全部乗せておきます。

from .game import Game
from .input import get_input
from .draw import draw_game
from .snake import Snake
from .food import Food


def main() -> None:
    snake = Snake([(10, 10), (10, 11), (10, 12)])
    food = Food()
    food.randomize_position()
    game = Game(snake=snake, food=food)

    while not game.game_over:
        draw_game(game)
        input_char = get_input()
        if input_char == 'w':
            game.snake.direction = (-1, 0)
        elif input_char == 'a':
            game.snake.direction = (0, -1)
        elif input_char == 's':
            game.snake.direction = (1, 0)
        elif input_char == 'd':
            game.snake.direction = (0, 1)
        game.update()

    draw_game(game)
    print('Game over!')


if __name__ == '__main__':
    main()

import.gameなどドットが指定されているのが良くなさそうです。
他のimportも同様なので、取り除いていきます。
他のファイルにも同様の実装になっていたので同じ対応入れていきます。

修正した後は、再度実行して動作するか確認していきますが、
先ほどの生成コマンドはコードを再生成してしまうので、使えません。

生成されたコードの中にrun.shが含まれているのでこちらを実行しましょう。

gpt-engineerとは実行環境を別にした方がよいので、新たにターミナルを開き、そちらで実行します。

cd gpt-engineer/projects/my-new-project/workspace/
sh run.sh
+--------------------+
|                    |
|                    |
|  *                 |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    #
|                    #
|                    #
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
+--------------------+
Score: 0

なんかそれっぽいのが起動しました。

まったく操作方法がわからないですが、プロンプトの指示では、
キー操作で動かすスネークゲームを指定していました。
先ほどのmain.pyにあった部分で操作キーがわかりそうです。
触ってみた感じ下記のようなルールのようです。

  • wasdで移動
  • 右の縦棒の真ん中あたりの###がヘビ
  • 左上の*にヘビが当たるとヘビが伸びる
  • *を1つ取るとScoreが1増える
  • ヘビ自身にあたったり、上下左右の端に当たるとゲームオーバー

割と動いてそうですが、キー設定が微妙
wsadで上下左右と思いきや、左右上下になっています。
特にキー操作の指示をしていないので、しょうがないですね。
また、右端は最初のヘビのいる位置かと思いきや、もっと右まで行けてしまいました。
壁の出力ロジックもちょっと変かもです。

とはいえ、プロンプト1つでここまで作ってくれるのは、中々すごいのではないでしょうか?

まとめ

gpt-engineerを使ってゲームアプリケーションを作ってみました。
プロンプト次第では、ゲームだけでなく、Webアプリケーションやスクレイピングツールなども作れたりします。
コード生成自体もそんなに遅くなかったのも良かったです。
一方で、生成コードのエラーであったり、実行のために必要なライブラリが不足していたり、ライブラリインストールの定義が生成されていなかったりと、生成されたものを動く状態にするためには一定の知識が必要でした。

今回はgpt3.5での生成でしたが、gpt4であれば生成されたコードの信頼性が高い状態かもしれませんので、gpt4が使えるようになったら、また試してみたいです。

番外編

GithubへSSHキー登録

せっかくなのでChatGPTに聞いて解決策を提示していただきます。

質問

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
出ました。解決策を教えて

なんだか片言になってますが、ChatGPTは優しく答えてくれるのがいいですね。
Google検索と違い、文章で指定しないといけないのがメリットでもありデメリットでもあります。
省略しても期待した反応してくれるかのボーダーラインは常に探ってます。

回答

あなたが出会っているエラーは、GitHubがあなたの公開鍵を認識していないことを示しています。これは一般的に以下のような理由で起こります:

  1. SSHキーが生成されていない。
  2. SSHキーが生成されているが、GitHubに追加されていない。
  3. SSHキーが生成されているが、それがGitHubと通信するためのキーとして使用されていない。

これを解決するには、以下の手順に従ってください:

1. SSHキーの生成

まずはあなたのシステムにSSHキーが存在するかを確認します。SSHキーは通常、~/.sshディレクトリに存在します(~はホームディレクトリを意味します)。特に、id_rsa.pub(公開鍵)とid_rsa(秘密鍵)の2つのファイルが存在するはずです。これを確認するには、以下のコマンドを実行します:

ls ~/.ssh

これにより、.sshディレクトリの内容が表示されます。id_rsa.pubid_rsaが表示されなければ、新たにキーを生成する必要があります:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

これにより新たなSSHキーが生成されます。この際、パスフレーズを設定するよう求められますが、必要に応じて設定してください。

2. SSHキーのGitHubへの追加

続いて、生成した公開鍵をGitHubに追加します。まずは公開鍵の内容を表示します:

cat ~/.ssh/id_rsa.pub

これにより表示された内容をコピーします。そして、GitHubの設定(Settings)画面に移動し、「SSH and GPG keys」の項目を開きます。ここで「New SSH key」ボタンを押し、Titleには任意の名前を、Keyには先程コピーした公開鍵の内容を貼り付けます。最後に「Add SSH key」を押すと、新たなSSHキーが追加されます。

3. SSH接続の確認

以上の手順でSSHキーの設定が完了したら、その接続を確認します:

ssh -T git@github.com

このコマンドにより、GitHubへの接続が確認できます。"You've successfully authenticated"と表示されれば、正しく設定できています。そうでなければ、設定を見直してください。

サンプルのプロンプトを動かしてみる

コンテナ上では動作しなかったので、ローカル環境で動作させてみました。

はまりポイント

  • importのエラー

    • pygameをインストールしてみてもなぜかimportエラーが発生。
      pipをアップグレードして再度インストールで動作するようになりました。
  • 画像を読み込む部分でエラーが発生
    この部分

        # Load images
        self.snake_head_image = pygame.image.load("snake_head.png")
        self.snake_body_image = pygame.image.load("snake_body.png")
        self.food_image = pygame.image.load("food.png")

画像ファイルは生成されないので自分で準備する必要あり。
今回生成された内容的にはヘビの頭部分と胴体部分、食べ物の3つの画像が必要そう。
画像を用意してworkspaceディレクトリに配置

実行結果

画像的にはそれっぽいですが、表示された瞬間ゲームオーバー扱いらしく、ひたすらヘビと食べ物がランダムに表示されるのを眺めるゲームになってしまいました。

Discussion

unvprounvpro

初めまして!
拝見させてもらいました。

プログラミング初心者で初歩の質問ですいません。先日興味本位でenjineerを実装しようとしたのですが(GPT頼りに)、Docker (Docker for Desktop)がうまくインストールできず、mac book m1チップでメモリ8ギガのものを使用してて、キャパオーバーなのかなと思ったりしているのですが、そのようなことは起こり得るのでしょうか?

つまらない質問ですいません。
お返事もらえますと幸いです。

katkat

ありがとうございます。
念のためですが、M1 Macの場合、Dockerをダウンロードする際に「Apple Chip」を選択する必要があります。

手元に環境がないので何とも言えませんが、メモリが8ギガとのことで若干心元ないですが、
実行は遅いですが、おそらく動作自体はすると思います。

時間できたら、Dockerの割り当てメモリ減らしてみて試してみますね。

unvprounvpro

さっそくありがとうございます!
メモリが問題ではなく。。。。

intelチップを選んでしまっていたみたいで、初歩的なミスでした…

ただ、メモリは大きいもののほうが良いですよね。
PCの更新を考えていきます。

ご相談に乗っていただき、ありがとうございました😊