本サイトはプロモーションが含まれています

Gemini ProとGPT 3.5をお互いにコードレビューさせてみた (ChatGPT)

導入

先日突如としてGoogle Deepmindから発表されたGemini(ジェミナイ、ジェミニ)。


一番上のモデルであるGemini UltraはGPT4を超えていると謳っていることもあり、大きな注目が集まりました。


そんな中、12/13に3種類の中で真ん中のモデルである「Gemini Pro」が公開されました。
せっかくなので、GPTと比較させたいと思い、何か題材はないか考えたところ、「コードレビュー」を思いつきました。


なので、今回は「Gemini Pro」と「ChatGPT (GPT3.5)」を使って、お互いの書いたコードをレビューさせあってみました
最後にGPT4でどちらのコードレビューが良かったかをジャッジしてみようと思います。


Geminiとは

本題に入る前にまず、Geminiについて簡単に説明します。


Geminiとは、Google Deepmindが発表したGPT対抗の大規模言語モデル(LLM)です


Geminiには3種類のモデルがあり、それぞれ「Gemini Nano」、「Gemini Pro」、「Gemini Ultra」と名付けられています。
それぞれの大まかな特徴は以下の通りです。

Gemini NanoGemini ProGemini Ultra
パラメーター数
主な用途デバイス上で動かす
(Google Pixelなどに搭載)
幅広いタスク向け非常に複雑なタスク向け
競合モデル
(ベンチマークを参考)
Llama2 7B, Claude InstantGPT3.5, LLama2 70B, Claude2GPT4

Gemini Nanoはデバイス上で動くことを想定している軽量なモデルで、Pixel 8 Proなどに搭載される予定です。
Gemini UltraはGPT4対抗の高度なタスク向けで、Gemini Proはその真ん中になります。


Googleが公開したGeminiの技術レポートにあるベンチマークの値を見ると、Gemini UltraとGPT4、Gemini ProとGPT3.5がおおよそ同等の性能を示しているといえそうです。

使用するモデルとルール

今回使用するモデルは、「Gemini Pro」と「GPT3.5」です。


Gemini Proは現在 Vertex AIGoogle AI Studio で使用することができます。
今回私はGoogle AI Studioを使いました。


ルールは以下の通りです

  1. 決まったテーマのコードを両者に書かせる
  2. お互いのコードに対してレビューを書かせる
  3. 最後に、より精度の高いLLM(GPT4)にそれぞれのコードレビューを評価させる

GeminiとGPT3.5をお互いにコードレビューさせただけだと優劣をつけにくいため、最後に中立な立場から評価してもらうようにしました。(LLM as a judge)


今回は2つのモデルより精度が高いGPT4を使い、どちらが書いたかを教えずに良いほうを判断してもらいます。


お互いのコードレビュー

それでは、さっそくお互いにコードを書き、評価してもらいます。


テーマは以下の2つです。

  • FizzBuzz問題
  • ナップサック問題

コードレビュー用のプロンプトは以下を用いました。

以下の問題を解くためのコードをレビューしてください。
問題:
{問題文}
コード:
{コード}

また、GPT4にコードレビューを評価してもらうプロンプトとして、以下を用いました。

以下の問題を解くためのコードに対するコードレビューをそれぞれ評価してください。
また、どちらのコードレビューが優れているかを理由とともに答えてください。
問題:
{問題文}
----------------
ペア1
コード:
{コード}
コードレビュー:
{コードレビュー}
----------------
ペア2
コード:
{コード}
コードレビュー:
{コードレビュー}
----------------

題材1: FizzBuzz問題

まずは、プログラマーならおなじみのFizzBuzz問題をテーマに比較します。


以下のようにプロンプトを与えました。

1以上の整数について、以下のルールに従って順に出力するプログラムを考えます。
・数字が3で割り切れる場合は、「Fizz」と出力します。
・数字が5で割り切れる場合は、「Buzz」と出力します。
・数字が3でも5でも割り切れる場合は、「FizzBuzz」と出力します。
・それ以外の数字の場合は、その数字をそのまま出力します。
例えば、1から15までの数字を出力する場合は次のようになります:
1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz
この問題を解くプログラムをPythonで作成してください。

Geminiのターン

