新しく登場したマルチモーダルAI Google Geminiの性能を、既存のAIモデルであるChatGPT GPT-4(有料版)と比較してみました。これまで、GoogleのBardが以前はChatGPTに比べて劣っているとの評価がありましたが、新たに登場したGeminiはこの状況をどう変えたのでしょうか?VB.NETで書かれたコードの修正提案能力をテストすることにより、両者の性能を比較してみました。
修正チェックに与えたプロンプト
性能比較にしようするプロンプトです。これは楽天管理画面(RMS)に自動ログインするためにseleniumを使ってChromeブラウザを操作するソースです。ほんとはもっと長いですがかなり省略してます。単純比較で性能差が出るのか確認するためです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
あなたはVB.NETのエンジニアです。次のソースを確認してください。 #### Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Dim strショップID As String = "" Dim strパスワード As String = "" Try strショップID = "ショップID" strパスワード = "ショップパスワード" Dim Driver As New Selenium.ChromeDriver Driver.Start() Driver.Get("https://glogin.rms.rakuten.co.jp/?sp_id=1") Driver.FindElementByName("login_id").SendKeys(strショップID) Driver.FindElementByName("passwd").SendKeys(strパスワード) Driver.FindElementByName("submit").Click() Catch ex As Exception End Try End Sub #### では、これの修正点はないですか? あれば修正したソースを提示してください。 |
Google Geminiの回答
上記のソースコードには、いくつかの改善点があります。以下に修正案とそれぞれの理由を説明します。
変数のスコープ
VB.Net
1 2 3 4 5 |
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Dim strショップID As String = "" Dim strパスワード As String = "" ... |
strショップIDとstrパスワードは、Button2_Click サブプロシージャ内でのみ使用されています。そのため、スコープをSubからPrivateに変更することで、コードの読みやすさと保守性を向上させることができます。
修正コード:
VB.Net
1 2 3 4 5 |
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Private strショップID As String = "" Private strパスワード As String = "" ... |
エラーハンドリング
VB.Net
1 2 3 4 |
Catch ex As Exception End Try |
Catch
ブロックでは、発生した例外の詳細情報を取り扱っていないため、問題の特定が困難です。ex
変数を使用して、例外の種類やメッセージなどを取得し、ログに出力したり、ユーザーに通知したりする必要があります。
修正コード:
VB.Net
1 2 3 4 5 6 7 8 9 10 |
Catch ex As Exception ' 例外の種類とメッセージをログに出力 Console.WriteLine(ex.GetType().ToString()) Console.WriteLine(ex.Message) ' ユーザーにエラーメッセージを表示 MessageBox.Show("エラーが発生しました:" & ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try |
usingブロックの使用
VB.Net
1 2 3 4 5 |
Dim Driver As New Selenium.ChromeDriver Driver.Start() ... Driver.Quit() |
Driver
オブジェクトは、Dispose()
メソッドを使用して解放する必要があります。using
ブロックを使用することで、Driver
オブジェクトの解放を確実に実行できます。
修正コード:
VB.Net
1 2 3 4 5 |
Using Driver As New Selenium.ChromeDriver Driver.Start() ... End Using |
定数の使用
VB.Net
1 2 3 4 |
Driver.FindElementByName("login_id").SendKeys(strショップID) Driver.FindElementByName("passwd").SendKeys(strパスワード) Driver.FindElementByName("submit").Click() |
ログインID、パスワード、送信ボタンの名前は、定数として定義することで、コードの可読性を向上させることができます。
修正コード:
VB.Net
1 2 3 4 5 6 7 8 |
Const LOGIN_ID As String = "login_id" Const PASSWORD As String = "passwd" Const SUBMIT_BUTTON As String = "submit" Driver.FindElementByName(LOGIN_ID).SendKeys(strショップID) Driver.FindElementByName(PASSWORD).SendKeys(strパスワード) Driver.FindElementByName(SUBMIT_BUTTON).Click() |
修正後のソースコード
VB.Net
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Private strショップID As String = "" Private strパスワード As String = "" Try ' URLを直接指定 Dim Driver As New Selenium.ChromeDriver Using Driver Driver.Start() Driver.Get("https://glogin.rms.rakuten.co.jp/?sp_id=1") Const LOGIN_ID As String = "login_id" Const PASSWORD As String = "passwd" Const SUBMIT_BUTTON As String = "submit" Driver.FindElementByName(LOGIN_ID).SendKeys(strショップID) Driver.FindElementByName(PASSWORD).SendKeys(strパスワード) Driver.FindElementByName(SUBMIT_BUTTON).Click() End Using Catch ex As Exception ' 例外の種類とメッセージをログに出力 Console.WriteLine(ex.GetType().ToString()) Console.WriteLine(ex.Message) ' ユーザーにエラーメッセージを表示 MessageBox.Show("エラーが発生しました:" & ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub |
その他
- 上記の修正案は、あくまで一例です。状況に応じて、他の修正方法も考えられます。
- コードのレビューは、コードの品質向上に有効な手段です。定期的にコードレビューを実施することをおすすめします。
ChatGPTの回答
このVB.NETのソースコードはSeleniumを使ってWebブラウザを操作するためのものですが、いくつか改善できる点があります。以下に修正点を挙げ、修正したソースコードを提供します。
修正点
- エラー処理:
Catch
ブロックが空です。エラーが発生した場合にログを出力するなどの処理を追加することで、デバッグが容易になります。 - リソースの解放: Seleniumドライバーは使用後に適切に閉じる必要があります。
Driver.Quit()
を追加してリソースを解放します。 - 暗黙的な待機の設定: ページや要素のロードを待つために、暗黙的な待機を設定することが推奨されます。
修正後のソースコード
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim strショップID As String = “ショップID”
Dim strパスワード As String = “ショップパスワード”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Try Dim Driver As New Selenium.ChromeDriver ' 暗黙的な待機の設定 Driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10) Driver.Start() Driver.Get("https://glogin.rms.rakuten.co.jp/?sp_id=1") Driver.FindElementByName("login_id").SendKeys(strショップID) Driver.FindElementByName("passwd").SendKeys(strパスワード) Driver.FindElementByName("submit").Click() Catch ex As Exception ' エラーログの出力 Console.WriteLine("エラーが発生しました: " & ex.Message) Finally ' ドライバーの終了処理 If Driver IsNot Nothing Then Driver.Quit() End If End Try |
End Sub
補足
Driver.Quit()
をFinally
ブロック内に配置して、エラーが発生しても正常終了してもドライバーが確実に終了するようにしました。- エラー発生時にエラーメッセージをコンソールに出力するようにしました。実際のアプリケーションでは、エラーログをファイルに記録するか、適切なログ管理システムに送信することを検討してください。
- 暗黙的な待機を設定して、要素が見つかるまでの最大待機時間を指定しました。これにより、ネットワークの遅延などでページのロードが遅れてもテストが失敗することが少なくなります。
この修正で、コードの安定性とメンテナンス性が向上します。
性能比較結果
GeminiとGPT-4を比べてみて、GPT-4とそこまで差がないことに気づきました。日々の.NETやPythonのコーディング作業で、有料のChatGPTを使うか無料のGeminiで済ますか、結構悩むところです。Geminiは、ChatGPTよりも詳しく解説してくれる部分があり、usingの使い方やdimをprivateにする提案(これは実際には間違っていたけど)など、思わず「へぇ」となるような洞察をくれます。でも、そういう細かいアドバイスがいつも必要というわけではないんですよね。
ChatGPTの答えは、直感的でちょうど良いバランスを持っています。日々使うには、ChatGPTの方が手軽で気軽に使える感じがします。恋人にたとえるなら、Geminiはとてもいい人だけど、少し重く感じる時がある…それに対して、ChatGPTはいい意味で程よい距離感を保ってくれる、そんな存在です。
コメント