技術オタク、すぐに「電気羊」のタイトルモジりがち。ディックはユービックがイチオシの楽介です。
本業のDXプロジェクトが一段落し、遅まきながら、ChatGPTを色々いじる時間が取れましたので、タイトルの通り、「ChatGPT に RPA を書かせることができるのか? どの程度実用的か?」を試してみましたので、ご報告です。いや凄いですねこれ。楽介よりもちゃんとしたコードを書いてくれますよ……。
ChatGPT のAI を使って RPA を書きつつ、今後 AI を活用しながら稼げるエンジニアになるにはどうしたらいいか? も考えてみます。
ChatGPT とは?
2022年11月に OpenAI からリリースされた対話型のジェネレーティブAIです。日本語にも対応しており、論文を書いてくれたり小説を書いてくれたり……と非常に多機能で各方面から期待の眼差しと危険視をされている凄まじいインパクトを持ったAIです。
日本のSNS界隈では、特に画像のジェネレーティブAIが危険視されていた流れの中での登場であり、ChatGPTについても危険視する見方が強くあります。その中での主流の意見は、「結果が正しくなくてもそれっぽい答えが返ってくる」、「論文などでズルができる(wikipediaコピペ問題)」といった内容が多いようです。
一方で、「バグのあるプログラムを入力して質問すると、的確にデバッグしてくれた」といったツイートもあり、使い方次第でとても有用なAIです。
Python の RPA を ChatGPTに書いてもらおう!
正しい保証がない、というのがジェネレーティブAIの欠点の一つです。しかし、プログラムであれば、バグがあれば分かります。大きなシステムであれば非常に込み入ったバグが混入する恐れはありますが、そこまで大きなシステムを自然言語で定義するのも難しい(自然言語の方に矛盾が発生する可能性の方が高い)ため、ここでは一旦無視します。
RPA は特に、動作が人間の操作の再現であるため、見て分かるといった部分もありますし、ChatGPTの実力を測るのにちょうどいいでしょう。
ということで、実際に動作させてみたログです。
Pythonで、Chromeを起動して、image.pngに保存されている画像と同じ画像を探し、その画像をクリックするRPAを書いて。画像が見つからなかったら、5秒待ってそれでも見つからなければ終了してください。
このようなタスクを実現するには、Selenium WebDriverライブラリを使用することができます。下記はサンプルコードです。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
# ChromeのWebDriverを使用
driver = webdriver.Chrome()
# Webページにアクセス
driver.get("https://www.example.com")
# 画像のsrc属性と同じ値を持つ画像を探す
img_src = "image.png"
img = None
try:
img = WebDriverWait(driver, 5).until(
EC.presence_of_element_located((By.XPATH, f"//img[@src='{img_src}']"))
)
except:
print("画像が見つかりませんでした")
driver.quit()
# 画像をクリック
if img:
img.click()
# WebDriverを終了
driver.quit()
このサンプルコードでは、SeleniumのWebDriverWaitクラスを使用して、5秒間画像を探します。画像が見つからなかった場合は、「画像が見つかりませんでした」というメッセージが表示され、WebDriverが終了します。
import もされ、指示されていないURLへのアクセスについては、example.comを利用するなど、「よきにはからって」コーディングしてくれる親切っぷりです。正直、こんな雑な指示をプログラマーに出したら、まず2, 3回はキレられるのでとにかく答えを返してくれることに感動します。
が、そうじゃない。画像は画像でも、src要素(画像のURL)を使って検索してしまっています。
src要素から探すのではなく、表示された画像の内容が、image.pngの内容と一致した場合にクリックするようにしてください。
応答結果に対して、連続してこのように入力すると、「文脈を読み取って」応答してくれます。とにかくこれがすごい。
申し訳ございませんが、このタスクはOpenAIのモデルには実行できないものです。画像内容の比較やブラウザの操作には特殊なツールやライブラリが必要です。そのため、このタスクは人手での作業が必要となります。
が、残念ながらSeleniumを使用する方向性からの変更はできませんでした。ちょっと頑固ですね。
pyautoguiを用いて、image.png と同じ内容の画像部分をクリックする処理を書いてください。
発想を変えて、使用するライブラリを明示してあげます。「画像はイメージです」レベルに自然言語での指示が難しいですが……。
下記は、Pythonでpyautoguiを用いて、image.pngと同じ内容の画像部分をクリックするサンプルコードです。
import pyautogui
import time
target_image = "image.png"
image_found = None
for i in range(5):
image_found = pyautogui.locateOnScreen(target_image)
if image_found:
break
time.sleep(1)
if image_found:
x, y = pyautogui.center(image_found)
pyautogui.click(x, y)
else:
print("The target image was not found")
このサンプルコードは、forループを使って、最大5回探索を行います。探索回数は、変数i
を使ってカウントアップします。
探索回数内に画像が見つかった場合、pyautogui.locateOnScreen
メソッドから取得した位置情報を使って、画像の中央をクリックします。
画像が見つからない場合、エラーメッセージ「The target image was not found」を表示します。
たった1行のチャットからここまで出力してくれます。非常に基本的なスニペットではありますが、1秒ごとにチェックしてくれるといった、繰り返し書くには面倒な処理を特に明示しなくても書いてくれるというのは、かなりの革命と言えるでしょう。
いいですね。では探す画像のファイルパスを引数として受け取る関数として書き直してください。
再利用したいので、関数化を指示してみます。
以下は、探す画像のファイルパスを引数として受け取る関数に書き直したサンプルコードです。
import pyautogui
import time
def click_similar_image(image_file_path):
# 画像を探す
try:
image_position = pyautogui.locateOnScreen(image_file_path)
except Exception as e:
print("画像が見つかりませんでした")
return
# 画像が見つかった場合
if image_position:
center_x, center_y = pyautogui.center(image_position)
pyautogui.click(center_x, center_y)
print("画像がクリックされました")
# 画像が見つからなかった場合
else:
time.sleep(5)
click_similar_image(image_file_path)
click_similar_image("image.png")
関数化もしれくれました……が、ちゃんとソースコードを追ってみると、何かがおかしいです。1秒ごとに画像がないかチェックするといった処理が完全にオミットされていますし、画像が見つかった場合、見つからなかった場合がifにより区別されていますが、そもそも例外処理で先にreturn されていて再帰関数として機能しません。
また、再帰関数が動作してしまうと、今度は画像が見つからない場合、無限ループが発生してしまいます。修正を指示してみましょう。
関数内部で、1秒ごとに画像が表示されているか確認し、合計で5秒間みつからなかった場合にエラーメッセージをprintして終了するようにしてください。
どの関数で、とかは指示していません。文脈を判断してもらいます。
このような関数を作成することができます。
import pyautogui
import time
def click_image(image_path):
MAX_WAIT_TIME = 5
for i in range(MAX_WAIT_TIME):
try:
position = pyautogui.locateOnScreen(image_path)
break
except Exception as e:
time.sleep(1)
if i == MAX_WAIT_TIME - 1:
print("Error: image not found after {} seconds.".format(MAX_WAIT_TIME))
return
pyautogui.click(pyautogui.center(position))
この関数は、指定された画像 image_path
が画面上に存在するかを最大で5秒間毎秒確認します。画像が見つかった場合は、その画像の中心をクリックします。もし、5秒間画像が見つからなかった場合は、エラーメッセージを出力して終了します。
今度はしっかり for in ループを用いて処理しています。楽介が記述するとしたら、 MAX_WAIT_TIMEと同じ値を持つ変数を用意して、それをデクリメントしていく……というC言語時代のループのような処理を書きそうですが、ChatGPTはiがカウントアップされることを利用してループの最後でreturnしていますね。
使って見て
日頃から慣れた環境でプログラムを書き続けている職人プログラマーには恐らく必要ないと思います。一方で、楽介のように本業は別にプログラマーではなく、 RPA 専門でもなく、Python も Javascript も C#, PHP も必要に応じて書く……けど、メソッドなどは調べ直しが多く発生するタイプにはとても強力です。なにせ、思い出せないメソッドやライブラリについてはざっくりした説明だけで記述してくれるため、プログラムのロジックに集中すればいいからです。正直、関数化などは自分でやってしまった方が恐らく早いですし正確です(今回は画像のパスのみ引数としましたが、sleepの値や待機する回数なども引数にしたいなら、自然言語で指示するのは非常に手間)。
そのため、完全なノーコードというのは現時点では難しいと思います。できたとしても、ChatGPTへの指示コストの方が高くなりそうです。
しかし、ローコードツールとして考えると、大変便利です。ローコードツールというよりは、「非常に優秀な部下や後輩のプログラマーがいる」イメージです。もちろん間違えもありますが、それは人間であっても同じです。
そうとらえて見ると、ChatGPTを使う側に求められるのは、
- 知らないライブラリ、メソッドであっても名前からなんとなく機能が類推できるだけのプログラムの読解力
- プログラムのロジックを構築できる設計力
- 自然言語でロジックを説明できる言語力
- 優秀な部下(ChatGPT)に任せられる業務を分類できるビジネス力
といった、いわゆる上流工程の技能になってきます。もっとジェネレーティブAIが高度になってくれば、冗談ではなく「ただ言われたプログラムを書けるだけの人材」は不要となっていくでしょう(もちろん、上流工程の技能もどんどんAIに任せられるようになってくるはずです)。
じゃあ、イケてるエンジニアになるにはどうするの?
プログラミングができないだけで不利になる時代を一足飛びに、AIにプログラムを書かせ、それを評価できる人材が求められる時代がすぐそこまで来ています。が、完全にAI任せになるのはまだ先でしょう(というより、AIの進化が進んでも自然言語の限界もあって脳みそから直接希望を読み取れる時代まで無理なんじゃないかなと思いますが)。
となると、ただプログラムができるだけではない、エンジニアとしてロジックが組める人材となることが副業にしろ、本業でエンジニアを務めるにしろ重要な位置になると思います。
そこで楽介がオススメするのは、自分の目的にあった学習ができるプログラミングスクールの活用です。
最短で目標達成ができるプログラミングスクールというキャッチコピーを持つCODEGYM Monthlyの特徴は、なんといっても 「個人の目標に合わせたオーダーメイド型のカリキュラム」が魅力です。
確かに、基礎的なコード、基礎的な型の知識なども重要です。重要ですが、それは本サイトでもある程度学習できますし(割と丁寧なサンプルつきを自負しています…丁寧すぎて更新が遅いですが)、この記事で見たように、そういう「当たり前の知識」はAIに任せてしまえる時代になっています。これは未来ではなく、もう来た現実です。
それよりも重要なのはプログラムのロジックを考えられる力、全体を構成できる力。そしてプログラムを読んで、または動かして判断を下せる能力です。
この点において、CODEGYM Monthlyはオーダーメイド型のカリキュラムに加えて、現役エンジニアがコーチにつくため、現場のエンジニアの設計力・判断力を学ぶことが可能です。
それに加えて、学習に詰まったときに質問可能なチャットサポートは、「単に答えを教えるのではなく、解決するためのヒントを与える」形式のため、ChatGPTのような対話型のジェネレーティブAIと協働(あえてこう言いますが)する訓練にもなります。
プランも、ライトプラン(24,790円(税込)/月)、スタンダードプラン(38,280円(税込)/月)、ビジネスプラン(65,780円(税込)/月)の3プランありますが、いずれにおいても「コーチ決定のための初回カウンセリング」がありますので、「申し込んだけどコーチが……」といったがっかりを防止することができます。
ちなみに、楽介のオススメはやっぱりスタンダードプランです(こういうのは大体、真ん中が一番お得になるように出来ています)。
おわりに
すごい時代がきましたね~というのが正直な感想です。とうとう、 AI がプログラムを書いてくれ、そしてそれがある程度信用できる時代になりました。
ただ、それは人類がプログラムを書かなくていい時代になるということではなく、基本的な教養として身につけ、さらにそれを応用・活用するのが求められる時代になったということに思います。
電卓が発明されても算数・数学は変わらず重要な学問ですし、どんぶり勘定はより許されない社会構造になりました。そこからコンピューター、インターネット、スマートフォンやIoT機器が開発、普及するようになるとビッグデータに対する統計学の適用が重要なビジネス課題となりました。その延長上に、対話型のジェネレーティブAIによるソースコードの出力が位置すると楽介は考えます。
幸か不幸か、労働可能な年齢はどんどん延びていますし、ここで意を決してプログラミングを学び、ロジカルな思考と指示、そして評価ができるようになるかならないかで今後数十年の人生が変わってくるように思います。
以上、楽介でした。