GPT-3.5-Turbo および GPT-4 モデルの操作

GPT-3.5-Turbo および GPT-4 モデルは、会話インターフェイス用に最適化された言語モデルです。 これらのモデルの動作は、以前の GPT-3 モデルとは異なります。 以前のモデルはテキストインとテキストアウトでした。つまり、プロンプト文字列を受け入れ、プロンプトに追加する入力候補を返しました。 ただし、GPT-3.5-Turbo と GPT-4 モデルは、カンバセーションインとメッセージアウトです。これらのモデルでは、特定のチャットのようなトランスクリプト形式で書式設定された入力が想定されています。 これらは、チャット内のモデルで記述されたメッセージを表す入力候補を返します。 この形式はマルチターン会話専用に設計されていますが、チャット以外のシナリオにも適しています。

この記事では、GPT-3.5-Turbo および GPT-4 モデルの概要について説明します。 最適な結果を得るには、ここで説明する手法を使用します。 以前のモデル シリーズと同じ方法でモデルを操作しようとしないでください。モデルが詳細になり、有用な応答が得られないことがよくあるためです。

GPT-3.5-Turbo および GPT-4 モデルの操作

次のコード スニペットは、GPT-3.5-Turbo および GPT-4 モデルを Chat Completion API で使用する最も基本的な方法を示しています。 これらのモデルをプログラムで初めて使う場合は、GPT-3.5-Turbo と GPT-4 のクイックスタートから始めることをお勧めします。

Note

Azure OpenAI のドキュメントでは、GPT-3.5-Turbo と GPT-35-Turbo は同じ意味を表します。 OpenAI のモデルの正式な名前は gpt-3.5-turbo です。 Azure OpenAI の場合、Azure 固有の文字制約のため、基になるモデル名は gpt-35-turbo です。

import os
from openai import AzureOpenAI

client = AzureOpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
  api_version = "2024-02-01",
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
)

response = client.chat.completions.create(
    model="gpt-35-turbo", # model = "deployment_name".
    messages=[
        {"role": "system", "content": "Assistant is a large language model trained by OpenAI."},
        {"role": "user", "content": "Who were the founders of Microsoft?"}
    ]
)

#print(response)
print(response.model_dump_json(indent=2))
print(response.choices[0].message.content)
{
  "id": "chatcmpl-8GHoQAJ3zN2DJYqOFiVysrMQJfe1P",
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "message": {
        "content": "Microsoft was founded by Bill Gates and Paul Allen. They established the company on April 4, 1975. Bill Gates served as the CEO of Microsoft until 2000 and later as Chairman and Chief Software Architect until his retirement in 2008, while Paul Allen left the company in 1983 but remained on the board of directors until 2000.",
        "role": "assistant",
        "function_call": null
      },
      "content_filter_results": {
        "hate": {
          "filtered": false,
          "severity": "safe"
        },
        "self_harm": {
          "filtered": false,
          "severity": "safe"
        },
        "sexual": {
          "filtered": false,
          "severity": "safe"
        },
        "violence": {
          "filtered": false,
          "severity": "safe"
        }
      }
    }
  ],
  "created": 1698892410,
  "model": "gpt-35-turbo",
  "object": "chat.completion",
  "usage": {
    "completion_tokens": 73,
    "prompt_tokens": 29,
    "total_tokens": 102
  },
  "prompt_filter_results": [
    {
      "prompt_index": 0,
      "content_filter_results": {
        "hate": {
          "filtered": false,
          "severity": "safe"
        },
        "self_harm": {
          "filtered": false,
          "severity": "safe"
        },
        "sexual": {
          "filtered": false,
          "severity": "safe"
        },
        "violence": {
          "filtered": false,
          "severity": "safe"
        }
      }
    }
  ]
}
Microsoft was founded by Bill Gates and Paul Allen. They established the company on April 4, 1975. Bill Gates served as the CEO of Microsoft until 2000 and later as Chairman and Chief Software Architect until his retirement in 2008, while Paul Allen left the company in 1983 but remained on the board of directors until 2000.

Note

新しい GPT-35-Turbo および GPT-4 モデルでは、logprobsbest_ofecho のパラメーターは使用できません。 これらのパラメーターのいずれかを設定すると、エラーが発生します。

すべての応答には finish_reason が含まれます。 finish_reason の有効な値は次のとおりです。

  • stop: API から完全なモデル出力が返されました。
  • length: max_tokens パラメーターまたはトークンの制限により、モデルの出力が不完全です。
  • content_filter: コンテンツ フィルターからのフラグによりコンテンツが省略されました。
  • null: API 応答がまだ進行中であるか不完全です。

max_tokens を、300 や 500 など、通常より少し高い値に設定することを検討してください。 高い値にすると、メッセージの末尾に達する前にモデルがテキストの生成を停止することがありません。

