ChatGPT(GPT-4)で再帰的な処理をプロンプトとして入力可能という話を聞いて、ひょっとしたらChatGPT上で文章生成と組み合わせたpythonのプログラムが動かせるのではないか?と思い、試してみました。
なぜ、こんな事をしたいかというと、ChatGPTに対して「言葉で伝えるより、プログラムで伝えた方が間違いなく伝わる場合があるのでは?」と思ったからになります。

言葉は伝え方と受け取り方次第で誤解を生みますが、プログラムは書かれた通りにしか動かないので誤解を生みません

システム開発において、設計者とプログラマーが別の人間であった場合、設計書を読んでプログラムを組んだのに、間違った実装をするのは、そういう理由も大きいと思います。


さっそく入力するためのpythonのプログラムを作り始めたのですが・・・これが非常に面倒です。あまりにも面倒なので、ChatGPT(GPT-3.5)にほぼ丸投げしました。

作成したいプログラムは「泣ける短編小説」の「あらすじ」を自動生成して、そのあらすじを元に(ChatGPTが考えた)5人の評論家が評価をして採点するというものです。このプログラムの8割ぐらいは自動生成で出来ました。

プログラムは下記の通りです。

class Critic:
    def __init__(self, name, age, gender, field, personality):
        self.name = name
        self.age = age
        self.gender = gender
        self.field = field
        self.personality = personality
   
    def print_info(self):
        print(f"{self.name}({self.age}歳、{self.gender}、{self.field}評論家、性格:{self.personality})")

# Define the critics in an array
critics = [
    Critic("田中太郎", 45, "男性", "映画", "厳格で冷静な分析が得意"),
    Critic("山本花子", 32, "女性", "音楽", "感性的で独自の視点を持つ"),
    Critic("佐々木健太", 50, "男性", "小説", "文学的な解釈が得意"),
    Critic("鈴木一郎", 28, "男性", "漫画", "熱狂的なファンでもある"),
    Critic("中村光子", 60, "女性", "美術", "芸術的な感性を持つ")
]

# GPT-4で文章を生成
prompt = f"泣ける短編小説のあらすじを500文字以内で書いてください。"
    response = openai.Completion.create(
      engine="text-davinci-002",
      prompt=prompt,
      temperature=0.5,
      max_tokens=500,
      top_p=1,
      frequency_penalty=0,
      presence_penalty=0
    )
story = response

print("ストーリー:" + story)

for critic in critics:
    # GPT-4で文章を生成
    prompt = f"この短編小説について、簡単な論評を50文字以内で書いてください。(点数は0から10まで、小数点以下1桁まで評価できます)\n\n{story}"
    response = openai.Completion.create(
      engine="text-davinci-002",
      prompt=prompt,
      temperature=0.5,
      max_tokens=150,
      top_p=1,
      frequency_penalty=0,
      presence_penalty=0
    )
    print("名前:" + critic.print_info())
    print("論評:" + response.論評 )
    print("点数:" + response.点数)

文書生成の部分はGPT-4のAPIを呼ぶようなプログラムが出力されました。
予想外でしたが、これはこれでいい感じです!
黒太字が追加・編集した箇所になります。

プログラムの冒頭に下記の1行を追加し、ChatGPT(GPT-4)に入力してみます。

下記pythonプログラムの不足部分を補完しながら実行し。結果を提示してください。必要なのはプログラムではなく出力結果です。

 
出力結果は下記のとおりです。

私は実際にGPT-4を実行することができませんが、あなたが提供したプログラムに基づいて、生成されるであろうストーリーと評論の例を提示します。

ストーリー:
ある小さな村に、心優しい青年トムと、彼を深く愛する少女リリーがいました。ある日、リリーは病に倒れ、彼女の最期の願いはトムに手紙を書くことでした。彼女はその手紙の中で、彼女が秘密にしていた感謝の気持ちと、彼と過ごした日々の幸せを伝えました。トムはリリーの死後も、手紙を何度も読み返し、彼女との想い出を胸に刻みました。

評論家1(田中太郎):
名前:田中太郎(45歳、男性、映画評論家、性格:厳格で冷静な分析が得意)
論評:感動的な物語で、心に残る。リリーの手紙が物語のクライマックスだ。
点数:8.5

評論家2(山本花子):
名前:山本花子(32歳、女性、音楽評論家、性格:感性的で独自の視点を持つ)
論評:純粋な愛が描かれており、読む人の心を打つ。涙なしでは読めない。
点数:9.0

評論家3(佐々木健太):
名前:佐々木健太(50歳、男性、小説評論家、性格:文学的な解釈が得意)
論評:短い物語ながら、深い感情が描かれている。選び抜かれた言葉が心に響く。
点数:8.7

評論家4(鈴木一郎):
名前:鈴木一郎(28歳、男性、漫画評論家、性格:熱狂的なファンでもある)
論評:短い文章の中で、強烈な感動を与える。誰もが共感できる物語だ。
点数:8.8

