見出し画像

ChatGPT APIノーコーディング3:ターボは使い方が違ってた件

これまで2回にわたり、私自身はノーコーディングで、APIを直接利用するコードを作成してきました。ところが…なんと…!

ここで使用していたAPIであるtext-davinci-003エンジンは、すでに過去のものとなりつつあるようです。それが何かというと、

gpt-3.5-turboエンジン

という新バージョン。このターボのいいところはというと、

  • 利用料がtext-davinci-003エンジンに比べて10分の1ほど安い

  • 最新版が更新され続けている

  • WebサービスのChatGPTにも調整版が採用されている

という感じのようです。orz…

ちなみに、以前ChatGPTには、高速なChatGPT-3.5 Turboモード(その後、defaultもモードに名称変更)があったので、それがgpt-3.5-turboエンジンに切り替わったタイミングだったものと思われます。

エンジン名変えればいいだけじゃなかった

エンジンを乗せ換えについて、次のようにコードを修正すればいいだけかなと思って、やってみました。

engine='text-davinci-003',
     ↓
engine='gpt-3.5-turbo',

これを実行してみると、次のエラーになります。

openai.error.InvalidRequestError: This is a chat model and not supported in the v1/completions endpoint. Did you mean to use v1/chat/completions?
(openai.error.InvalidRequestError: これはチャット モデルであり、v1/completions エンドポイントではサポートされていません。 v1/chat/completions を使用するつもりでしたか?)

調べてみたところ、

text-davinci-003では、v1/completionsエンドポイントが使用されているがgpt-3.5-turboでは、v1/chat/completionsエンドポイントを使用する

ということのようです。エンドポイントというのは、つまりはアクセス先が違うということです。

text-davinci-003:openai.Completion.create
gpt-3.5-turbo:openai.ChatCompletion.create

確かに違いますね。ついでに、リクエストの仕方も異なるようなので、ここはやっぱりChatGPTに、サクッと修正してもらうことにしました。

import openai

# OpenAI API認証情報の設定
openai.api_key = 'API-KEY'

# パラメータの定義
parameters = {
    'engine': 'gpt-3.5-turbo',
    'max_tokens': 400,
    'stop': None,
}

# 温度の定義
temperatures = [0 , 0.8]

# メインループ
while True:
    # ユーザーからの入力を取得
    question = input("質問を入力してください(終了するには 'q' を入力): ")

    # ユーザーが終了したいかどうかをチェック
    if question.lower() == 'q':
        break

    # 各温度での反応を生成
    for temp in temperatures:
        # 温度パラメータの更新
        parameters['temperature'] = temp

        # APIを呼び出す
        response = openai.ChatCompletion.create(
            model=parameters['engine'],
            messages=[
                {"role": "system", "content": "あなたは助けになるアシスタントです。"},
                {"role": "user", "content": question}
            ],
            max_tokens=parameters['max_tokens'],
            temperature=parameters['temperature'],
            stop=parameters['stop'],
        )

        # 生成された反応を出力
        print(f"反応 (温度={temp}): {response['choices'][0]['message']['content']}")

ちなみに、相変わらず、temperatures(温度)を指定して、複数回リクエストするようになっています。ただ、gpt-3.5-turboでは1分間に3回以上のリクエストはできない仕様になっているようです。

そのため、上記コードではtemperatur=0とtemperatur= 0.8の、2回のリクエストをするように減らしてあります。これでも連続質問するとすぐエラーになるのでご注意ください。

実行結果:宇宙とはなんですか?

質問を入力してください(終了するには 'q' を入力): 宇宙とはなんですか?

反応 (温度=0): 宇宙とは、私たちが住む地球を含む、すべての物質、エネルギー、時間、空間の総体を指します。宇宙は、星、惑星、衛星、彗星、小惑星、銀河、ブラックホール、ダークマター、ダー
クエネルギーなど、さまざまな天体や物質で構成されています。宇宙は、私たちが知ることができる最大のものであり、私たちの理解を超える多くの謎や不思議が残されています。