まずは、Gemini Proがコードを書き、それをGPT3.5がコードレビューします。

Gemini Proの書いたコード

全体として問題ないコードを作成しています


書かれたコードは簡潔で、丁寧にArgsやReturnsの値を書いてくれています。
また、出力する範囲を1~nとし、範囲を外部入力から受け取る形にしてくれています。

def fizzbuzz(n):
"""
1からnまでの数字について、3で割り切れる場合は「Fizz」、5で割り切れる場合は「Buzz」、
3でも5でも割り切れる場合は「FizzBuzz」と出力する。
それ以外の数字の場合は、その数字をそのまま出力する。
Args:
n: 出力する数字の範囲(1〜n)
Returns:
None
"""
for i in range(1, n + 1):
if i % 3 == 0 and i % 5 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
if __name__ == "__main__":
n = int(input("出力する数字の範囲を入力してください:"))
fizzbuzz(n)
GPT3.5のレビュー

指摘事項は以下の2点で、内容としてはどちらも問題ないと思います

  1. ドキュメンテーション文字列 (docstring) をもう少し詳細に記述すると、他の開発者やあなた自身が後でプログラムを理解しやすくなります。
  2. 入力の検証: 現在、ユーザーが n を入力する際にエラーが発生しないようになっていますが、プログラムの信頼性を向上させるために、入力が1以上の整数であることを確認するための検証を追加できます。

修正後のコードの内容も特に問題はなさそうです。

このFizzBuzzプログラムは、与えられた仕様に従って動作する正しいコードです。関数 fizzbuzz は、1から指定された整数 n までの数字をループして条件に従って出力します。プログラムの動作自体には問題はありません。ただし、いくつかの改善ポイントがあります。
1. ドキュメンテーション文字列 (docstring) をもう少し詳細に記述すると、他の開発者やあなた自身が後でプログラムを理解しやすくなります。
2. 入力の検証: 現在、ユーザーが n を入力する際にエラーが発生しないようになっていますが、プログラムの信頼性を向上させるために、入力が1以上の整数であることを確認するための検証を追加できます。
以下は改善を加えたコードの例です:
def fizzbuzz(n):
"""
1からnまでの数字について、3で割り切れる場合は「Fizz」、5で割り切れる場合は「Buzz」、
3でも5でも割り切れる場合は「FizzBuzz」と出力し、それ以外の数字の場合は、その数字をそのまま出力する。
Args:
n (int): 出力する数字の範囲(1以上の整数)
Returns:
None
"""
if not isinstance(n, int) or n <= 0:
raise ValueError("nは1以上の整数である必要があります")
for i in range(1, n + 1):
if i % 3 == 0 and i % 5 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
if __name__ == "__main__":
try:
n = int(input("出力する数字の範囲を入力してください:"))
fizzbuzz(n)
except ValueError as e:
print(e)
このように改良することで、プログラムが不正な入力を処理しやすくなり、ドキュメンテーション文字列もより詳細になります。

GPT3.5のターン

続いて、GPT3.5がコードを書き、Gemini Proがコードレビューを行います。

GPT3.5の書いたコード

GPT3.5のコードは1~15までの場合限定のコードで、nまでの場合の一般化したプログラムを作成しませんでした
具体的な例として1~15までの場合を与えたのですが、意図が明確に伝わっていないようです。

for i in range(1, 16):
if i % 3 == 0 and i % 5 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
Gemini Proのレビュー

指摘事項は以下の3点です。

  1. コードの可読性を向上させるために、変数や関数の命名をよりわかりやすくする。例えば、「i」という変数は、ループ変数であることがわかりにくいので、「number」という変数名に変更する。
  2. コードの重複を削減するために、条件文をネストせずに、elif文を使用する。
  3. コードのエラー処理を強化するために、try-except文を使用する。例えば、ユーザーが正しくない入力をした場合に、エラーメッセージを出力するようにすることができます。

2つ目の指摘が適切ではないと感じます
すでにelifを使っているにもかかわらず、elif文を使用するように指摘してしまいました。


コードレビュー用途としては、GPT3.5の方が優れていそうです。

