見出し画像

ChatGPTのCode Interpreterを触ってみて思いを馳せる

以下記事を見て触発されたので、自分も行ってみる。

まずは以下から。

コード生成

以下の数字の分だけ数字を足し、その数字が素数かどうかを判断してください。
d9mns2567H_tdVHur3tnKnW8b6g67p3mRDPJD48ZKmus_Aea9F7rKLU3gprn
上記質問の回答


個人的には「あいまいだった部分はきちんと確認を取ってから生成してくれる」という部分が嬉しいですね。これだけでも「要件作成における人間の不完全さ」を感じられる。

要件追加

「2567」のように、連続した数字は大きい数字として認識してもらうようにしてみた。

def sum_of_digits_in_string(s):
    return sum(int(digit) for digit in s if digit.isdigit())

def is_prime(n):
    if n <= 1:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False

    i = 3
    while i * i <= n:
        if n % i == 0:
            return False
        i += 2

    return True

s = "d9mns2567H_tdVHur3tnKnW8b6g67p3mRDPJD48ZKmus_Aea9F7rKLU3gprn"
sum_of_digits = sum_of_digits_in_string(s)
is_sum_prime = is_prime(sum_of_digits)

sum_of_digits, is_sum_prime

うまくいってそう。生成されたコードは以下

import re

def sum_of_numbers_in_string(s):
    return sum(int(number) for number in re.findall(r'\d+', s))

sum_of_numbers = sum_of_numbers_in_string(s)
is_sum_prime = is_prime(sum_of_numbers)

sum_of_numbers, is_sum_prime

Google Colabのようになっていそうに感じます。一度目のコードと二度目のコードを合わせないと、二度目のコードは動かない。is_prime関数は二度目のコードでは定義されていません。

グラフの生成

この後、文字列を複数渡し、その合計数をグラフにしてみました。

import re
import matplotlib.pyplot as plt

def sum_of_numbers_in_string(s):
    return sum(int(number) for number in re.findall(r'\d+', s))

def is_prime(n):
    if n <= 1:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False

    i = 3
    while i * i <= n:
        if n % i == 0:
            return False
        i += 2

    return True

strings = [
    "xNG2PQEJZiFCjxfCL_3zTu7VJbmniaQ8NNG8RMbPxR4LL9k9weMRz35mgbyh",
    "ypB2dyLPGKxzyde4edST_NT838xJSk7xu3UNSKATEELGjf_u4hjkFa9MzEHV",
    "Bxw6UFB8V6px_HV6ynCxwmMnaAKke7CsgLX4BymPPfHcUPACy2Qu6W2xGu2f",
    "tSCujsZEdLBKRcm92LYLtx9BDXsrtn4NiBQ4dHWb-2wVbeC8MWexZaySdhtU",
    "-54jjpSRewp5u8yfDzf-E3pitKWfxr_zLUB9b-wdP7zfwKXLtLKux5a9-FW3",
    "ftEgh5xTrjDNT9ss86F2sun6ksNptjm7HuRwrAUasr-Nc8-cxMjmMhBMbtyD",
    "FQHN4aKXs_nJhH8AzuYSfHHFQujUrGdjkwGBGV8nyaS7WfTQx8mDg29Ymeew",
    "yMBLir83GVRVm7rR5TusHp-dg2nimLfZUkidyrYSQXB3TfAFBT5DjN5WcrLG",
    "7zWnedfX9Vsf2c2rgeR2MRinaMVRcmbk2W5_dwcwLDspfEsBx_yZFpipZx_S",
    "hHYZZB5wnfPTNQYQ4mdRPS2spQ-c8VEMS_gUdbU7u_3e4BXk-Gdxt2Yt4FNE",
]

sums = [sum_of_numbers_in_string(s) for s in strings]
is_prime_flags = [is_prime(sum) for sum in sums]

plt.figure(figsize=(10, 6))
plt.bar(range(len(strings)), sums, tick_label=strings, color=['blue' if is_prime else 'red' for is_prime in is_prime_flags])
plt.xticks(rotation='vertical')
plt.title('Sum of numbers in strings')
plt.ylabel('Sum')
plt.show()