反応 (温度=0.8): 宇宙とは、私たちが存在する地球を含む、すべての物質とエネルギーが存在する無限の空間のことを指します。宇宙には、星、惑星、衛星、彗星、流星、ブラックホール、銀河などが
含まれます。宇宙は、我々が知っている限りでは、常に拡大しており、その起源についてはまだ多くの謎が残っています。科学者たちは、宇宙の起源や構造、進化などについて研究を続けています。 

実行結果:AIとは一言でいうと何ですか?

質問を入力してください(終了するには 'q' を入力): AIとは一言でいうと何ですか?

反応 (温度=0): AIとは、人工知能のことを指します。つまり、コンピューターやロボットなどの機械による知的な活動や判断を実現する技術のことです。人間が行う知的な作業を機械が代替することで
、生産性の向上や新しい価値の創造が期待されています。

反応 (温度=0.8): AIとは「人工知能」の略称で、人工的に構築されたシステムが、人間のような知的な機能を実現する技術の総称です。具体的には、自然言語処理や画像認識、音声認識などの技術が含
まれます。

gpt-3.5-turboはちょっとおしゃべり?

この出力を見て、ちょっと思ったのですが、text-davinci-003と比較すると、gpt-3.5-turboは出力文字数が少し多い感じがします。たまたまかもしれませんが、一応比較をしておきます。

text-davinci-003、temperatur=0
AIとは、人工知能(Artificial Intelligence)の略称です。
AIは、コンピューターや機械が自然な方法で人間のような思考
や行動を行うことを可能にする技術です。

gpt-3.5-turbo、temperatur=0
AIとは、人工知能のことを指します。つまり、コンピューター
やロボットなどの機械による知的な活動や判断を実現する技術
のことです。人間が行う知的な作業を機械が代替することで生
産性の向上や新しい価値の創造が期待されています。

text-davinci-003、temperatur=0
宇宙とは、宇宙空間全体を指します。宇宙は、星々、惑星、衛星、
小惑星、彗星、銀河などの様々な天体を含む、無限の広大な空間
です。宇宙は、宇宙物理学、天文学、宇宙生物学などの多くの分
野で研究されています。

gpt-3.5-turbo、temperatur=0
宇宙とは、私たちが住む地球を含む、すべての物質、エネルギー、
時間、空間の総体を指します。宇宙は、星、惑星、衛星、彗星、
小惑星、銀河、ブラックホール、ダークマター、ダークエネルギー
など、さまざまな天体や物質で構成されています。宇宙は、私たち
が知ることができる最大のものであり、私たちの理解を超える多く
の謎や不思議が残されています。

マルチターンってなんぞ?

text-davinci-003と比較して、gpt-3.5-turboのリクエストコードで変わっているのが、次のmessagesの部分です。

messages=[
    {"role": "system", "content": "あなたは助けになるアシスタントです。"},
    {"role": "user", "content": question}
],

ただ質問するのではなく、あらかじめ"system"、”assistant”、”user"というそれぞれの役回りに、なにがしかのお膳立てをしておく必要があるようです。とはいえ、具体的な指定方法がさっぱりわかりません。これについては、次のページが役立ちそうです。

基本的な形式

<基本的なチャット形式>
{"role": "system", "content": "モデルに何らかのコンテキストや指示を与えます。"},
{"role": "user", "content": "ユーザーのメッセージはここに入れます。"}

<回答例の後に会話が続く形式>
{"role": "system", "content": "モデルに文脈や指示を与えます。"},
{"role": "user", "content": "質問例はこちらへ。"},
{"role": "assistant", "content": "回答例はこちらへ。"},
{"role": "user", "content": "モデルが実際に回答するための、最初の質問/メッセージ。"}

<userメッセージで終わることでassistantの番であることを促す>
{"role": "user", "content": "熱力学とは何ですか?"}

実際の例

<基本的な例>
{"role": "system", "content": "アシスタントはOpenAIで学習させた大規模な言語モデルです。"},
{"role": "user", "content": "マイクロソフトの創業者は誰ですか?"}