コードをレビューします。
このコードは、1から15までの数字を出力するプログラムです。
問題文にあるルールに従って、数字が3と5の両方に割り切れる場合は「FizzBuzz」、3で割り切れる場合は「Fizz」、5で割り切れる場合は「Buzz」、それ以外の場合はその数字をそのまま出力しています。
コードは比較的シンプルで、問題文のルールをそのままコードに落とし込んでいます。
改善点としては、以下のような点が挙げられます。
* コードの可読性を向上させるために、変数や関数の命名をよりわかりやすくする。例えば、「i」という変数は、ループ変数であることがわかりにくいので、「number」という変数名に変更する。
* コードの重複を削減するために、条件文をネストせずに、elif文を使用する。例えば、以下のコードでは、条件文をネストしています。
if i % 3 == 0 and i % 5 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
これを、elif文を使用すると以下のように書くことができます。
if i % 3 == 0 and i % 5 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
* コードのエラー処理を強化するために、try-except文を使用する。例えば、ユーザーが正しくない入力をした場合に、エラーメッセージを出力するようにすることができます。
try:
number = int(input("Enter a number: "))
if number < 1:
print("Error: The number must be greater than or equal to 1.")
else:
for i in range(1, number + 1):
if i % 3 == 0 and i % 5 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
except ValueError:
print("Error: The input must be a valid integer.")
これらの改善点を考慮して、コードを以下のように修正します。
def fizzbuzz(number):
"""
1からnumberまでの数字を出力する。
数字が3と5の両方に割り切れる場合は「FizzBuzz」、3で割り切れる場合は「Fizz」、5で割り切れる場合は「Buzz」、それ以外の場合はその数字をそのまま出力する。
"""
if number < 1:
raise ValueError("Error: The number must be greater than or equal to 1.")
for i in range(1, number + 1):
if i % 3 == 0 and i % 5 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
if __name__ == "__main__":
try:
number = int(input("Enter a number: "))
fizzbuzz(number)
except ValueError:
print("Error: The input must be a valid integer.")
このコードは、問題文のルールに従って、1から任意の数字までの数字を出力します。
ユーザーが正しくない入力をした場合には、エラーメッセージを出力します。

GPT4によるコードレビューの評価

GPT4はGPT3.5のコードレビューの方が優れていると判断しました
Gemini Proのレビューは、既にelifになっているにもかかわらず、elifに修正するように指摘した点がマイナスになってしまった気がします。


ちなみにコード自体の評価もしてもらいましたが、これはGemini Proの方が優れていると判断しました
理由はGPT3.5のコードが1~15に限定した回答をしてしまったためです。


GPT4の評価は人間の感覚と非常に近いと思います。

ペア1のコードレビュー(GPT3.5)
評価:
良い点: プログラムの基本的な動作について正しく評価しています。また、ドキュメンテーション文字列の改善と入力検証の追加についての提案は、コードの堅牢性と可読性を向上させる良い提案です。
改善点: エラーハンドリングの方法(例外の使用)についての説明がより具体的であれば、レビューの価値が高まるでしょう。
総合評価: ペア1のコードレビューは、コードの実装に対する具体的な改善点を提供しており、実用的なアドバイスを含んでいます。
ペア2のコードレビュー(Gemini Pro)
評価:
良い点: コードのシンプルさを評価しており、改善点として変数名の改善、条件文の最適化、エラーハンドリングの追加を提案しています。これらはコードの可読性と堅牢性を向上させるための良い提案です。
改善点: コードに既にelif文が使用されているため、elif文の使用に関する提案は無関係です。また、エラーハンドリングに関する提案は具体的で役立つものですが、他の提案との関連性が弱いです。
総合評価: ペア2のコードレビューは、コードの可読性と堅牢性を向上させるためのいくつかの良い提案を含んでいますが、一部の提案は既存のコードと関連がありません。
優れたコードレビューの選定
ペア1のコードレビューが優れています。その理由は、提案された改善点が実際のコードに直接関連しているため、より実用的で具体的です。また、ドキュメンテーション文字列の改善と入力検証の追加は、プログラムの品質を高める重要な側面をカバーしています。一方、ペア2のコードレビューでは、コードのシンプルさを評価することは有効ですが、一部の提案は既存のコードの内容と一致していないため、その効果が限られています。

題材2: ナップサック問題