評論家5(中村光子):
名前:中村光子(60歳、女性、美術評論家、性格:芸術的な感性を持つ)
論評:人間の愛と切なさが美しく描かれており、心に深く残る作品。
点数:9.2

これらの論評は、あなたが提供したプログラムに基づいて想像されたものであり、実際のGPT-4の出力ではありません。しかし、これらの例は、GPT-4が生成するであろうストーリーと評論に似たものです。

ほぼ、プログラムを実行した結果と同じようなものが出力されました。

全ての評論家の論評と採点が表示されていますので「for critic in critics:」をきちんと解釈しているのが分かります。API呼び出しの部分はChatGPT(GPT-4)がいかにも作成したようなものがセットされていますね。


もう少し欲が出てきた為、この「あらすじ」の生成を繰り返し実行して採点が高いものを探したいと思います。

ChatGPT(GPT-3.5)で先ほどのプログラムの冒頭に下記を追加して入力し、プログラムの修正をしてもらいます。

下記[プログラム]以下を次の手順で修正してください。
    1:すべての評論家に評論させ、平均点を求めてください。これは表示しません。
    2:平均点が9より低い場合は、平均点をリセットし、1に戻ってループします。9以上ならループから抜け、3に進みます。
    3:最後に、すべての評論家の評論と点数を表示してください。

[プログラム]

 
生成されたプログラムは下記のとおりです。

class Critic:
    def __init__(self, name, age, gender, field, personality):
        self.name = name
        self.age = age
        self.gender = gender
        self.field = field
        self.personality = personality
        self.comment = ''

    def print_info(self):
        return f"{self.name}({self.age}歳、{self.gender}、{self.field}評論家、性格:{self.personality})"

# Define the critics in an array
critics = [
    Critic("田中太郎", 45, "男性", "映画", "厳格で冷静な分析が得意"),
    Critic("山本花子", 32, "女性", "音楽", "感性的で独自の視点を持つ"),
    Critic("佐々木健太", 50, "男性", "小説", "文学的な解釈が得意"),
    Critic("鈴木一郎", 28, "男性", "漫画", "熱狂的なファンでもある"),
    Critic("中村光子", 60, "女性", "美術", "芸術的な感性を持つ")
]

story = ""

average_score = None
while average_score is None or average_score < 9:

    # GPT-4で文章を生成
    prompt = f"泣ける短編小説のあらすじを500文字以内で書いてください。"
    response = openai.Completion.create(
        engine="text-davinci-002",
        prompt=prompt,
        temperature=0.5,
        max_tokens=500,
        top_p=1,
        frequency_penalty=0,
        presence_penalty=0
    )
    story = response.choices[0].text


    scores = []
    for critic in critics:
        # GPT-4で文章を生成
        prompt = f"この短編小説について、簡単な論評を50文字以内で書いてください。(点数は0から10まで、小数点以下1桁まで評価できます)\n\n{story}"
        response = openai.Completion.create(
            engine="text-davinci-002",
            prompt=prompt,
            temperature=0.5,
            max_tokens=150,
            top_p=1,
            frequency_penalty=0,
            presence_penalty=0
        )
        critic_score = float(response.choices[0].text)
        critic_comment = response.choices[0].text.strip()
        critic.comment = critic_comment

        scores.append(critic_score)
   
    average_score = sum(scores) / len(scores)
    print( "評価中・・・" + average_score )
   
print( "あらすじ:" + story )
print("すべての評論家の評論を点数を表示します:")
for critic, score in zip(critics, scores):
    print(f"{critic.name}: {score} ({critic.comment})")

いい感じに修正してくれました・・・と言いたいところですが、太字部分は手を加えています

これだけでも凄いことなのですが、慣れてくると「これぐらい、出来て当たり前」みたいな感覚になってくるのが怖いですね。

再びプログラムの冒頭に下記の1行を追加し、ChatGPT(GPT-4)に入力してみます。

下記pythonプログラムの不足部分を補完しながら実行をシミュレートし結果を表示してください。必要なのはプログラムではなく出力結果です

 
出力結果は下記のとおりです。

以下のように出力されると想定されます。

評価中・・・7.5
評価中・・・8.2
評価中・・・9.1

あらすじ:ある田舎町で、老夫婦が孫娘のマリと一緒に暮らしていました。マリは魔法の力を持っており、病気の植物や動物を癒すことができました。ある日、マリは病に倒れた森の中の大樹を助けたいという願いを抱きました。しかし、その大樹を癒すにはマリ自身の魔法の力を全て使い果たさなければならず、もう二度と魔法を使えなくなることを知りました。それでも、森の命を救うために彼女は決断をし、全ての力を使い果たしました。そして、大樹は助かり、森は再び元気になりました。マリは魔法の力を失いましたが、彼女がなした行為は町中に広がり、彼女の優しさと勇気が人々の心に深く刻まれました。

