RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

【初心者向け】ChatGPTがシェルスクリプトをうまく作ってくれない時に知りたかった4つのコツ

皆さんこんにちは!開発エンジニアをしているnkumaです!
最近ますます生成AI系の勢いが増しているのを感じる今日この頃です。
今回は、(1年くらい前の経験にはなりますが)ChatGPTを触り始めたくらいに躓いた経験から、
うまくいかないときに試していただきたい工夫をいくつかご紹介したいと思います。

本記事のターゲット

  • お使いのChatGPTが素直じゃない方
  • なぜかChatGPTに作らせたいものが、どんどん逸れていってしまう方 など

※ChatGPTやシェルスクリプトといった言葉は知っている初心者を対象といたします。
そのため、そういった言葉の定義や解説は当記事では触れないのでご了承ください。

はじめに

職場で、こんなお話を耳にしました。

昔は「パソコンが使えないおじさん」という揶揄がありましたが、
今は「AIがつかえないおじさん」でしょうね…。

胸に刺さりました。。確かにそうですよね。
ということで、「AIがつかえないおじさん」にならないようガンガン使っていこうと考えています。

ある時、丁度仕事で、とある大量のCSVデータの重複を消しつつ、加工するということをする機会がありました。
早速ChatGPTにお願いして、シェルスクリプトを書いてもらい楽をする、、予定だったのですが、
上手くいかないことこの上なし。
気づけばChatGPTの調教に時間をかけすぎていて、自分で書いた方が早かったじゃないかと感じました。

そういった経験を通して、自分が躓いたこと、気づいたことを、この記事で簡単にまとめようと思います。
技術的な内容は薄いので、どちらかといえば非技術者向けかもしれません。
とはいえ、改めて足元を確認する意義もあるかと思います。是非お気軽にお読みください。

知りたかったコツ4個

なぜか、うまくいかない悪い例:

[1] CSVデータの中から、列Aが"条件A"を満たす行を取り出して、列BをXXXに変更し、新しいCSVファイルに保存するプログラムを書いてください。

⓵ 段階的に飲み込ませる

悪い例:一気に複雑なタスクを要求している

良い例:段階的に飲み込ませている

[1] 列Aが"条件A"を満たす行だけを取り出すようにしてください。
[2] 加えて、列BをXXXに変更してください。
[3] それを 新しいCSVファイルに保存するようにしてください。

悪い例のように一気に複雑で具体的なタスクを指示すると、ChatGPTは思わぬものを出してくることが多いです。
また、なによりエラーが発生した際に原因の特定が難しくなります。
良い例のようにお願いしたいタスクを小さなステップに分け、段階的に依頼するようにしてください。
上記の例はまだシンプルなので悪い例でも意図したものが作成できるかもしれませんが、
実際に使いたいものは自分で考えるのが面倒になるくらいなので、もっと複雑かと思います。
そんな場合こそ、この工夫が役立ちます。
一気に依頼してするよりも、できる限り細かく分解して依頼していった方が、結果的に早く作成できることが多いです。

② パーツごとに作成してもらい、組み合わせるのは自分でやる

悪い例:一気に全体の作業を依頼している
良い例:作りたいものをパーツごとに分けて作成してもらい、組み合わせるのは自分でやっている

[1] CSVデータの中から、列Aが"条件A"を満たす行だけ取り出すスクリプトを教えてください。
----------------------------------------------------------------------------------
[1] CSVデータの中から、列BをXXXに変更するスクリプトを教えてください。
----------------------------------------------------------------------------------
[1] CSVデータの中から、出力内容を新しいCSVファイルに保存するスクリプトを教えてください。
----------------------------------------------------------------------------------
※最後に手元で、上記のスクリプトを組み合わせて利用する