次にもう少し複雑な場合で比較するため、ナップサック問題で試してみます。


ナップサック問題とは、重さと価値が与えられている商品に対して、重さの上限が与えられたとき、価値を最大化する組み合わせを求めるという問題です


具体例としては、スーパーなどでよくある商品詰め放題で、詰める商品の合計金額が多くなるように選択する場合などに使えます。


今回は以下のようにプロンプトを与えました。

あるスーパーの商品詰め放題の対象としてn個の商品があります。
i番目の商品の重さと金額がそれぞれw[i]、v[i]となっています。(i=0,1,...,n-1)
これらの商品の組み合わせで重さがWを超えないように選択するとき、
最も合計金額が大きくなるような組み合わせを出力するプログラムをPythonで作成してください。
入力は標準入力から以下のように与えられるものとします。
n W
w[0] v[0]
w[1] v[1]
...
w[n-1] v[n-1]

Geminiのターン

まずは、Geminiが書いたコードについてです。

Geminiの書いたコード

動的計画法を用いて解いており、その点は問題なさそうです。
ですが、合計金額のみ出力しています。


問題文には「最も合計金額が大きくなるような組み合わせを出力」と記載されているため、解法自体は問題ないが問題に適した答えではないという結果になりました

def max_value(w, v, W):
"""
商品詰め放題問題を解く関数
Args:
w: 商品の重さリスト
v: 商品の金額リスト
W: 制限重量
Returns:
最も合計金額が大きくなるような組み合わせの合計金額
"""
# 動的計画法用のテーブルを作成
dp = [[0 for _ in range(W + 1)] for _ in range(len(w) + 1)]
# テーブルを埋める
for i in range(1, len(w) + 1):
for j in range(1, W + 1):
if w[i - 1] <= j:
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i - 1]] + v[i - 1])
else:
dp[i][j] = dp[i - 1][j]
# 最も合計金額が大きくなるような組み合わせの合計金額を返す
return dp[len(w)][W]
# 入力を受け取る
n, W = map(int, input().split())
w = []
v = []
for _ in range(n):
wi, vi = map(int, input().split())
w.append(wi)
v.append(vi)
# 商品詰め放題問題を解く
result = max_value(w, v, W)
# 結果を出力する
print(result)
GPT3.5のレビュー

レビュー内容は概ね問題ないです


数値で回答している部分についても、組み合わせで解答するようにしっかりと指摘できています。
ただ、修正後のコードにそれを反映できてはいませんでした。

提供されたコードは、商品詰め放題問題を解くための動的計画法を使用しています。コードのアイデアは正しいようですが、いくつかの改善ができます。
以下にコードの詳細なレビューと改善点を示します:
1. 関数のドキュメンテーション文字列(docstring)がありますが、より詳細な説明が追加できます。関数が何を行っているか、引数の説明、戻り値についての情報を提供しましょう。
2. 関数の名前 max_value は説明的ではありますが、少し一般的すぎるかもしれません。関数名をより具体的にすることを検討してください。例えば、knapsack_max_value のように命名することができます。
3. dp テーブルの初期化は正しいですが、Pythonでは通常、リストの初期化にリスト内包表記を使用することが推奨されます。例えば、以下のように初期化できます。
dp = [[0] * (W + 1) for _ in range(len(w) + 1)]
4. コード内のコメントは有用ですが、関数や変数の説明にもコメントを追加すると、コードの理解が容易になります。
5. 入力の読み取りに関するコードは正しいですが、エラー処理が不足しています。入力が不正な場合、プログラムはクラッシュする可能性があります。不正な入力に対するエラーハンドリングを追加しましょう。
6. 結果を出力する際、ただの整数値として出力されていますが、最適な商品の組み合わせも知りたい場合、それを追加で出力することを検討してください。また、最適な商品の組み合わせを復元するための関数を追加することも考えられます。
7. コード全体を関数の中にラップすることで、再利用性が高まります。主要なコードを関数に入れ、必要な引数を関数に渡すようにします。
これらの改善点を考慮して、コードを以下のように更新できます:
def knapsack_max_value(w, v, W):
"""
商品詰め放題問題を解く関数
Args:
w: 商品の重さリスト
v: 商品の金額リスト
W: 制限重量
Returns:
最も合計金額が大きくなるような組み合わせの合計金額
"""
n = len(w)
# 動的計画法用のテーブルを作成
dp = [[0] * (W + 1) for _ in range(n + 1)]
# テーブルを埋める
for i in range(1, n + 1):
for j in range(1, W + 1):
if w[i - 1] <= j:
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i - 1]] + v[i - 1])
else:
dp[i][j] = dp[i - 1][j]
# 最も合計金額が大きくなるような組み合わせの合計金額を返す
return dp[n][W]
if __name__ == "__main__":
# 入力を受け取る
n, W = map(int, input().split())
w = []
v = []
for _ in range(n):
wi, vi = map(int, input().split())
w.append(wi)
v.append(vi)
# 商品詰め放題問題を解く
result = knapsack_max_value(w, v, W)
# 結果を出力する
print(result)
この改善されたコードは、関数名の明確さ、リスト内包表記、エラーハンドリングの欠如など、いくつかの問題を修正し、より読みやすくなりました。また、モジュールの実行部分を if __name__ == "__main__": ブロックでラップして、スクリプトとしても実行できるようにしました。

