ChatGPT にプログラミングのお仕事を依頼してみた雑感

薬局の調剤業務って、膨大な医薬品のデータベースに、症状や患者の状態をインプットしたら適切な医薬品とその調合量がアウトプットされたら(そんなシステムがあったなら)、薬剤師免許が求めるような高度な専門知識は要らないのでは?と思っていたのですね。

さて、今回 ChatGPT にお願いした作業というのは、

work/
  my_hoge_root/
     fuga_hoge_view.html
     fuga_hoge_css.html
  my_hoge_sub/
     fuga_hoge_sub1.txt
     fuga_hoge_sub2.txt

というディレクトリ群とファイル群を、

work/
  my_piyo_root/
     fuga_piyo_view.html
     fuga_piyo_css.html
  my_piyo_sub/
     fuga_piyo_sub1.txt
     fuga_piyo_sub2.txt

のように、ディレクトリ名とファイル名を変更する、というもの。 プログラミングしていて、とあるグループのソースファイル群を複製したいと思った経験のある人には分かりやすいと思う。

数が少なければ手でやるのだけど、実際には100以上のディレクトリとファイルがあったため、人力でやるのは面倒だった。

また、詳しい人ならスクリプトをババーっと書いてやるのだろうけども、自分は ShellScript 方面の知識はあまりないので、調べながらコードを書くことになる、それには時間もかかるだろう。

そこでまず、ChatGPT に次のように依頼をした。

Q1: bash で、指定したディレクトリおよびそのサブディレクトリ内にある、aaa というファイル名を bbb に置換するには?

回答はこう、

#!/bin/bash

find <directory> -type f -name "aaa*" | while read file; do
  dir=$(dirname "$file")
  base=$(basename "$file")
  mv "$file" "$dir/bbb${base#aaa}"
done

なるほどそれっぽいコードだ。

が、よく見ると期待した結果が得られないと思われる点がいくつかあることが分かる。

  1. "aaa*" で検索しているので、「aaa で始まる」ファイルしか抽出されない(期待するのは *aaa* だ)
  2. ディレクトリ名に aaa が含まれる場合に対象になるのか怪しい(これは私の ShellScript 能力が低いためもある)
  3. mv aaa/aaa.txt bbb/bbb.txt で、ディレクトリ名の変更とファイル名の変更を同時に行うことができたっけ?先に bbb/ ディレクトリを作成しておく必要があるよね? → 実際できなかった。

そこで、「1. ディレクトリ名の変更」 → 「2. ファイル名の変更」の2回の依頼をすることにした。

まず、「1. ディレクトリ名の変更」 の依頼として、次の質問をした。

Q2: 指定したディレクトリおよびそのサブディレクトリ内にある、aaa が含まれるディレクトリ名の aaa を bbb に置換するには?

aaa* にならないように、「aaa が含まれるディレクトリ名」と明確に指示した。

回答:

#!/bin/bash

find <directory> -type d -name "*aaa*" | while read dir; do
  mv "$dir" "${dir//aaa/bbb}"
done

うむ、これは正しそうなスクリプトで、実際に期待通り動作した。

続いて「2. ファイル名の変更」の依頼をした。

Q3: 指定したディレクトリおよびそのサブディレクトリ内にある、aaa が含まれるファイル名の aaa を bbb に置換するには?

回答:

#!/bin/bash

find <directory> -type f -name "*aaa*" | while read file; do
  mv "$file" "${file//aaa/bbb}"
done

これも良さそうなコードだ。 実際に動かしてみると、期待通りにファイル名が変更されることが確認できた。

成果物

ということで、入力パラメータを実際の「hugapiyo に変更する」に変え、2つの依頼の成果を順に実行すると、期待した結果が実行できるスクリプトが完成した。

#!/bin/bash

find <directory> -type d -name "*hoge*" | while read dir; do
  mv "$dir" "${dir//hoge/piyo}"
done

find <directory> -type f -name "*hoge*" | while read file; do
  mv "$file" "${file//hoge/piyo}"
done

雑感

今回依頼した仕事は、「単純作業が自動化できる手段を提供して欲しい」というもので、これは今までにない事だと思う(それが簡単なものだったとしても)。

似たようなシチュエーションは他にもあるだろうし、これからも手助けになるだろうなと感じた。

一方で、「この仕事になら使える」と判断する要素は、 「仕様を正しく AI に伝えることができ」「AIが出力した結果を、依頼者が正しく検証できること」 と考える。

「仕様を正しく AI に伝えることができ」とは、人間相手にも通じるものであるが、AI は文脈の理解には(現時点では?)難があるので、対人ではくどいと思われそうな言い方をする必要がある。 仕様が複雑な場合には、いくつかに仕様を分割して依頼する能力も求められる。

次に、今回のやりとりで言うところの「検証」とは、

  1. 出力されたコードをレビューする
  2. サンドボックス環境で実際に動作させてみる(テスト)

だ。

1 を行うには、そのコードが(知識をあまり有していないとしても)理解できる必要がある。

2 を行うには、仕様を不足無く定義し、その環境を用意し遂行する能力が必要になる。

これらは、プログラマーであればごく普通に有している能力だが、例えば EXCEL仕様書 しか書いたことのない技術者? では行えないだろう。極端な話 rm -rf /* のようなバルス級の結果を提示されて、疑いなくそれを起動させてしまう人に 依頼はできないし、自分の専門外の領域では誰もがその立場になるだろう。今回の成果も、ShellScript の有識者がレビューすれば正しくないのかもしれない。

そこで翻って冒頭の調剤業務の話だが、AIが膨大な医薬品の知識を持っていたとしても、「正しい入力」をして、「結果が妥当であるか」を検証するには、それ相当の専門知識がきっと必要になるのだなということで、「調剤業務に高度な専門知識は要らないのでは?」とした冒頭文は まったく間違いだった と解った。

じゃあこれまでと変わらんじゃん?というと違くて、言語化が難しいが「なんとなく知ってる専門知識から目的の成果物を具現化できる」とでも言えるのだろうか。どの程度まで知っていれば使えるのか、線は引けないが。

上記のような条件を満たさない場合に「まったく使えない」と判断するのか、「ある程度は信じる」と判断するのかは、現時点ではわからない。

「明日の株価は上がりますか?」という質問は、結果が検証できる人は居ないがある程度の成果が出ていそうだけど、「私にぴったりな音楽を聴かせて」の回答は信じられる気がしない。

けれど確実にブレークスルーは起きているし、常識が変わることについて行けるように、積極的に付き合っていきたい。