モデルのバージョン管理

Note

バージョン gpt-35-turbo は、OpenAI の gpt-3.5-turbo モデルと同等です。

以前の GPT-3 および GPT-3.5 モデルとは異なり、gpt-35-turbo モデル、および gpt-4gpt-4-32k モデルも引き続き更新されます。 これらのモデルのデプロイを作成する場合は、モデル バージョンも指定する必要があります。

これらのモデルで、モデルの提供終了日がいつになるかは、モデル ページで確認できます。

Chat Completion API を操作する

GPT-35-Turbo および GPT-4 モデルは、会話として書式設定された入力を受け入れるように OpenAI によってトレーニングされました。 messages パラメータは、ロール別に整理された会話を含むメッセージ オブジェクトの配列を受け取ります。 Python API を使用する場合は、ディクショナリの一覧が使用されます。

基本的なチャット入力候補の形式は次のとおりです。

{"role": "system", "content": "Provide some context and/or instructions to the model"},
{"role": "user", "content": "The users messages goes here"}

1 つの回答例の後に質問が続く会話は次のようになります。

{"role": "system", "content": "Provide some context and/or instructions to the model."},
{"role": "user", "content": "Example question goes here."},
{"role": "assistant", "content": "Example answer goes here."},
{"role": "user", "content": "First question/message for the model to actually respond to."}

システム ロール

システム ロールは、システム メッセージとも呼ばれ、配列の先頭に含まれます。 このメッセージは、モデルに最初の指示を与えます。 システム ロールには、次のようなさまざまな情報を指定できます。

  • アシスタントの簡単な説明。
  • アシスタントの性格的な特性。
  • アシスタントに従ってもらいたい手順またはルール。
  • FAQ からの関連する質問など、モデルに必要なデータまたは情報。

ユース ケースに合わせてシステム ロールをカスタマイズすることも、基本的な指示を含めることもできます。 システム ロールまたはメッセージは省略可能ですが、最適な結果を得るために、少なくとも基本的なものを含めることをお勧めします。

Messages (メッセージ)

システム ロールの後に、userassistant の間の一連のメッセージを含めることができます。

 {"role": "user", "content": "What is thermodynamics?"}

モデルからの応答をトリガーするには、アシスタントが応答する番であることを示すユーザー メッセージで終了します。 また、少数ショット学習を行う方法として、ユーザーとアシスタントの間の一連のサンプル メッセージを含めることもできます。

メッセージ プロンプトの例

次のセクションでは、GPT-35-Turbo および GPT-4 モデルで使用できるさまざまなスタイルのプロンプトの例を示します。 これらの例は開始点にすぎません。 さまざまなプロンプトを試して、独自のユース ケースの動作をカスタマイズできます。

基本的な例

GPT-35-Turbo モデルを chat.openai.com と同様に動作させる場合は、Assistant is a large language model trained by OpenAI. のような基本的なシステム メッセージを使用できます

{"role": "system", "content": "Assistant is a large language model trained by OpenAI."},
{"role": "user", "content": "Who were the founders of Microsoft?"}

指示の例

一部のシナリオでは、モデルに追加の指示を与えて、モデルが実行できる内容に対するガードレールを定義できます。

