ChatGPTの力を借りて、Blue Prismにスクリーンショット撮影機能を爆速で追加した物語

はじめに

ChatGPTの力を借りて、Blue Prismにスクリーンショット撮影機能を爆速で追加して、ピンチをチャンスに変えた物語です。Blue Prismを機能拡張するにはどうすればよいか、その際にChatGPTがどう役に立つか、また、ChatGPTと会話するコツについても、ご参考になれば幸いです。Blue Prismトレーニングにおける先生と生徒の会話スタイルでお楽しみください。なお、ChatGPTは、モデルにGPT-4を使っています。ChatGPTとの会話はこちらです。

2023/03/xx 11:50

先生「そんなわけで、Blue Prismはサーバー型のRPA製品です。こんな特徴がありますね。」

先生「この特徴を活かすには、自動化対象システムの遅延発生時や、エラー発生時にも、なるべくロボットが止まらないように設計するのが大切です。また、進捗や成否がわかるよう、ワークキューを使ってタスク管理したり、エラー情報を(ビジネス例外とシステム例外に区分して)記録することも大切ですね。そのあたりは、この入門コースの中で改めて、学習しますよ。」

生徒「エラー画面を記録に残すこともできるんですか?」

先生「いい質問ですね。この「例外ステージ」でチェックボックスにチェックすることで、エラー発生時に、ロボット端末のデスクトップのスクリーンショットを撮影することができます。でも、気を付けないといけないのが、スクリーンショットは、ロボット端末ごとに最新の1枚が上書き保存されます。なので、エラー発生時に撮影したら、その後のWindows環境の復元処理をおこなう間は、仮に別のエラーが発生しても、スクリーンショットを撮らないようにしたほうがいいですね。撮影したスクリーンショットは、こんな感じで、コントロールルームという、ロボットの制御室から見ることができますよ。」

生徒「なるほど。これは、エラー対応に役立ちそうですね。エラー発生時だけでなく、任意のタイミングでスクリーンショットを撮影したり、あるいは、名前を付けて(どこかのフォルダに)保存したりすることはできるんですか?」

先生「まあ、(標準の機能では)できませんね。」

生徒「あー。」

先生「あー。」

2023/03/xx 12:00

先生「残念そうだったな。このアカデミーをやるからには、等身大のBlue Prismを理解して頂きたい。ないものはないと言うのも大事。でも、標準の機能でできないのは、なんでだっけな。思うに、それはこういう理由で。うん。そういうことなら、次に指すべき一手は・・モグモグ・・。」

2023/03/xx 13:00

先生「ちょっと、デスクトップを見て頂けますか。あ、それです。お昼ご飯を食べながら、スクリーンショット撮影機能を作っておきました。作った機能は、そんな風にエクスポートすることができて、はい、中身はXMLなんですけどね。こうやってインポートしてください。で、スタジオを開いて、再生ボタンを押して頂くと。はい、スクリーンショットが撮影できました。」

生徒「撮影できましたね。これ、お昼休みの間に作ったんですか?」

先生「はい。私が作りました。今はまだ、このデータアイテムという箱の中に、画像のデータが保存されるだけで、ファイルに書き出していませんけどね。そんなのは、すぐできます。今回、私はオブジェクトという部品を作りました。Blue Prismは、プロセスとオブジェクトを明確に区別します。フォルダツリー上も分かれていますね。プロセスは、業務の手順を書いた台本のようなものです。それに対して、オブジェクトは、プロセスから使うことができる、汎用共通部品といったところですね。」

生徒「なるほど。こんな風に簡単に機能拡張できるんだったら、本体機能として(スクリーンショット撮影機能が)用意されていなくても、納得ですね。」

先生「そうなんです。ライブラリによって機能拡張していく、という思想ですね。自動化対象システムの操作もオブジェクトに実装するし、あるいは、今回のように、お役立ち機能を実装することもできます。オブジェクトは自分で作ることもしますが、DXポータルというマーケットプレースがあって、たくさん便利な部品が公開されているんですよ。弊社もNEアセットという部品群をMITライセンスで公開しています。詳しくは、メンテナーによる解説記事を読んでくださいね。」

