メインコンテンツへスキップ
見出し画像
Photo bykanasiiutage

ChatGPT APIノーコーディング1:ChatGPTの呼び出しで、temperatureを上げすぎたら衝撃的だった件

    「無料」と聞いて使いたくなる貧乏人根性

    ChatGPTのAPIが2023年3月9日に公開されているそうですが、ChatGPTとの対話だけでも楽しいので、そこまで手が回りませんでした。とはいえ、ChatGPTがコードを生成するのは見てますし、APIの無料お試しができることも知ってたので、貧乏人根性がうずいて取り組んでみることにしました。

    とはいえプログラムとなると、環境整えたりモジュールについて覚えたり、いろいろ大変です。教えてくれる人もいないので、昔なら断念していたところです。しかし、現在はChatGPTに聞いたり、ネット記事を参考にしたりして、多少の困難は乗り越えていけそうです。

    そんなわけで、いろいろすっ飛ばしますが、次の作業を行ってなんとか開発環境を整えました。

    • Visual Studio Codeをインストール

    • Pylance(パイランス)というPythonの拡張機能をインストール

    • openaiモジュールのインストール

    • API keyの取得

    ちなみに参考にしたのは、次のサイトなどです。

    OpenAIのAPIのサイトは当然見ないといけません。

    しまった!Pythonのコード書いたことない!

    次に、ChatGPTのAPIを使ったコードを実行したいわけですが、そういえば、Pythonのコードなんて書いたことありません。でも心配ご無用。もちろん、こんなときこそChatGPT頼みです。

    プロンプト

    パイソンで、1から100の数字を足して出力するコード作って。

    ChatGPTが生成したコード

    total = 0
    
    for num in range(1, 101):
        total += num
    
    print("Sum of numbers from 1 to 100: ", total)

    実行結果

    Sum of numbers from 1 to 100:  5050

    するっと動きました。この調子で、ChatGPTのAPIを使ったコードも生成してみます。

    プロンプト

    パイソンで、chatgptのAPIを使って繰り返し質問するコードを作ってください。

    ChatGPTが生成したコード

    import openai
    
    # Set up OpenAI API credentials
    openai.api_key = 'YOUR_API_KEY'
    
    # Main loop
    while True:
        # Get user input
        question = input("Enter your question (or 'q' to quit): ")
    
        # Check if the user wants to quit
        if question.lower() == 'q':
            break
    
        # Call the ChatGPT API for response
        response = openai.Completion.create(
            engine='text-davinci-003',
            prompt=question,
            max_tokens=50,
            temperature=0.7,
            n=1,
            stop=None,
            echo=False
        )
    
        # Print the generated response
        print("ChatGPT: " + response.choices[0].text.strip())

    3行目の、YOUR_API_KEYを、自分で取得したKEY文字列に差し替えて実行してみました。「ChatGPT:」以降がChatGPTの回答です。

    実行結果

    Enter your question (or 'q' to quit): こんにちは
    ChatGPT: お元気ですか?
    
    Enter your question (or 'q' to quit): 宇宙って何ですか?
    ChatGPT: 宇宙とは、宇宙船や衛星を含め、惑星、恒星、星雲、銀河な
    
    Enter your question (or 'q' to quit): 

    2つ目の「宇宙って何ですか?」の回答が途中で止まっているのは、コードでmax_tokens=50とトークン数を制限しているからです。ここを500などと増やすことで、より長い回答が得られます。

    実行結果:max_tokens=500に変更後

    Enter your question (or 'q' to quit): 宇宙とは何ですか?
    ChatGPT: 宇宙とは、銀河から星、惑星、小惑星、彗星、天体、ガス、
    尘、そして暗黒物質などから構成される、無限の広大な空間のことです。

    引数設定:なるほどわからん

    コードを見ると、質問は「openai.Completion.create」に引数(パラメータ)を設定して送ればいいようです。コードで設定している引数の意味は次の通りで、他にもいくつかの引数があるようです。

    • engine='text-davinci-003', #使用するAIエンジン

    • prompt="質問", #プロンプト文

    • max_tokens=50, #最大トークン数

    • temperature=0.7, #温度。0~2が設定可能

    • n=1, #生成数

    • stop=None, #生成を止める単語の指定。Noneは生成を止めない

    • echo=False #Trueでプロンプト文字も出力

    つまりは、ChatGPTのチャット画面で何気に質問している我々ですが、プログラムコードレベルでは、こうした引数を整えてから送信しているということではないかと推測します。

    temperature(温度)ってなんのこと?

    引数の中に、temperature(テンパチャー)という、直訳すると「温度」というものがあります。

    もしや、人としての温もり?

    なんて想像しちゃいますね。実際には、次のような感じのようです。

    • 値が小さいほど精度が高くなり回答のばらつきが起きにくくなる

    • 値が大きいほど精度が低くなり回答のばらつきが起きやすくなる

    質問には、アイデアを一つに絞っていきたい収束型と、アイデアを膨らませていきたい拡散型がありますが、前者の場合は値を小さく、後者の場合は値を大きくする、といった使い分けをするといいのかも、なんて想像してしまいますが…それ、本当ですかね?

    じゃあ試してみますか!

    というわけで、先ほどのプログラムをChatGPTに改造してもらって一度に複数のtemperature値で答えてもらえるようにしました。それが次です。これを実行すると、temperature=0.0、temperature=0.5、temperature=1.5の3つの回答を一度にしてくれます。

    コード:複数のtemperature値の回答を得る

    import openai
    
    # Set up OpenAI API credentials
    openai.api_key = 'YOUR_API_KEY'
    
    # Define the temperature values
    temperatures = [0.0, 0.5, 1.5]
    
    # Main loop
    while True:
        # Get user input
        question = input("Enter your question (or 'q' to quit): ")
    
        # Check if the user wants to quit
        if question.lower() == 'q':
            break
    
        # Generate responses for each temperature
        for temp in temperatures:
            response = openai.Completion.create(
                engine='text-davinci-003',
                prompt=question,
                max_tokens=1000,
                temperature=temp,
                n=1,
                stop=None,
                echo=False
            )
    
            # Print the generated response
            print(f"Response (temperature={temp}): {response.choices[0].text.strip()}")

    実際の回答は次の通りです。2回実行してみました。

    実行結果:1回目

    Enter your question (or 'q' to quit): 
    宇宙ってなんですか?
    
    Response (temperature=0.0): 
    宇宙とは、宇宙空間全体を指します。宇宙は、星々、惑星、
    衛星、小惑星、彗星、銀河など、無数の天体が存在する無限
    の広大な空間です。また、宇宙には、宇宙線、放射能、ガス、
    小さな微粒子など、様々な物質が存在しています。
    
    Response (temperature=0.5): 
    宇宙とは、太陽系を含めた全ての物質とエネルギーが存在する
    無限の広がりを指します。宇宙には、星、惑星、小惑星、気体、
    暗黒物質など、様々な物質が存在しています。また、宇宙には、
    重力、電磁力、弱い力など、様々な力が働いています。
    
    Response (temperature=1.5): 
    宇宙とは、すべての宇宙の存在するさまざまな構成物(宇宙・
    恒星・がいき・星など)、衛星、および運動エネルギーをさ
    も80%を占める暗黒物質・ダークエネルギーの規則に基づき
    成じたフィールド定義されたものです。実際にフィールドな
    ど学問的物で定義されもの宇宙を神話の共創とすると
    SpiritWikiで説明されます(SpiritWiki.com)。

    実行結果:2回目

    Enter your question (or 'q' to quit): 
    宇宙ってなんてすか?
    
    Response (temperature=0.0): 
    宇宙とは、宇宙空間を指します。宇宙は、無限に広がる無限の
    星々、惑星、衛星、小惑星、彗星などの様々な天体が存在する、
    無限の広がりを持つ空間です。
    
    Response (temperature=0.5): 
    宇宙とは、太陽系を含む、全ての恒星、惑星、衛星、小惑星、
    彗星などを含む、無限の広がりを持つ宇宙空間のことです。
    
    Response (temperature=1.5): 
    宇宙とは、銀河や暗黒物質を含むすべての物質や情報が存在し
    統合されている空間全体を指します。宇宙は60億光年〜ほどで、
    宇宙を私たち她の周りにみんなが狭スうiPhoneかなのSoゆる
    遠環境を形成7iVkie5@6していmo惑RBドの放yle出物か連dす。
    歴BL99世古Ma代の科学Daや特IBehDCAMTOPの本によるuikと
    fdioei宇I宙説は53uプR起h

    確かに、temperature=0.0だと、1回目と2回目が似たような内容であるような感じがしないでもありません。でも、内心ほとんど同じになることを期待していましたがアテが外れました(笑)。

    ※これについての続編記事があります。

    文章が破綻してるんですけど!

    そして、もっとも衝撃的といえるのがtemperature=1.5です。

    宇宙とは、すべての宇宙の存在するさまざまな構成物(宇宙・ 恒星・がいき・星など)、衛星、および運動エネルギーをさ も80%を占める暗黒物質・ダークエネルギーの規則に基づき 成じたフィールド定義されたものです。

    1回目の実行結果より

    宇宙を私たち她の周りにみんなが狭スうiPhoneかなのSoゆる 遠環境を形成7iVkie5@6していmo惑RBドの放yle出物か連dす。 歴BL99世古Ma代の科学Daや特IBehDCAMTOPの本によるuikと fdioei宇I宙説は53uプR起h

    2回目の実行結果より

    文章がおかしいですし、文字化けがすごいです。いったい、

    ChatGPTの高い文章能力はどこへ?

    といった感じです。

    ちなみに、おかしな回答を出力するようになると、ものすごく回答する速度が遅くなります。

    それから、temperatureの値をもっと2.0に近づけるとどうなるかというと、回答する速度が遅いうえに出てきた答えはこんな感じで、いかにも破綻した感じとなりました。

    Response (temperature=1.99): 宇宙とは無限シーズま始ま
    Response (temperature=2.0): 宇宙とは、全てが闇に包まれ18億6963

    ならば、temperatureの値を0~2の範囲外にしたらどうなるか? つまり、0より小さくしたり、2より大きくするという意味です。実際に行ってみると、次のエラーメッセージが表示されてプログラムが停止します。なるほどな感じです。

    openai.error.InvalidRequestError: -1 is less than the minimum of 0 - 'temperature'
    (-1 は最小値 0 より小さいです - temperature)
    openai.error.InvalidRequestError: 2.1 is greater than the maximum of 2 - 'temperature'
    (2.1 は最大値 2 を超えています - temperature)

    さらに、どのあたりの数値から破綻現象が始まるかを調査してみたところ、質問にもよりますが、0.1刻みで試したところ1.3~1.5ぐらいから、破綻現象が顕著になるようです。一般的にtemperature値としての適正は、

    temperature=0.2~0.8

    と言われているのも納得というものです。思考を収束しすぎるのも、拡散しすぎるのもヤバってことでしょうか。物事を考えるときには、やはり、ある程度はゆる~くですね。

    というわけで、

    おもしろすぎるぞ!ChatGPT!

    追記:続編記事を書きました

    本記事の続編を書きましたので、興味あるかたは見てください。

    引数(パラメータ)一覧

    API referenceに引数一覧が掲載されているので、表にまとめます。

    画像
     
     
    AIで時間を生み出す実験をしています。 元PC系出版社編集者。 Claude・ChatGPT・Geminiを並行使用しながら、 実践した話だけを書いています。

    あなたへのおすすめ