{"role": "system", "content": "Assistant is an intelligent chatbot designed to help users answer their tax related questions.
Instructions: 
- Only answer questions related to taxes. 
- If you're unsure of an answer, you can say "I don't know" or "I'm not sure" and recommend users go to the IRS website for more information. "},
{"role": "user", "content": "When are my taxes due?"}

基礎知識のデータを使用する

関連するデータや情報をシステム メッセージに含めて、モデルに会話の追加コンテキストを与えることもできます。 含める必要がある情報の量が少ない場合は、システム メッセージの中にハード コーディングすることができます。 モデルで認識する必要があるデータの量が多い場合は、埋め込み、または Azure AI 検索などの製品を使用して、クエリ時に最も関連性の高い情報を取得できます。

{"role": "system", "content": "Assistant is an intelligent chatbot designed to help users answer technical questions about Azure OpenAI Serivce. Only answer questions using the context below and if you're not sure of an answer, you can say 'I don't know'.

Context:
- Azure OpenAI Service provides REST API access to OpenAI's powerful language models including the GPT-3, Codex and Embeddings model series.
- Azure OpenAI Service gives customers advanced language AI with OpenAI GPT-3, Codex, and DALL-E models with the security and enterprise promise of Azure. Azure OpenAI co-develops the APIs with OpenAI, ensuring compatibility and a smooth transition from one to the other.
- At Microsoft, we're committed to the advancement of AI driven by principles that put people first. Microsoft has made significant investments to help guard against abuse and unintended harm, which includes requiring applicants to show well-defined use cases, incorporating Microsoft’s principles for responsible AI use."
},
{"role": "user", "content": "What is Azure OpenAI Service?"}

チャット入力候補を使用した少数ショット学習

モデルに少数ショットの例を与えることもできます。 少数ショット学習の手法は、プロンプト形式が新しくなったため、若干変更されています。 ユーザーとアシスタントの間の一連のメッセージを、少数ショットの例としてプロンプトに含められるようになりました。 これらの例を使用すると、一般的な質問に対する回答をシード処理してモデルを事前処理したり、特定の動作をモデルに教えたりすることができます。

この例は、 GPT-35-Turbo および GPT-4 で少数ショット学習を使用する方法を示しています。 さまざまな手法を試して、ご自身のユース ケースに最適なものを確認できます。

{"role": "system", "content": "Assistant is an intelligent chatbot designed to help users answer their tax related questions. "},
{"role": "user", "content": "When do I need to file my taxes by?"},
{"role": "assistant", "content": "In 2023, you will need to file your taxes by April 18th. The date falls after the usual April 15th deadline because April 15th falls on a Saturday in 2023. For more details, see https://www.irs.gov/filing/individuals/when-to-file."},
{"role": "user", "content": "How can I check the status of my tax refund?"},
{"role": "assistant", "content": "You can check the status of your tax refund by visiting https://www.irs.gov/refunds"}

チャット以外のシナリオにチャット入力候補を使用する

Chat Completion API は、マルチターン会話を操作するように設計されていますが、チャット以外のシナリオにも適しています。

たとえば、エンティティ抽出シナリオでは、次のプロンプトを使用できます。

{"role": "system", "content": "You are an assistant designed to extract entities from text. Users will paste in a string of text and you will respond with entities you've extracted from the text as a JSON object. Here's an example of your output format:
{
   "name": "",
   "company": "",
   "phone_number": ""
}"},
{"role": "user", "content": "Hello. My name is Robert Smith. I'm calling from Contoso Insurance, Delaware. My colleague mentioned that you are interested in learning about our comprehensive benefits policy. Could you give me a call back at (555) 346-9322 when you get a chance so we can go over the benefits?"}

基本的な会話ループの作成

これまでの例では、Chat Completion API と対話するための基本的なメカニズムを示してきました。 この例では、次のアクションを実行する会話ループを作成する方法を示します。

  • コンソール入力を継続的に受け取り、それをメッセージ リストの一部として、ユーザー ロール コンテンツとして適切に書式設定する。
  • コンソールに出力され、書式設定され、アシスタント ロール コンテンツとして messages リストに追加された応答を出力する。

新しく質問されるたびに、これまでの会話の実行中のトランスクリプトが最新の質問とともに送信されます。 モデルにはメモリがないため、新しい質問ごとに更新されたトランスクリプトを送信する必要があります。そうしないと、モデルは以前の質問と回答のコンテキストを失います。

import os
from openai import AzureOpenAI

client = AzureOpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
  api_version = "2024-02-01",
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")  # Your Azure OpenAI resource's endpoint value.
)

conversation=[{"role": "system", "content": "You are a helpful assistant."}]

while True:
    user_input = input("Q:")      
    conversation.append({"role": "user", "content": user_input})

    response = client.chat.completions.create(
        model="gpt-35-turbo", # model = "deployment_name".
        messages=conversation
    )

    conversation.append({"role": "assistant", "content": response.choices[0].message.content})
    print("\n" + response.choices[0].message.content + "\n")

上記のコードを実行すると、空白のコンソール ウィンドウが表示されます。 ウィンドウに最初の質問を入力し、Enter キーを選択します。 応答が返されたら、プロセスを繰り返し、質問を続けることができます。

会話を管理する

前の例は、モデルのトークン制限に達するまで実行されます。 質問され、回答が受信されるたびに、messages リストのサイズが大きくなります。 gpt-35-turbo でのトークンの上限数は 4,096 です。 gpt-4gpt-4-32k のトークン制限はそれぞれ 8,192 と 32,768 です。 これらの制限には、送信された message リストとモデル応答の両方からのトークン数が含まれます。 max_tokens パラメーターの値と組み合わせた messages リスト内のトークンの数が、これらの制限を超えないようにする必要があります。そうしないと、エラーが発生します。

ご自身の責任で、プロンプトと入力候補がトークンの制限内に収まるようにしてください。 会話が長い場合は、トークン数を追跡して、この制限内に収まるプロンプトのみをモデルに送信する必要があります。

Note

すべてのモデルに関する文書化された入力トークンの制限を超えることができる場合でも、その制限内に抑えることを強くお勧めします。

次のコード サンプルは、OpenAI の tiktoken ライブラリを使用して 4,096 トークン数を処理する手法を使用した単純なチャット ループの例を示しています。

このコードでは tiktoken 0.5.1を使用します。 それ以前のバージョンがある場合は、pip install tiktoken --upgrade を実行します。

import tiktoken
import os
from openai import AzureOpenAI

client = AzureOpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
  api_version = "2024-02-01",
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")  # Your Azure OpenAI resource's endpoint value.
)

