Shell GPTでコマンドラインからChatGPTを呼び出す

2023-03-27Bash,ChatGPT

はじめに

AI 技術の進歩、とくに ChatGPT に注目が集まっています。
これに伴い、ChatGPT を使った自動生成ツールが登場してきています。
これらのツールを活用することで、プログラミングの効率性を高めることができます。

AI を利用した自動生成ツールの 1 つ、 Shell GPT について紹介します。

Shell GPT を利用するためには Python が必要ですので、事前にインストールしておきましょう。ここでは Python のインストールについては取り扱いません。

検証環境

$ uname -moi
arm64 unknown Darwin

$ bash -version | head -n 1
GNU bash, バージョン 5.2.15(1)-release (aarch64-apple-darwin22.1.0)

$ python --version
Python 3.11.2

$ pip --version
pip 23.0.1 from /Users/genzouw/.anyenv/envs/pyenv/versions/3.11.2/lib/python3.11/site-packages/pip (python 3.11)

ChatGPT API はトライアル版のものを利用しました
言語モデルは GPT-3.5 です。

Shell GPT とは?

Shell GPT は、ChatGPT を活用したコマンドラインツールです。
コマンドラインから ChatGPT に対して質問を投げ、回答を受け取ることができます。
シェルコマンドの生成機能もあり、ユーザーの入力に応じて最適なスクリプトを自動生成してくれます。

利用者が作成したテキストドキュメントを入力として与えると、 Shell GPT はその内容を解析し、シェルスクリプトとして書かれたコードを自動生成します。
生成されたスクリプトは、必要に応じて修正できますし、そのままコマンドラインから実行できます。

インストール

Shell GPT は、以下のコマンドを実行することでかんたんにインストールができます。

$ pip install shell-gpt

OpenAI API Key の取得

Shell GPT を使うためには、 OpenAI の API Key を取得する必要があります。
OpenAI の API Key は以下の方法で取得できます。

  1. OpenAI のウェブサイト にアクセスし、アカウントを作成します。
  2. アカウントを作成したら、ログインします。
  3. ログイン後、メニューから「API Keys」メニューをクリックし、API Keys ページ にアクセスします。
  4. API Keys ページで、「Create new secret key」ボタンをクリックします。
  5. API Key が表示されるので、コピーして保存します。

取得された API Key は、 ~/.bashrc あるいは ~/.zshrcOPENAI_API_KEY という環境変数名で登録しておきます。
ここでは、秘匿情報のため、マスキングしています

export OPENAI_API_KEY=sk-************************************************

ここまでくればセットアップは完了です。

Shell GPT の基本的な使い方

Shell GPT を使うには、以下のコマンドを実行します。

$ sgpt <文章>

質問を投げてみます。

$ sgpt シェルスクリプトのメリット・デメリットを教えて
メリット:
1. 自動化が可能:シェルスクリプトを使用すると、複数のタスクを自動的に実行できます。これにより、時間と手間を節約できます。
2. 再利用性が高い:シェルスクリプトは繰り返し使用できます。同じコマンドを繰り返し入力しなくて済むため、作業が効率的になります。
3. リソースの最適化:繰り返し実行するような同じタスクを人手で実行するよりも、シェルスクリプトで処理することでCPUやメモリなどのコンピュータリソースを節約できます。

デメリット:
1. 学習曲線がある:シェルスクリプトはプログラミング言語の一種で、学習曲線があるため、初心者にとっては入門が難しい場合があります。
2. 柔軟性の制限:シェルスクリプトは特定のOSに依存しているため、別のOSで同じスクリプトを実行することができないことがあります。
3. パフォーマンスの劣化:シェルスクリプトは実行速度が遅くなる場合があります。コマンドの実行速度が遅い場合、シェルスクリプトによって時間がかかってしまいます。

質問が悪かったのか個人的にはあまりしっくりこない回答でした。
もう一度、今度は少し文章を修正して質問します。

$ sgpt 他のプログラミング言語と比較したシェルスクリプトのメリット・デメリットを教えて
まずはシェルスクリプトのメリットを挙げると、以下のようなものがあります。

メリット:
1. 簡単に学習できる
2. システムやアプリケーションの自動化が容易
3. 多様なプログラムとの統合が可能
4. UNIXシステムで多用されているため、豊富なリソースがある

一方、デメリットとしては、以下のようなものがあります。

デメリット:
1. 複雑な処理や大規模なアプリケーションの開発には向かない
2. エラーチェックが甘く、情報の見落としがある
3. 高負荷になる場合が多く、パフォーマンスに難がある
4. 構文が独特で他のプログラミング言語との相性が悪い場合がある