もっとよい方法は、組み合わせるのは自分でやることです。
1つ1つを頼むときは意図した動きができているのに、結合する際に意図しないスクリプトになってしまうのは
往々にしてあるかと思います。
であれば、パーツはお願いして、合わせるのは自分でやった方が早いというのが自分の結論です。
少し知識がないと難しいかもしれませんが、意図が分からないコードがあれば、「以下を解説して」 + 当該コードでChatGPTに頼むと詳細に解説してくれます。
それを駆使して、意図を理解しつつ、組み合わせてみましょう。
意図を理解すればまた他のものにも活かせますし!  

③ 入力データを用意して、読み込ませる

悪い例:入力データがない
良い例:入力データを用意して、読み込ませている

[1] 以下のようなCSVデータから、国語の点数が"100"となる行を取り出して、名前列をXXXに変更し、新しいCSVファイルに保存するプログラムを書いてください。
     
     名前,クラス,国語の点数,数学の点数,英語の点数
     太郎,A,85,90,78
     花子,B,75,82,88
     二郎,C,100,78,85
     幸子,A,88,85,90
     三郎,C,80,92,78

簡易的なもの、一部だけでもよいので、入力するデータを用意できると、ChatGPTが動作を理解しやすく、
より意図したものが作成できるかと思います。
入力データがない場合、思っていた挙動と微妙な部分で異なっていたり、実際に使ったときに、
思わぬバグを生んでしまいがちです。
調整が手間となってしまうので、多少時間がかかっても最初に具体的なデータを用意することをお勧めします。
実際のデータが使えないのであれば、ChatGPTに要件を言って作成を依頼するのが良いです!

④ 都度、途中経過のファイルを出力する

悪い例:完成版のファイルのみしか出力させない
良い例:都度、途中経過のファイルを出力する

[1] CSVデータの中から、列Aが"条件A"を満たす行だけを取り出したものを、step1.csvとして保存してください。
[2] step1.csvから、列BをXXXに変更したものを、`step2_output.csv`として保存してください。

途中経過のファイルを出力することで、どこまで意図したものができているか、どこから狂いだしたのかを、
より具体的に把握することができます。
完成版のファイルのみでは、どこでうまくいかなくなったのか調査するのにとても手間がかかります。
途中経過を確認することで、どのステップで問題が発生しているかを特定しやすくなります。
また、途中経過のファイルは、部分的な修正の際のデバッグや検証においても役立ちます。
例のようなそこまで複雑でないスクリプトや、細かいステップごとに出す必要はないと思いますが、
中間セーブポイントを作る意識で出力するとよいかもしれません。

Before/After のスクリプト

Before:

[1] CSVデータの中から、列Aが"条件A"を満たす行を取り出して、列BをXXXに変更し、新しいCSVファイルに保存するプログラムを書いてください。

After:

[1] 以下のようなCSVデータから、列Aが"条件A"を満たす行だけ取り出したものを、step1.csvとして保存してください。

     名前,クラス,国語の点数,数学の点数,英語の点数
     太郎,A,85,90,78
     花子,B,75,82,88
     二郎,C,100,78,85
     幸子,A,88,85,90
     三郎,C,80,92,78
----------------------------------------------------------------------------------
[1] 以下のようなCSVデータから、列BをXXXに変更したものを、step2.csvとして保存してください。。

    ※step1.csvの中身
----------------------------------------------------------------------------------
※最後に手元で、上記のスクリプトを組み合わせて利用する

最後に

今回は私の経験上こうした方がうまくいっているといった工夫をお伝えしましたが、
これだけが正しいとは思いません。
日頃、皆さんがどのようなことを工夫・意識して、ChatGPTと絡んでいるのかが気になります。
そのため、方々で発信していただけるのを期待しております!

また、書く上で色々検証してて思いましたが、もうエンジニアじゃなくても簡単なプログラムなら組める時代ですね。。
どう書くかはAIにお任せして、何を書くかの方を磨いていく必要があるのかなあとしみじみ。。
どちらにせよAIを活用していきたいので、作らせる技術は磨いていきたいです。
皆さんもどんどん活用していきましょう!この記事が、その一助になれれば幸いです!

Copyright © RAKUS Co., Ltd. All rights reserved.