ChatGPTはプログラマを救うのか
いや、本来タイトルが間違っていて『ChatGPTはIT土方でへっぽこプログラマな「私」を見捨てずに助けてくれるのか?』なのだが長いし恥ずかしいので要約した。
巷ではChatGPTがプログラマの職業を奪ってしまうのではないか?いや、むしろ簡単なコード生成をChatGPTに任せることでプログラマはより創造性の高い業務が出来るようになるのでは、などと盛んに記事が発信されている。私もその動向が気になっており、ちょうど業務でハマった案件があったので、そのタスクを題材に軽く検証してみた。
プログラムコード化 検証の題材
題材 Excel VBAを使って外部のアプリケーションのボタンを押す
アプリケーションを自動操作する要望は以前からあり、既に「枯れた技術」と言える。私自身も10年ほど前に趣味の目的でコード化した実績があるが、もう概要しか覚えていなくて殆どコードを忘れていたため初心者的に情報収集から開始した。
業務の際に要件を調べてコード化した流れ
スパイアプリを使わないと効率が悪いことは覚えていたので、まずスパイアプリ「WinID」「inspect」を用いて、対象アプリケーションの親ウインドウ、ボタンの名前、クラス、ウインドウハンドルなどをあらかじめ調べた。
どうコード化するかGoogle検索を使って調べ上げたが、ハマった要因の一つに会社のアクセス制限が厳しくて閲覧遮断されるホームページが多くピンポイントな記事があまり見つけられなかったことがある。
Google検索で、まず最初に「VBA 外部のアプリのボタンを押す」と入力して検索を開始したがなかなか情報を得られない。キーワードを変えて何度も検索、いくつものリンクをたどりリンク先の情報を読み解いてようやく下記①②③に行き着いた。
判明したプログラムコード作成手順
Win32 APIを使用
①「FindWindow」でアプリのウインドウハンドルを取得
②「FindWindowEx」で対象ボタンのウインドハンドルを取得
③「PostMessage」でボタンを押す
順次コード化し都度動作確認するも②の「FindWindowEx」でボタンのウインドウハンドルを取得出来ない。ネット検索の結果、詳細は省くが「EnumChildWindows」「GetWindowText」に代えて使用で解決。
完成したプログラムコードの手順
④「FindWindow」でアプリのハンドルを取得
⑤「EnumChildWindows」「GetWindowText」で子ウインドウ、ボタンのハンドルを取得
⑥「PostMessage」でボタンを押す
完成したコード
コードはもっと長いが不要部分を削除して、かつ動作確認していないためバグがあるかも。
Option Explicit
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Declare Function PostMessage Lib "user32" Alias "PostMessageA" ( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Any) As Long
Declare Function EnumChildWindows Lib "user32" ( _
ByVal hWndParent As Long, _
ByVal lpEnumFunc As Long, _
ByVal lParam As Long) As Long
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" ( _
ByVal hwnd As Long, _
ByVal lpString As String, _
ByVal cch As Long) As Long
Private shName As String
Private handleNo As Long
Private Const WM_SETTEXT = &HC
Private Const WM_ACTIVATE = &H6
Sub MainFlow()
shName = "AAAAA"
ButtonPush
End Sub
Sub ButtonPush()
Dim hwnd As Long
Dim Ret As Long
handleNo = 0
On Error GoTo EXT
hwnd = FindWindow("BBBBB", "CCCCC")
Ret = EnumChildWindows(hwnd, AddressOf EnumChildProc, 0)
EXT:
If handleNo > 0 Then
Call PostMessage(handleNo, WM_ACTIVATE, 1, 0&)
Call PostMessage(handleNo, BM_CLICK, 0, 0&)
End If
End Sub
Function EnumChildProc(ByVal hwnd As Long) As Long
Dim Ret As Long
Dim Leng As Long
Dim name As String
EnumChildProc = hwnd
name = String(255, Chr(0))
Leng = Len(name)
Ret = GetWindowText(hwnd, name, Leng)
If InStr(name, shName) > 0 Then handleNo = hwnd
End Function
検証の対象
Microsoft のEdge DEVブラウザで動作する「BingAI」のチャットボットが対象。BingAIには、ChatGPTに実装されていて最近アップデートされたOpenAIの大規模言語モデル「GPT-4」エンジンが同じく実装されている。
検証
まずチャットボットに簡易的な質問をしてみた。
質問
回答
予想はしていたがつれない返事を頂いてしまった。
そこで、下記を参考に質問を変えてみた。
「深津式汎用プロンプト」を活用し、あらかじめ条件を細かく提示した場合の質問
回答
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
Sub ClickButton()
Const BM_CLICK = &HF5
Dim parentHwnd As LongPtr
Dim buttonHwnd As LongPtr
' Find the handle of the parent window
parentHwnd = FindWindow("BBBB", "AAAA")
If parentHwnd = 0 Then
MsgBox "Could not find parent window"
Exit Sub
End If
' Find the handle of the button
buttonHwnd = FindWindowEx(parentHwnd, 0, "DDDD", "CCCC")
If buttonHwnd = 0 Then
MsgBox "Could not find button"
Exit Sub
End If
' Click the button
SendMessage buttonHwnd, BM_CLICK, 0, 0
End Sub
とりあえずの結論
Google検索で散々調べて最初に完成したプログラムコードに近いものが、BingAIに1回質問しただけで得られた。
但し、BingAIは質問の仕方で回答内容がガラっと変わる。どれだけ豊富な前提条件、情報を提示出来るかがカギだ。
おそらく、BingAIに教えてもらったプログラムコードを試してエラーや不具合があったとして、さらに質問することで完成品に近いコードが短時間で得られると思う。
対象のアプリが社内製であるため詳細を伝えることが出来ずBingAIが完全な正解を出すことは無いと思われる。
また、今回の案件は「1回ボタンを押す」ことのみと簡潔にしたが、実際の仕様はこの数倍は複雑だ。また、アプリが起動しているかどうかのチェックなどセーフティ機能なども必要だ。可能な限りアプリの構造と細かい操作内容、仕様を説明すればある程度完成したプログラムコードが得られる可能性があるが、最終的にはプログラマがコードを走らせて修正、確認する作業が必要だろう。
現状ChatGPTにプログラマの仕事がそっくり奪われることは無いと感じた。少なくとも外部に開示出来ない社内システムに関わる私の業務は当分安泰と思われる。
いやはや、驚異的に生産性を上げることが出来そうだと実感した。
但し「プロンプトエンジニアリング」が最重要であることも分かった。
会社の業務で活用したい誘惑が大きくなったのだが、気づかず情報漏洩の危険性もあるため勝手にAIを使い始めることはご法度だろう。
さて、どうしたものか…
チャットボットの実際の画面