生徒「そうだったんですね。スクリーンショット撮影機能は、具体的にどうやって実装したんですか?」

先生「こんな風に、コードステージの中で、.NETのプログラムを書いて実装しています。これからは、RPAだけでなく、IA(インテリジェント・オートメーション)といって、画面操作以上のこともやっていく時代です。プログラムが書ければ、そちらの可能性も広がりますね。コードステージを書くには、多少のお作法があります。そうでなくても、ロボット開発を進めていく中で、いろいろと不明点が出てくると思います。弊社のチューターサービスをご利用頂ければ、優しい家庭教師の先生が、Web会議で画面を見ながら教えてくれますよ。」

生徒「プログラミングですかー。苦手ってわけじゃないですけど、すごく得意ってわけでもないんですよね。」

先生「あー、それなら、その・・。」

2023/03/xx 12:00(遡ること1時間前)

先生「うーん。ちゃちゃっと、コードステージを書いて、スクリーンショットを撮影するオブジェクトを作れば、拡張性の説明にもなるし、アピールにもなりそう。次に指すべき一手はそれだとして、でも、プログラムを書き始めると、思わぬトラップにはまって、時間がかかるんだよな。あ、そうだ、今はあれがあった。ChatGPT大先生。」

先生「この記事を執筆している、2023/4現在、ChatGPTを含む生成系AIの理解を深めていく時期で、利用に注意が必要なことは知っている。やっていることは、Next Token Predictionといって、その文脈に沿って、次に出てくる単語を予測している。この予測が優秀で、リアルな文章を生成してくれることが強みですな。回答内容を無条件で信頼しちゃいけないと言われる一方で、信頼できそうな答えを返すことも多い。ChatGPTが、何者であって、何者でないか、皆で実験して、学習していっているところだよね。特に、プロンプト・エンジニアリングというのは、今までになかった何かだから、本当におもしろい。最近では、Blue Prismのグローバルでも、PodcastでChatGPTを取り上げているくらいだから、軽視しちゃいけないのは間違いないよね。個人的には、ChatGPTは「ものまねや芝居に長けたマルチタレント」と捉えることができて、リアルな演技を引き出すための演出が大事だと思っている。ではでは。」

ちょっと話をして遊びましょう。私はプログラミングの生徒、あなたは先生。ルールは以下とします。

## ルール
・あなたは、架空のC#インタプリタ(REPL)に入力できるコード片を提示する
・そのインタプリタは、クラスやメソッドの定義はできない
・そのインタプリタは、usingディレクティブを使うことができる
・そのインタプリタは、Microsoft .NET Framework 4.8を前提とする
・入力用の変数が事前に定義されている場合、コードでその変数から入力値を取得する
・出力用の変数が事前に定義されている場合、コードの最後でその変数に出力値を代入する
・あなたは、私(=プログラミングの生徒)のことを「お父さん」と呼ぶ
・あなたは、回答の最後に「知らんけど。」と言う

## テーマ
デスクトップのスクリーンショットを撮影する方法

## 入力用の変数
定義されていない

## 出力用の変数
System.Drawing.Bitmap型の変数screenshot

ChatGPT先生「お父さん、デスクトップのスクリーンショットを撮影する方法を学びましょう。この架空のC#インタプリタで以下のコードを実行してください。

using System.Drawing;
using System.Windows.Forms;

int screenWidth = Screen.PrimaryScreen.Bounds.Width;
int screenHeight = Screen.PrimaryScreen.Bounds.Height;

using (Bitmap bmp = new Bitmap(screenWidth, screenHeight))
{
    using (Graphics g = Graphics.FromImage(bmp))
    {
        g.CopyFromScreen(0, 0, 0, 0, bmp.Size);
    }
    screenshot = new Bitmap(bmp);
}

このコードは、デスクトップのスクリーンショットを撮影し、出力用の変数screenshotに代入します。知らんけど。」