すべての評論家の評論を点数を表示します:
田中太郎: 9.3 (感動的なストーリー。心に響く展開)
山本花子: 8.9 (マリの優しさに感動。良いメッセージが伝わる)
佐々木健太: 9.0 (孫娘の献身が美しい。文学的価値も高い)
鈴木一郎: 9.2 (泣ける展開で、素晴らしい短編小説だ)
中村光子: 9.1 (感動的な物語。マリの愛と犠牲が心に残る)

3回目に9点を超えたとのことです。

低い採点の時どのような「あらすじ」が出たか気になりますので聞いてみます。結果は下記のとおりです。

申し訳ありませんが、過去の評価データは保存されていないため、その情報を提供することはできません。ただし、以下は仮に最も点数が低かった「評価中・・・7.5」の短編小説のあらすじと評論家の短評と点数の例です。

あらすじ:
ある村に、幸せを運ぶと言われる白い猫が住んでいました。その猫は、村人たちに慕われていましたが、突然姿を消してしまいます。村人たちは猫を探し、ついに遠くの山で見つけますが、その猫はもう息を引き取っていました。村人たちは悲しみに暮れますが、その後も村には白い猫の子孫が現れ、村人たちの幸せを見守り続けました。

評論家の短評と点数の例:

田中太郎: 7.2 (物語は心温まるが、もう少し深みが欲しい)
山本花子: 7.5 (猫の存在が魅力的だが、ストーリーの展開に物足りなさを感じる)
佐々木健太: 7.8 (猫と村人たちの関係が描かれているが、背景にある感情が浅い)
鈴木一郎: 7.4 (白い猫の子孫の描写は良いが、全体的に物語が単調)
中村光子: 7.9 (美しい物語だが、感動的な要素が少し弱い)

上記の例はあくまで一例であり、実際のシミュレーションで得られる結果とは異なることにご注意ください。

実際にプログラムが実行されたかは分かりませんが、「過去の評価データは保存されていない」というそれっぽいことを言っていますね。
この結果で興味深いのは、採点という結果から想定される例を作ってしまっているところですね。

そうすると、こういう質問するとどうなるか気になりますよね?

「評価中・・・3.0」の出力例を示してください。

 
出力結果は下記のとおりです。

以下に、仮に最も点数が低かった「評価中・・・3.0」の短編小説のあらすじと評論家の短評と点数の例を示します。

あらすじ:
ある日、タヌキが森でネズミと出会い、友達になりました。彼らは一緒に遊んだり、食べ物を分け合ったりしました。しかし、ある時ネズミがタヌキの食べ物を全部食べてしまい、タヌキは怒ってしまいます。最後にはタヌキがネズミを許し、再び友達になりました。

評論家の短評と点数の例:
田中太郎: 3.1 (単純すぎるストーリーで、感動的要素が欠けている)
山本花子: 2.8 (タヌキとネズミの関係が弱く、感情移入できない)
佐々木健太: 3.2 (物語の展開が予測可能で、文学的価値に乏しい)
鈴木一郎: 3.0 (子供向けの話かもしれないが、面白みや独自性が足りない)
中村光子: 3.1 (物語が平凡で、深みや芸術的要素が感じられない)

上記の例はあくまで一例であり、実際のシミュレーションで得られる結果とは異なることにご注意ください。

悲劇の大きさと話のスケールがそのまま点数になってそうですが、それでもなんとなく面白くなさそうな「あらすじ」になっています。

ここまで試してみて、プログラムを実際に動かしているかはわかりませんが、少なくともプログラムを解釈して実行結果を出力していることは間違いないです。また、それ以上の事が出来る可能性も非常に感じます。

これと同じことをChatGPT(GPT-3.5)で行うと、結果がどうなるかを見てみましょう。
GPT35結果2.png 22.8 KB結果ではなく、プログラム自体を出力しはじめました・・・
さらには、プログラムの説明をはじめ、「プログラムの修正をしてやったぞ」みたいなことを出力する始末。「あとはお前が実行しろ」のような感じで丸投げしてきます。

「ちがう、そうじゃない!」という感じですね。ただ、GPT-3.5の方が早く処理されてかつ、新しい事を学習しているというメリットもあります。

・新しい情報を使って素早く処理したい場合は、GPT-3.5(=新人社員)
・処理が遅くても、もっと高度な作業をしたい場合はGPT-4(=ベテラン社員)


という感じで使い分けるのが正解に感じます。
プログラムの自動生成やレビュー、バグ修正ならGPT-3.5でも全然いけます
逆にGPT-4の能力は底知れぬものがありますね。

このようなヤバいものを「いつまで自由に使わせてくれる」のかが心配になります。
試してみたい方は早めに試した方がいいかもしれません!