見出し画像

生成AIにプログラム実行させてみた

『生成AIって何ができるの?』って話題になると、決まって誰かがこう言います。『私はプログラミングしてるよ。AIが生成したコードを実装してテストしてデバッグもAIにしてもらってる』って。
まぁ、実際にそれでもコーディングのスピードは数倍から数十倍になるので良いのですが、私くらい怠惰な人間になると実装するのすらめんどくさい。
なのでコード生成から実行までをChatGPTの一連の処理で実行できないかを試してみました。
結論から言うと『実装はちゃんとしよう。』ってなったのですが、奮闘記的なnoteを残したいと思います。

どんなプログラムを作るか

先ずは作成するプログラムを考えました。
この頃ちょうど選挙に興味があったので、投票データをインプットすると結果を出力するプログラムにしました。
ただしただ単に複数の候補者から一人を選ぶ形式ではなくてマジョリティ・ジャッジメントという少し複雑な投票形式を採用することにしました。
マジョリティ・ジャッジメントについて詳しく知りたい人はググってみて下さい。

まず始めに従来通りのコード生成から

最初は従来通りにやりたことを日本語で記述して、AIにPythonコードを書いてもらいました。
こんな感じのコードが生成されました。

def majority_judgment(df):
    #データフレームの前処理
    scores_df = df.iloc[:,6:]

    # Calculate the median score for each candidate
    medians = scores_df.median()

    # First Tie-breaker: Check for higher score counts if there are ties in medians
    if medians.duplicated().any():
        for score in medians.unique():
            tied_candidates = medians[medians == score].index
            if len(tied_candidates) > 1:
                max_count = 0
                winners = []
                for candidate in tied_candidates:
                    count_above_median = (scores_df[candidate] > score).sum()
                    if count_above_median > max_count:
                        max_count = count_above_median
                        winners = [candidate]
                    elif count_above_median == max_count:
                        winners.append(candidate)
                # Adjust the median of the winning candidates to break the tie
                for winner in winners:
                    medians[winner] += 0.1

    # Second Tie-breaker: Median after removing the lowest score
    if medians.duplicated().any():
        for score in medians.unique():
            tied_candidates = medians[medians == score].index
            if len(tied_candidates) > 1:
                best_median = 0
                winners = []
                for candidate in tied_candidates:
                    scores_without_lowest = scores_df[candidate].sort_values()[1:]  # Remove the lowest score
                    new_median = scores_without_lowest.median()
                    if new_median > best_median:
                        best_median = new_median
                        winners = [candidate]
                    elif new_median == best_median:
                        winners.append(candidate)
                # Adjust the median of the winning candidates
                for winner in winners:
                    medians[winner] += 0.05

    # Sort the final results
    final_ranking = medians.sort_values(ascending=False)

    return final_ranking

あとはこれをGoogle Colab上で動作させればOKです。
若干のデバッグはAIにしてもらって完成させることができました。

ここからが本番

では次にMyGPTsという事前に役割を持ったGPTを作って投票結果をアップロードするだけで結果を出力させてみましょう。
役割を持たせるといってもChatGPTなのでプロンプト形式で指示を与えるだけです。
実際のプロンプトはこちら。

{#input}形式の投票結果ファイルを読み込み、マジョリティジャッジメント方式で採点してください。
スコアが文字列だった場合は{#change_rules}に従って数値に変換してください。
中央値が同じ場合には{#tied_breaker}ルールを採用してください。
{#tied_breaker}ルール適用後のスコアでRankを決定します。
同じ中央値かつ同じタイブレーカースコアだった場合は、それらの候補者を同じRankとして表示してください。
候補者1が勝つ場合の例は、{候補者1: 中央値 = 5.0、タイブレーカースコア = 9,候補者5: 中央値 = 4.0、タイブレーカースコア = 9}
候補者3が勝つ場合の例は、{候補者3: 中央値 = 3.0、タイブレーカースコア = 9,候補者4: 中央値 = 3.0、タイブレーカースコア = 8}
同じ順位となる場合の例は、{候補者2: 中央値 = 3.5、タイブレーカースコア = 10,候補者4: 中央値 = 3.5、タイブレーカースコア = 10}
同じRankの候補者が複数いる場合、その候補者たちは同じRankを共有します。次のRankがある場合は共有した候補者の数に応じて調整します。
例えば、Rank2が2人いる場合、次のRankは4位となります。
結果の形式は{#output}でRank1から昇順に表示してください。
採点の経過も出力してください。

#input
ID,開始時刻,完了時刻,メール,名前,最終変更時刻,候補者1,候補者2,候補者3,候補者4
候補者列数は可変です。

#change_rules
"非常に良い": 7,
"かなり良い": 6,
"やや良い": 5,
"どちらともいえない": 4,
"あまり良くない": 3,
"良くない": 2,
"全く良くない": 1

#output
Rank, Candidate_name, Median, Tied_break_score
index=false

#tied_breaker
背景:
マジョリティジャッジメント方式では、各候補者の投票結果の中央値を用いて勝者を決定します。しかし、時には複数の候補者の中央値が同じになることがあります。このような場合、タイを解消するためにタイブレーカーが使用されます。
タイブレーカーのロジック:
中央値の確認: 各候補者のスコアの中央値を計算し、同じ中央値を持つ候補者を特定します。
より高いスコアのカウント:
同じ中央値を持つ候補者に対して、中央値より高いスコアを得た回数をカウントします。
例: 中央値が3の場合、45のようなスコアをいくつ獲得しているかを確認します。
最多カウントの候補者の選出:
より高いスコアのカウントが最も多い候補者を特定します。
もし複数の候補者が同じカウント数であれば、それら全ての候補者がタイブレーカーの対象となります。
タイブレーカーの適用:
タイブレーカーによって選出された候補者の中央値に微小な値を加算し(例: 0.1)、タイを解消します。

はい、Pythonコードより長い印象です。
最初はずっと短かったのですが、投票結果が安定しないので試行錯誤していたらこの長さになりました。
実際問題としてPythonコードを書いてもらうよりもず〜〜っと時間かかってます。
そしてなんと…結果が安定しません!
同点だった際に行うタイブレークの処理をミスしたり、順位を昇順ではなく降順で表示してしまう凡ミスまでやらかします。
意味不明です。

考察

最終的にコード生成よりも丁寧に教え込んでも結果が安定しない理由を以下のように結論づけました。
それが生成AIというものだから』
よく考えてみるとそうなんですよね。
画像生成のAIなんかもそうですが、同じプロンプトで絵を描いてもらっても毎回違うものが生成されるじゃないですか。
なので生成AIにコードを生成してもらうのは全然アリだと思うのですが、生成から実行までさせちゃうのは現時点では危険かもってことです。


この記事が気に入ったらサポートをしてみませんか?