GPT-3.5-Turbo、GPT-4、GPT-4o モデルを使用する
GPT-3.5-Turbo、GPT-4、GPT-4o シリーズのモデルは、会話インターフェイス用に最適化された言語モデルです。 これらのモデルの動作は、以前の GPT-3 モデルとは異なります。 以前のモデルはテキストインとテキストアウトでした。つまり、プロンプト文字列を受け入れ、プロンプトに追加する入力候補を返しました。 一方、最新のモデルは会話入力、メッセージ出力です。これらのモデルでは、特定のチャットのようなトランスクリプト形式で書式設定された入力が想定されています。 これらは、チャット内のモデルで記述されたメッセージを表す入力候補を返します。 この形式はマルチターン会話専用に設計されていますが、チャット以外のシナリオにも適しています。
この記事では、チャット入力候補モデルの概要について説明します。 最適な結果を得るには、ここで説明する手法を使用します。 以前のモデル シリーズと同じ方法でモデルを操作しようとしないでください。モデルが詳細になり、有用な応答が得られないことがよくあるためです。
チャット入力候補モデルを使用する
次のコード スニペットは、Chat Completion API を使用するモデルを操作する最も基本的な方法を示しています。 これらのモデルをプログラムで初めて使用する場合は、チャット入力候補のクイックスタートから開始することをお勧めします。
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 モデルでは、logprobs
、best_of
、echo
のパラメーターは使用できません。 これらのパラメーターのいずれかを設定すると、エラーが発生します。
すべての応答には 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-4
と gpt-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 (メッセージ)
システム ロールの後に、user
と assistant
の間の一連のメッセージを含めることができます。
{"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-4
と gpt-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}."""
)
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 | 400 - "入力に特殊なトークンが含まれているため出力を生成できませんでした"。 | プロンプトに、モデルまたはエンドポイントで認識またはサポートされていない特殊トークンやレガシ ChatML トークンが含まれています。 プロンプトまたはメッセージ配列にレガシ ChatML トークン/特殊トークンが含まれていないことを確認します。 レガシ モデルからアップグレードする場合は、API 要求をモデルに送信する前に、すべての特殊なトークンを除外してください。 |
モデルで無効な Unicode 出力が生成されたので完了を作成できませんでした
エラー コード | エラー メッセージ | 回避策 |
---|---|---|
500 | 500 - InternalServerError: エラー コード: 500 - {'エラー': {'メッセージ': 'モデルで無効な Unicode 出力が生成されたので完了を作成できませんでした}}。 | プロンプトの温度を 1 未満に減らし、再試行ロジックでクライアントを使用していることを確認することで、これらのエラーの発生を最小限に抑えることができます。 要求を再試行すると、多くの場合、応答が成功します。 |
次のステップ
- Azure OpenAI の詳細についてご覧ください。
- GPT-35-Turbo のクイックスタートを使用して GPT-35-Turbo モデルの使用を開始します。
- その他の例については、Azure OpenAI サンプルの GitHub リポジトリをご覧ください。