折角なので、これの単体テストを行ってもらいましょう。
新しいスレッドに移行します。

単体テストの作成

以下は英数字混在した文字列の中から数字を取り出し、それを合計する関数です。
なお、「123」と続いている場合は「1,2,3」ではなく「123」として処理します。
例えば「a12kf3j4@5」とした場合は「12,3,4,5」を足します。
def sum_of_numbers_in_string(s):
    return sum(int(number) for number in re.findall(r'\d+', s))

以上の関数の単体テストを行いたいです。考えられるケースをいくつか作成、実行し、この関数の問題点を洗い出してください。
import unittest
import re

# Define the function
def sum_of_numbers_in_string(s):
    return sum(int(number) for number in re.findall(r'\d+', s))

# Define the test case class
class TestSumOfNumbersInString(unittest.TestCase):
    def test_numbers_only(self):
        self.assertEqual(sum_of_numbers_in_string("12345"), 12345)

    def test_letters_only(self):
        self.assertEqual(sum_of_numbers_in_string("abcdefg"), 0)

    def test_mixed_alphanumeric(self):
        self.assertEqual(sum_of_numbers_in_string("a1b2c3d4e5"), 15)

    def test_mixed_alphanumeric_special(self):
        self.assertEqual(sum_of_numbers_in_string("a1b2c3@d4e5"), 15)

    def test_empty_string(self):
        self.assertEqual(sum_of_numbers_in_string(""), 0)

    def test_consecutive_numbers(self):
        self.assertEqual(sum_of_numbers_in_string("a123b456"), 579)

    def test_negative_numbers(self):
        # Since the function uses the '\d+' regex, it does not handle negative numbers correctly
        # So, we expect it to ignore the negative sign and sum the absolute values
        self.assertEqual(sum_of_numbers_in_string("a-1b2c-3"), 6)

# Run the tests
unittest.main(argv=[''], exit=False)

きちんと単体テストを行ってくれました。また負の数の問題点についても指摘してくれました。更に問題点になり得る点があるかを聞いてみます。

関数の考慮漏れチェック

ありがとうございます、負の数は自分の認識外でした。
他にこの関数で問題点となりそうなところはありますか?

大きな数字、浮動小数点だけでなく、エラーハンドリングの問題、非ASCII文字のケースも指摘してもらっています。
この中から数百桁の数字があるとどうなるかを試してもらいましょう。

指摘部分の動作確認

ここでコードを全然読んでない僕はこう思いました。「500桁って言いながら500をsに足してない…?」
聞いてみます。

再度生成するGPTちゃん
やっぱり合ってたじゃねーか!

はい、完全に自分の見落としです。 s = "a" + "1" * 500 + "b"を s = "a" + "1" + "500" + "b"と読み間違えていました。この時点で僕みたいなミスが多いエンジニアより全然優れていることが皮肉にも証明されてしまい、泣きそうになりました。

まとめ

Code Interpreterを使い、コードの生成、要件の追加、グラフの作成、テストの作成と実行、考慮漏れチェック、(皮肉にも)使用者のコード読み間違いの指摘ができました。

個人的には凄い画期的な機能だと感じています。特にPythonコードを自動で実行できるのは良くて、「取り敢えずこれ実行しといて」という感じで実行できるクラウドの環境としても使えるのかも?という実感がわきました。

謝罪を要求するGPTちゃん

小規模システムの開発の高速化はさらに進んでいくでしょう。今までカジュアルなスクリプトを組めるエンジニアでなければできなかったものが、自然言語を扱えるだけで実行、動作確認までをシームレスに行うことができる世界になってしまいました。

少なくとも「ちょっとしたシステムをつくる」という市場は大きく変動するはずです。これから簡単にできるようになることに夢が膨らみつつ、いつまで自分がエンジニアとしてやっていけるだろうか、という不安もよぎりました。

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