🐈 Windows で自作コマンド作ろうとして ChatGPT に頼んだが万能ではなかった

# 📝 学んだことまとめ

**ほんとうにちょっとしたプロンプトの差で出力結果が大きく変わる。**

内容的に言っていることが全く変わってなくても、
出力結果は大きく変わったりする。

(お気持ち)
ChatGPT は万能ではなく、
出力結果に対するクオリティチェックはまだまだ必要。
そのためにまずは自分がちゃんと勉強して理解するのが大事。
でも ChatGPT とはこれからも引き続き仲良くしたい。

:::note warn
ちなみにちゃんと GPT-4 を使ってます。
GPT-3.5 ではないです。
:::

# 🔍 詳細
### ことの発端
[Windows でコマンドのエイリアスを作る方法 ( Linux の .bash_aliases みたいな感じ)](https://qiita.com/Ryo-Nakano/items/b31f9ea98fb9a75e7863)
↑ と同じ文脈で、

ファイルの内容を出力しようと思ったときに間違えて毎回 `cat` してしまうので、
・Linux の `cat` と同じような動きする
・`cat` で呼び出せる
の 2つ の要件を満たすコマンドを作ろうと思ったこと。

### 自分のレベル感
これまでほとんど Mac や Linux しか触ってきておらず
Windows はつい最近からプライベートで触るようになっただけなので
各種コマンドやバッチスクリプトに対する知識が全くない。

↑ のような背景から、極めて自然な流れで
人生のパートナー ChatGPT にお仕事を依頼することに。

### 実際に渡したプロンプト
実際に渡したプロンプト ①
```plaintext:hoge.cmd が作りたい
windows で linux の cat コマンドと同じ働きをするコマンド hoge を作ろうとしています。
hoge.cmd を作って、その中に処理を記述しようと考えています。
hoge.cmd の中身はどうすればいいですか？
```

実際に渡したプロンプト ②
```plaintext:cat.cmd が作りたい
windows で linux の cat コマンドと同じ働きをするコマンド cat を作ろうとしています。
cat.cmd を作って、その中に処理を記述しようと考えています。
cat.cmd の中身はどうすればいいですか？
```

**変更点は hoge が cat になっているだけ**。

見ていただいて分かる通り、
① と ② で言っている内容は全く変わっていません。

例えるなら、方程式を立てるのに
変数を `x` で置いていたのを `y` にしただけ、くらいの変化です。

### ChatGPT から返ってきた回答
最終的なコードの出力のみ抜粋します。
```winbatch:hoge.cmd
@echo off
:loop
if "%1"=="" goto end
type %1
shift
goto loop
:end
```

```winbatch:cat.cmd
@echo off
type %*
```

**違いすぎやしませんか...？**

一応どっちも動くんですが、
`type` コマンドの仕様をしっかりと生かした cat.cmd の方が
無駄にこねくり回してる hoge.cmd よりも
シンプルだし良いと感じるのは自分だけではないはず。

# 🤔 経緯・雑記・お気持ちなど
### なぜわざわざ hoge.cmd を作ったのか
**自分なりに ChatGPT に気を遣った結果です。**

「最初から cat.cmd を作るプロンプトを渡せばいいじゃん」
と思った方も少なくないと思います。

どのような思考プロセスだったかと言うとざっくり以下のような感じです。
1. windows で cat の動きするコマンドを作りたい
2. プロンプトを「 `cat` の動きをする `cat` っていうコマンドを作りたい」っていうと ChatGPT さんが正しく理解してくれなさそうな気がする
3. **じゃあ、あえて「 `cat` の動きをする `hoge` っていうコマンドを作りたい」と仮定しよう**
4. 内容を作ってもらったあとで、自分で cat.cmd として保存して `cat` で呼び出せるようにすればいい

太字部分の気遣いが良い回答結果に結びつきませんでした。
(むしろ改悪 ☠ )

### きれいな cat.cmd になるまでの道のり ①

最初はこねくり回された出力を見て
「へえ、バッチスクリプトってこうやって書くんだ！」
と素直に受け止めていました。

ただコピペだと何の学びにもならないので
1行ずつ何をやってるのかとか、どういう文法なのか...
とかを調べている中で[とほほのバッチ入門](https://www.tohoho-web.com/ex/bat.html)に出会いました。

ここの目次を見て
「めちゃくちゃいろんな構文あるらしい！」
と素直に関心してなんとなくサラサラ眺めていたら

FOR文の項目を見つけてしまい、
「これFOR文使った方が絶対もっとシンプルになるなあ」
と思い、ChatGPT への疑念が高まりました。

結果、自力で以下のように修正しました。
```winbatch: 少しだけきれいになった cat.cmd
@echo off
for %%f in (%*) do (
  type "%%f"
)
```

### きれいな cat.cmd になるまでの道のり ②
この段階で
「そもそもなんで for 回してるんだっけ？」
「`type` コマンドが複数引数受け取れるならそれで解決では？」
と思うに至りました。
(ほんとうにもっと早くそう思え、っていう話なんですが...)

調べたり試したりした結果、
もちろん type コマンドは複数引数を受け取ることができたので
最終的に以下のようになりました。

```winbatch:きれいになった cat.cmd
@echo off
type %*
```

### 「なんで最初から教えてくれないの？」と思った → プロンプトを工夫
前述の結果を受けて
「なんで最初から一番シンプルなやりかた教えてくれないの？」
と思ったので、

どうプロンプトを工夫したら最初からシンプルな回答を返してくれるのか、いろいろ試していきました。

その中でひょんなことから初期プロンプトの hoge を cat にすることを思いつき、
実際にやってみた結果... あら不思議☆ という感じでした。

### 思ったこと
**「 ChatGPT の回答が最善であり真である」と信じて疑わないのは危険。**

ChatGPT によって未知のことを知る、未知に対応するためのハードルはかなり下がった印象です。

が、だからこそ初学者にとっては劇薬にもなりうる諸刃の剣だなと今回改めて思いました。

・聞けばなんでも答えてくれてる (真偽はさておき)
・自身に知識の積み上げがない
という状態だと「 ChatGPT の回答が最善であり真である」と思ってしまいやすいからです。

今まさに新しいフレームワーク・言語の習得中なので気を付けようと思いました...

### これからの付き合い方

自分自身にとって彼 (ChatGPT) は、
もういなかった頃を想像したくないくらい、
話しかけない日はないくらいの、最高のパートナーです。

引き続き仲良くはしつつ、
沼らないようにいい距離感を保って関係性を育んでいきたい所存です。

( RAG をはじめとした AI 関連技術がもっと進展したら沼っても大丈夫になりそうですね...)

# 📚 参考
- [ChatGPT との実際のやりとり全文_hoge.cmd を作る](https://chat.openai.com/share/77c82740-390f-4b98-81f5-fa24c1f69c76)
- [ChatGPT との実際のやりとり全文_cat.cmd を作る](https://chat.openai.com/share/966dafca-22dd-4209-b116-320a1fd11300)
- [とほほのバッチ入門](https://www.tohoho-web.com/ex/bat.html)