先生「関西弁の『知らんけど』が2022年に全国で流行したけど、表面上の言葉を真似しただけで、微妙に使われ方が違うので、関西人はモヤモヤしたっていうよね。本来、あれは、熱く語りすぎたときに、ちょっとバランスをとるために使ったりする、高度な言い回しなので。ものまねって難しいよね。さて、オブジェクトを新規作成。初期化アクションの情報ボックスから、言語をC#に変更。さらに、usingディレクティブを参考に必要な名前空間を追加。アクション1にコードステージと、画像型のデータアイテムscreenshotを配置。開始ステージ、コードステージ、終了ステージをリンク。コードステージにて、出力screenshotをデータアイテムscreenshotに保管するように定義。最後に、ChatGPTが教えてくれたコードの4行目以降をコピー&ペースト。いくつかルールを設定し、架空の言語処理系(C#インタプリタ)をシミュレートさせたのは、コードステージの仕様を考慮し、コピー&ペーストできる形での回答を得たかったため。これをチェックコードすると『The name 'Screen' does not exist in the current context』と言われるが、System.Windows.Forms.dllへの参照を追加すれば解消するはず。デバッグ実行すると、お、データアイテムの現在値に、撮影したスクリーンショットが保存されているじゃあないか。」

先生「完ぺきだったぜ。ありがとう。」

ChatGPT先生「お父さん、どういたしまして。いつでもお手伝いできるので、何か質問があれば遠慮なくどうぞ。知らんけど。」

2023/03/xx 13:00(再び、1時間後)

先生「そんな感じなんですよー。まあ、ChatGPTの登場で、プログラミングのハードルは、以前より下がったと言えるでしょうね。もちろん、提示されたプログラムの意味を理解する必要はあるし、正確さと性能が共に求められるような場面では、必ずしも効果的(effective)なプログラムを書いてくれるとも限らないんですけど。でも、明らかに楽になってますよ。」

生徒「これはいいですね。コードステージ、ちょっとやってみようかな。」

先生「ぜひ、やってみてください。では、午後の講義を開始しましょう。」

おわりに

この生徒にとって、アカデミーは、初めてBlue Prismにさわり、その概念を理解する機会でした。社会心理学の分野で、第一印象を逆転するのは意外に困難なことが知られています。オブジェクトという仕組み、および、オブジェクトを配布するDXポータルというエコシステムの存在によって、柔軟に機能拡張できるのは、Blue Prismの大きな特徴です。ChatGPTの機能を呼び出すオブジェクト(厳密にはコネクター)さえDXポータルに公開されています。このオブジェクトという仕組みがあるおかげで、Blue Prismは、製品本体に多くの機能を盛り込まなくても、時代の変化に対応できます。生徒に、そうした第一印象を与えることができました。講義終了後に一晩かけて同じことをおこない、翌朝実演することもできたでしょう。しかし、そのときすでに、不正確な第一印象が形成されてしまった後なのです。「急いては事を仕損じる」こともあるでしょう。他方「兵は拙速を尊ぶ」べき場面があります。今回は後者のケースです。爆速での機能拡張を可能にしたのは、ChatGPTのおかげであり、ChatGPTなくして、この物語は成立しなかったでしょう。

ところで、この記事の文章は、100%、ChatGPTによって書かれました。先生も生徒も、実際にはいません。ChatGPTがキャラメイキングした、架空の登場人物です。と言ったら、あなたは信じますか。

まあ、ChatGPTは、こんな風に、特定製品やサービスの宣伝を織り交ぜたりしないですよね。はい。人間が、魂を込めて書きました。お楽しみ頂けましたでしょうか。ChatGPTの登場で、プログラミングのハードルは下がったかもしれませんが、逆に、こういう文章を書くハードルは上がりましたよね。ありきたりな文章は、人工知能でいくらでも量産できる時代になりつつあります。人工知能は、人為による産物、いわば、偽物と言えますが、本物と区別がつかないくらいの偽物が出てきたとき、本物の価値が問われます。

あらゆる物語の語り手は、いまや信頼できない語り手であり、自分が本物であることの証明が必要なのです。知らんけど。

この記事をシェアする

前の記事

双日テックイノベーション標準BPアセットの使い方(5) – プロセステンプレート編②

次の記事

双日テックイノベーション標準BPアセットの使い方(4) – プロセステンプレート編①