system_message = {"role": "system", "content": "You are a helpful assistant."}
max_response_tokens = 250
token_limit = 4096
conversation = []
conversation.append(system_message)

def num_tokens_from_messages(messages, model="gpt-3.5-turbo-0613"):
    """Return the number of tokens used by a list of messages."""
    try:
        encoding = tiktoken.encoding_for_model(model)
    except KeyError:
        print("Warning: model not found. Using cl100k_base encoding.")
        encoding = tiktoken.get_encoding("cl100k_base")
    if model in {
        "gpt-3.5-turbo-0613",
        "gpt-3.5-turbo-16k-0613",
        "gpt-4-0314",
        "gpt-4-32k-0314",
        "gpt-4-0613",
        "gpt-4-32k-0613",
        }:
        tokens_per_message = 3
        tokens_per_name = 1
    elif model == "gpt-3.5-turbo-0301":
        tokens_per_message = 4  # every message follows <|start|>{role/name}\n{content}<|end|>\n
        tokens_per_name = -1  # if there's a name, the role is omitted
    elif "gpt-3.5-turbo" in model:
        print("Warning: gpt-3.5-turbo may update over time. Returning num tokens assuming gpt-3.5-turbo-0613.")
        return num_tokens_from_messages(messages, model="gpt-3.5-turbo-0613")
    elif "gpt-4" in model:
        print("Warning: gpt-4 may update over time. Returning num tokens assuming gpt-4-0613.")
        return num_tokens_from_messages(messages, model="gpt-4-0613")
    else:
        raise NotImplementedError(
            f"""num_tokens_from_messages() is not implemented for model {model}. See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens."""
        )
    num_tokens = 0
    for message in messages:
        num_tokens += tokens_per_message
        for key, value in message.items():
            num_tokens += len(encoding.encode(value))
            if key == "name":
                num_tokens += tokens_per_name
    num_tokens += 3  # every reply is primed with <|start|>assistant<|message|>
    return num_tokens
while True:
    user_input = input("Q:")      
    conversation.append({"role": "user", "content": user_input})
    conv_history_tokens = num_tokens_from_messages(conversation)

    while conv_history_tokens + max_response_tokens >= token_limit:
        del conversation[1] 
        conv_history_tokens = num_tokens_from_messages(conversation)

    response = client.chat.completions.create(
        model="gpt-35-turbo", # model = "deployment_name".
        messages=conversation,
        temperature=0.7,
        max_tokens=max_response_tokens
    )


    conversation.append({"role": "assistant", "content": response.choices[0].message.content})
    print("\n" + response.choices[0].message.content + "\n")

この例では、そのトークン数に達すると、会話トランスクリプト内の最も古いメッセージが削除されます。 効率のために、pop() の代わりに del が使用されます。 インデックス 1 から始めて、常にシステム メッセージを保持し、ユーザーまたはアシスタント メッセージのみを削除します。 会話を管理するこの方法は、時間が経つにつれて、モデルが会話の前半部分のコンテキストを徐々に失うため、会話の品質が低下するおそれがあります。

別の方法として、会話の継続時間をトークンの最大長または特定のターン数に制限します。 トークンの上限に達すると、会話の続行を許可した場合、モデルのコンテキストが失われます。 ユーザーに、新しい会話を開始し、メッセージの一覧をクリアして、使用可能な完全なトークン制限を使用して新しい会話を開始するように、求めることができます。

前に示したコードのトークン カウント部分は、OpenAI のクックブックの例の 1 つの簡略化されたバージョンです。

トラブルシューティング

トラブルシューティングのヒントをこちらに示します。

チャット入力候補エンドポイントでは ChatML 構文を使用しない

一部のお客様が、チャット入力候補エンドポイントと新しいモデルでレガシ ChatML 構文を使用しようとしています。 ChatML は、gpt-35-turbo version 0301 モデルのレガシの入力候補エンドポイントでのみ動作するプレビュー機能でした。 このモデルは廃止される予定です。 新しいモデルとチャット完了エンドポイントで ChatML 構文を使用しようとすると、エラーやモデルの予期しない応答動作が発生する場合があります。 この使用方法はお勧めしません。

エラー 原因 解決策
400 - "入力に特殊なトークンが含まれているため出力を生成できませんでした"。 プロンプトに、モデルまたはエンドポイントで認識またはサポートされていないレガシ ChatML トークンが含まれています。 プロンプトまたはメッセージ配列にレガシ ChatML トークンが含まれていないことを確認します。 レガシ モデルからアップグレードする場合は、API 要求をモデルに送信する前に、すべての特殊なトークンを除外してください。

次のステップ