新しく登場したマルチモーダルAI Google Geminiの性能を、既存のAIモデルであるChatGPT GPT-4(有料版)と比較してみました。これまで、GoogleのBardが以前はChatGPTに比べて劣っているとの評価がありましたが、新たに登場したGeminiはこの状況をどう変えたのでしょうか?VB.NETで書かれたコードの修正提案能力をテストすることにより、両者の性能を比較してみました。
修正チェックに与えたプロンプト
性能比較にしようするプロンプトです。これは楽天管理画面(RMS)に自動ログインするためにseleniumを使ってChromeブラウザを操作するソースです。ほんとはもっと長いですがかなり省略してます。単純比較で性能差が出るのか確認するためです。
あなたは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
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
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Private strショップID As String = ""
Private strパスワード As String = ""
...
エラーハンドリング
VB.Net
Catch ex As Exception
End Try
Catchブロックでは、発生した例外の詳細情報を取り扱っていないため、問題の特定が困難です。ex変数を使用して、例外の種類やメッセージなどを取得し、ログに出力したり、ユーザーに通知したりする必要があります。
修正コード:
VB.Net
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
Dim Driver As New Selenium.ChromeDriver
Driver.Start()
...
Driver.Quit()
Driverオブジェクトは、Dispose()メソッドを使用して解放する必要があります。usingブロックを使用することで、Driverオブジェクトの解放を確実に実行できます。
修正コード:
VB.Net
Using Driver As New Selenium.ChromeDriver
Driver.Start()
...
End Using
定数の使用
VB.Net
Driver.FindElementByName("login_id").SendKeys(strショップID)
Driver.FindElementByName("passwd").SendKeys(strパスワード)
Driver.FindElementByName("submit").Click()
ログインID、パスワード、送信ボタンの名前は、定数として定義することで、コードの可読性を向上させることができます。
修正コード:
VB.Net
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
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 = “ショップパスワード”
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はいい意味で程よい距離感を保ってくれる、そんな存在です。



コメント