GPT3.5のターン

続いて、GPT3.5が書いたコードに関してです。

GPT3.5の書いたコード

動的計画法を使っており、問題なく実装できています
また、正解の組み合わせを出力することができています。

def knapsack_max_value(n, W, weights, values):
# dp[i][w]は、i番目までの商品を選択し、重さがw以下の場合の最大合計金額を表す二次元リスト
dp = [[0 for _ in range(W + 1)] for _ in range(n + 1)]
for i in range(1, n + 1):
for w in range(W + 1):
# 商品iを選択しない場合
without_i = dp[i - 1][w]
# 商品iを選択する場合
with_i = 0
if weights[i - 1] <= w:
with_i = dp[i - 1][w - weights[i - 1]] + values[i - 1]
dp[i][w] = max(without_i, with_i)
# 最大合計金額を取得
max_value = dp[n][W]
# 選択した商品の組み合わせを復元
selected_items = []
i, w = n, W
while i > 0 and w > 0:
if dp[i][w] != dp[i - 1][w]:
selected_items.append(i - 1)
w -= weights[i - 1]
i -= 1
selected_items.reverse()
return max_value, selected_items
if __name__ == "__main__":
n, W = map(int, input().split())
weights = []
values = []
for i in range(n):
w, v = map(int, input().split())
weights.append(w)
values.append(v)
max_value, selected_items = knapsack_max_value(n, W, weights, values)
print("最大合計金額:", max_value)
print("選択した商品のインデックス:", selected_items)
Geminiのレビュー

一部既に対応している内容を改善点として挙げてしまっています
また、csvなどのライブラリを使うように指摘していますが、今回は標準入力を用いるので要件に合っていません。

コードは基本的に正しく、問題を解くことができます。しかし、コードを改善するためにいくつかの点で改善することができます。
1. **変数名の改善:** `without_i` と `with_i` という変数は、わかりにくい名前です。`without_current_item` と `with_current_item` のように、より意味のある名前に変更することをお勧めします。
2. **コードの整理:** コードは少し長くなり始めているので、いくつかの関数やクラスに分けることをお勧めします。これにより、コードをより読みやすく、保守しやすくなります。
3. **入力処理の改善:** 入力処理は手動でパースしていますが、`csv` や `json` などのライブラリを使って自動化することができます。これにより、入力をより簡単に、またよりエラーが発生しにくくなります。
4. **出力処理の改善:** 出力処理は手動で行っていますが、`print` 関数を使って自動化することができます。これにより、出力をより簡単に、またよりエラーが発生しにくくなります。
以下は、改善されたコードの一例です。
import csv
def knapsack_max_value(n, W, weights, values):
# dp[i][w]は、i番目までの商品を選択し、重さがw以下の場合の最大合計金額を表す二次元リスト
dp = [[0 for _ in range(W + 1)] for _ in range(n + 1)]
for i in range(1, n + 1):
for w in range(W + 1):
# 商品iを選択しない場合
without_current_item = dp[i - 1][w]
# 商品iを選択する場合
with_current_item = 0
if weights[i - 1] <= w:
with_current_item = dp[i - 1][w - weights[i - 1]] + values[i - 1]
dp[i][w] = max(without_current_item, with_current_item)
# 最大合計金額を取得
max_value = dp[n][W]
# 選択した商品の組み合わせを復元
selected_items = []
i, w = n, W
while i > 0 and w > 0:
if dp[i][w] != dp[i - 1][w]:
selected_items.append(i - 1)
w -= weights[i - 1]
i -= 1
selected_items.reverse()
return max_value, selected_items
if __name__ == "__main__":
with open('input.csv', 'r') as f:
reader = csv.reader(f)
n, W = next(reader)
n, W = int(n), int(W)
weights, values = zip(*reader)
weights, values = map(int, weights), map(int, values)
max_value, selected_items = knapsack_max_value(n, W, weights, values)
print("最大合計金額:", max_value)
print("選択した商品のインデックス:", selected_items)
このコードでは、`csv` ライブラリを使って入力を自動的にパースし、`print` 関数を使って出力を自動的に出力しています。また、変数名やコードの構造も改善しました。