以上が、シェルスクリプトのメリット・デメリットの一例です。シェルスクリプトは、簡単な処理やシステムやアプリケーションの自動化には向いていますが、複雑な処理や大規模なアプリケーション開発には向いていない傾向があります。また、構文が独特で他のプログラミング言語との相性が悪い場合があるため、使用する際は適切に判断する必要があります。

先程よりも納得感のある回答が得られました。

シェルコマンドを生成してくれるオプション --shell

--shell というオプションを付与することで、質問に対して適切なシェルコマンドを生成してくれます。
省略形は -s です。

$ sgpt --shell テストのために、容量が1MBのファイルを生成するためのコマンド
Command:
\`\`\`
dd if=/dev/zero of=testfile bs=1m count=1
\`\`\`

Explanation:
This command uses the `dd` command to create a file called `testfile` with a size of 1MB. The `if` option specifies the input file, which in this case is `/dev/zero`, a special file that provides an endless stream of null bytes. The `of` option specifies the output file, which is `testfile`. The `bs` option sets the block size to 1 megabyte, and the `count` option specifies the number of blocks to copy, which is 1 in this case.

生成されたコマンドを実行してみます。

$ dd if=/dev/zero of=testfile bs=1m count=1
dd: invalid number: ‘1m’

正しくは 1m ではなく 1M ですね。

$ dd if=/dev/zero of=testfile bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.000265 s, 4.0 GB/s

$ du testfile
1024    testfile

$ ll
Permissions Size User    Group Date Modified Name
.rw-r--r--  1.0M genzouw staff 21 3 08:24    testfile

会話の流れを把握して回答してくれる --chat オプション

sgpt に質問を投げた場合、毎回質問の流れを読まない回答が返ってきます。

--chat オプションを使うと、会話の流れを読んでくれるようになります。

--chat オプションにはコンテキスト名(会話内容のタイトル)を指定します。

$ sgpt --chat "bigfile" --shell テストのために、容量が1MBのファイルを生成するためのコマンド
Command:
\`\`\`
dd if=/dev/zero of=testfile bs=1m count=1
\`\`\`

Explanation:
This command uses the `dd` command to create a file called `testfile` with a size of 1MB. The `if` option specifies the input file, which in this case is `/dev/zero`, a special file that provides an endless stream of null bytes. The `of` option specifies the output file, which is `testfile`. The `bs` option sets the block size to 1 megabyte, and the `count` option specifies the number of blocks to copy, which is 1 in this case.

# 生成されたコマンドをそのまま実行するとエラーが発生する
$ dd if=/dev/zero of=testfile bs=1m count=1
dd: invalid number: ‘1m’

# 「先程の」という曖昧な指定でも、理解してくれる
$ sgpt --chat "bigfile" --shell "先程のコマンドを実行すると「dd: invalid number: ‘1m’」というエラーが発生するので直して"
Command:
\`\`\`
dd if=/dev/zero of=testfile bs=1M count=1
\`\`\`

Explanation:
This command is similar to the previous one, but with a corrected block size option. The `bs` option now uses a capital "M" to specify a block size of 1 megabyte. This should prevent the "dd: invalid number: ‘1m’" error from occurring.

# 生成されたコマンドを実行すると、正しくファイルが作られる
$ dd if=/dev/zero of=testfile bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.000305 s, 3.4 GB/s

生成されたコマンドを実行してくれるコマンド --execute

生成されたコマンドを直ちに実行するためのオプションとして --execute があります。
省略形は -e です。

「直ちに実行」と言っても、実行直前に確認メッセージが表示されます。

$ sgpt --chat "bigfile" --execute --shell "先程のコマンドで生成されるファイル名をhelloに変更して"
Command:
\`\`\`
dd if=/dev/zero of=hello bs=1M count=1
\`\`\`

Explanation:
This command is similar to the first command, but with a different output file name specified. The `of` option now specifies the output file as `hello`, instead of `testfile`.
Execute shell command? [y/N]:

y と入力し、実行します。

sh: Command:: command not found
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.000263 s, 4.0 GB/s
sh: line 5: Explanation:: command not found
sh: line 6: of: command not found
sh: line 6: hello: command not found
sh: line 6: testfile: command not found
sh: line 6: This: command not found

悲しいことに、出力された内容すべてを実行するようです
Command:Explanation: といった説明文までコマンド実行されました。

--execute オプションは使い所が難しそうですね。

まとめ

これまでプログラミング初心者が手掛けることの難しかったプログラム作成にも、敷居を下げることができると期待されています。

現在話題となっている Shell GPT は、シェルスクリプトの自動生成において面白いツールでした。
今後も、AI 技術を活用した自動化ツールの発展に期待が高まります。

2023-03-27Bash,ChatGPT