<説明を付けた例>
{"role": "system", "content": "アシスタントは、ユーザーの税金に関する質問に答えるために設計されたAIチャットボットです。
指示は以下の通りです: 
- 税金に関連する質問にのみ回答してください。
- 答えに迷った場合は、「わからない」「よくわからない」として、ユーザーには国税庁のホームページで詳細を確認するように勧めることができます。"},
{"role": "user", "content": "税金の納期はいつですか?"}

<根拠付けデータ使用の例>
{"role": "system", "content": "アシスタントは、Azure OpenAI Serviceに関する技術的な質問にユーザーをサポートするために設計されたAIチャットボットです。以下の文章を使用して質問に回答し、回答がわからない場合は「わかりません」と言ってください。

文章:
- Azure OpenAI Serviceは、GPT-3、Codex、Embeddingsモデルシリーズを含むOpenAIの強力な言語モデルへのREST APIアクセスを提供します。
- Azure OpenAI Serviceは、OpenAIのGPT-3、Codex、DALL-Eモデルによる高度な言語AIを、Azureのセキュリティとエンタープライズの約束で顧客に提供します。Azure OpenAIは、OpenAIとAPIを共同開発し、互換性とスムーズな移行を保証します。
- マイクロソフトでは、人々を第一に考える原則によって駆動されるAIの進歩にコミットしています。マイクロソフトは、悪用や意図しない危害から守るために多大な投資を行っており、これには、責任あるAI利用のためのマイクロソフトの原則を取り入れた、十分に定義された使用例を示すことを申請者に求めることも含まれています。"},
{"role": "user", "content": "Azure OpenAI Serviceとは何ですか?"}

<チャット補完の例>
{"role": "system", "content": "アシスタントは、ユーザーの税金に関する質問に答えるために設計されたAIチャットボットです。"},
{"role": "user", "content": "いつまでに確定申告をすればいいのでしょうか?"},
{"role": "assistant", "content": "2023年、あなたは4月18日までに税金を申告する必要があります。この日は、2023年に4月15日が土曜日にあたるため、通常の4月15日の締切日以降となります。詳しくは、https://www.irs.gov/filing/individuals/when-to-file を参照してください。"},
{"role": "user", "content": "税金の還付状況を確認するにはどうすればよいですか?"},
{"role": "assistant", "content": "税金の還付状況は、https://www.irs.gov/refunds にアクセスして確認することができます。"}

<チャット以外の補完例>
{"role": "system", "content": "あなたは文章から取引先情報を抽出するために設計されたアシスタントです。ユーザーはテキストの文字列を貼り付け、あなたはそのテキストから抽出した取引先情報をJSON objectとして返答します。以下は出力形式の例です:
{
   "名前": "",
   "会社": "",
   "電話番号": ""
}"},
{"role": "user", "content": "こんにちは。私の名前はロバート・スミスです。デラウェア州のコントーソ保険から電話しています。私の同僚が、あなたが当社の包括的な福利厚生政策について知りたいと言っていました。機会があれば、(555) 346-9322 までお電話をいただければ、特典についてご説明させていただきますが、いかがでしょうか?"}

ちなみに、"assistant"は、連続した会話を成立させるためのフィードバック用にも使用されるようです。つまり、APIが返してきた回答を、次回の質問にくっつけて送ることで、会話の流れをつなげていくテクニックがあるってことです。

※これについては、次回の記事で挑戦してみます。

エンジンの挙動はプレイグラウンドで

これまで、OpenAIの提供するエンジンをコードで試してみましたが、実は、APIの挙動を調べる場所として、

Playground(プレイグラウンド:遊び場)という広場

があります。Playgroundに行くと、チャット形式でAPIの試験ができますので利用するといいと思います。例えば、gpt-3.5-turboの試験であれば、次のサイトを開きます。

そして次の操作をします。

  1. 右メニューの「Mode」で「Chat」を選択

  2. 右メニューの「Model」で「gpt-3.5-turbo」を選択

  3. 「USER」の右をクリックして質問を入力

  4. 「Submit」ボタンを押す

以上で回答が得られます。右メニューでTemperatureをはじめとする引数の設定もできますので、あれこれ調節して試してみましょう。

PlaygroundでAPIのお試し

というわけで、

俺のちっちゃいポケットには入り切れないぜ、ChatGPT!

関係する記事一覧

いいなと思ったら応援しよう!