GPT4によるコードレビューの評価

GPT4はGPT3.5のコードレビューの方が優れていると判断しました
FizzBuzz問題と同様、既に対応している部分を指摘してしまっている点が影響していると思われます。


また、今回はコードについてもGPT3.5の方が優れていると回答しました。
求めていた形式で回答できていたかが、評価を分けたと思います。

ペア1のコードレビュー(Gemini Pro):
・変数名の改善: 変数名の明確化はコードの可読性を高めるために重要です。この提案は実用的で、コード理解を容易にします。
・コードの整理: コードの構造化とモジュラー化は、可読性と保守性を向上させる重要な側面です。この提案は妥当です。
・入力処理の改善: csv や json の使用は、入力データの構造がこれらの形式に適している場合に有用です。しかし、この場合、標準入力からのデータを扱うため、これはあまり関連性がないかもしれません。
・出力処理の改善: print 関数は既に使用されており、この点に関する提案は不要です。
ペア2のコードレビュー(GPT3.5):
・ドキュメンテーション文字列: 関数の詳細な説明は、他の開発者がコードを理解するのに役立ちます。これは有用な提案です。
・関数名の明確化: より具体的な関数名は、コードの意図を明確に伝えるのに役立ちます。これは適切な提案です。
・初期化の改善: リスト内包表記を使用することは、Pythonにおける一般的な慣習です。この提案はコードの改善に役立ちます。
・コメントの追加: コード内のコメントは理解を助けるため、これも良い提案です。
・エラーハンドリング: 不正な入力に対するエラーハンドリングを追加することは、堅牢なコードを書くために重要です。
・結果の出力: 最適な商品の組み合わせを表示する機能を追加することは、ユーザーにとって有益です。
・コードの再利用性: コードを関数にラップすることで再利用性を高める提案は良いです。
総合評価
ペア2のコードレビューがより優れています。理由は以下の通りです:
1. 具体性と適用性: ペア2のレビューは、関数のドキュメンテーション、関数名の明確化、リスト内包表記の使用、エラーハンドリングの追加など、コードの可読性と堅牢性を向上させる具体的な提案を含んでいます。
2. 関連性: ペア1のレビューの一部提案(入力処理の改善、出力処理の改善)はこの特定の状況にはあまり適していないか、既に実装されているため関連性が低いです。
ペア2のレビューは、コードの構造、効率性、そして使用者の理解を向上させるためのより具体的で実用的な改善点を提示しています。

まとめ

今回はGemini ProとGPT3.5が書いたコードをお互いにコードレビューさせました。
そして、それぞれのコードとコードレビューをGPT4に評価させました。


結果としては以下のようになりました。


・FizzBuzz問題

Gemini ProGPT3.5
コード
コードレビュー

・ナップサック問題

Gemini ProGPT3.5
コード
コードレビュー

つまり、今回の結果からは以下のことが言えます。

  • コード生成については、Gemini ProとGPT3.5はほぼ互角
  • コードレビューについては、Gemini ProよりGPT3.5の方が優れている
  • GPT4が行う評価は、人間の評価と近い公正な評価

ただし、あくまで今回の場合であり、与えるプロンプトや問題の種類によって変わる可能性があることに注意してください