OpenAI API移行
概要
大規模言語モデル(LLM)の「GPT-4」および「GPT-3.5」ファミリーの最新スナップショットモデル(0613)をリリースされ、旧モデルが非推薦となるアナウンスがあったので、OpenAIのAPIを「Chat Completions API」形式に移行しなければいけないため、その内容をまとめます。
OpenAI API入門
こちらはご参照ください。よりAPI移行の内容が理解しやすくなります。
プロンプトからメッセージへ
API移行のポイントは「プロンプト」から「メッセージ」に変更することです。その内容が理解できれば、OpenAIのAPIを使ったアプリケーション開発によい精度を得ることになります。
用語理解 : Chat Completions APIとCompletions API
OpenAIのAPIにはChat Completions APIとCompletions APIという2つの主要なタイプがあります。
Chat Completions API
APIのエンドポイント : https://api.openai.com/v1/chat/completions
Request Bodyの設定項目:messages (メッセージ)
一連の対話を扱うように設計されています。つまり、一つのプロンプトだけでなく、一連のメッセージを入力として受け取り、それらに基づいて応答を生成します。
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "system", "content": "あなたはジャーナリストです。"},
{"role": "user", "content": "OpenAI社について説明してください。"}
]
)
Completions API
APIのエンドポイント : https://api.openai.com/v1/completions
Request Bodyの設定項目:prompt (プロンプト)
一つのプロンプトから始まり、それに対する一つの応答を生成するように設計されています。つまり、ユーザーが何らかの入力を提供し、APIがその入力に基づいて何らかの完結したテキストを生成します。
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
openai.Completion.create(
model="text-davinci-003",
prompt="OpenAI社について説明してください。"
)
手順1. プロンプト内容をメッセージ形式に変更
Completions APIの一つプロンプトに対してUserロール定義のメッセージ形式に変更します。
Userロールの定義意味についてはここをご参照ください。
'prompt' : 'OpenAI社について説明してください。'
↓
'messages': [{'role':'user', 'content':'OpenAI社について説明してください。'}]
手順2. Systemロール定義追加
Systemロール定義を追加して会話中のモデルの動作をガイドできるようにします。
OpenAIの自然言語モデルの最新バージョン0613では(ここ参考)システムメッセージに操縦性が強化されたので、システムメッセージに示された指示に従うようになったことです。
'messages': [{'role':'user', 'content':'OpenAI社について説明してください。'}]
↓
'messages': [
{'role':'system', 'content':'あなたはジャーナリストです。'},
{'role':'user', 'content':'OpenAI社について説明してください。'}
]
手順3. Assistantロール定義追加とリスト完成
Assistantロール定義を追加して文脈を踏まえて回答できるようにします。そしてメッセージはリストに表示される順序で処理されて回答されます。
'messages': [
{'role':'system', 'content':'あなたはジャーナリストです。'},
{'role':'user', 'content':'OpenAI社について説明してください。'}
]
↓
'messages': [
{'role':'system', 'content':'あなたはジャーナリストです。'},
{'role':'user', 'content':'OpenAI社について説明してください。'},
{'role':'assistant', 'content':'イーロン・マスクさんはOpenAIを辞めた。'}
]
完成コード
Python
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "system", "content": "あなたはジャーナリストです。"},
{"role": "user", "content": "OpenAI社について説明してください。"},
{"role": "assistant", "content": "イーロン・マスクさんはOpenAIを辞めた。"}
]
)
curl
curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-4",
"messages": [{"role": "system", "content": "あなたはジャーナリストです。"},{"role": "user", "content": "OpenAI社について説明してください。"},{"role": "assistant", "content": "イーロン・マスクさんはOpenAIを辞めた。"}]
}'
PowerShell (Windows)
$body = @{
"model" = "gpt-4"
"messages" = @(
@{
"role" = "system"
"content" = "あなたはジャーナリストです。"
},
@{
"role" = "user"
"content" = "OpenAI社について説明してください。"
},
@{
"role" = "assistant"
"content" = "イーロン・マスクさんはOpenAIを辞めた。"
}
)
} | ConvertTo-Json
Invoke-WebRequest `
-Headers @{"Content-type"="application/json"; "Authorization"="Bearer " + $env:OPENAI_API_KEY} `
-Method Post `
-Body $body `
-Uri 'https://api.openai.com/v1/chat/completions'
Azure OpenAI サービス向け
GPT-35-Turbo および GPT-4 ファミリーモデルを操作するには「Chat Completion API」と「ChatML」の二つオプションがありますが、こちらではOpenAI APIと同じように使える「Chat Completion API」で紹介します。
Python
import os
import openai
openai.api_type = "azure"
openai.api_base = "https://<リージョン名>.api.cognitive.microsoft.com/"
openai.api_version = "2023-05-15"
openai.api_key = os.getenv("OPENAI_API_KEY")
openai.ChatCompletion.create(
engine="<デプロイモデル名>",
messages=[
{"role": "system", "content": "あなたはジャーナリストです。"},
{"role": "user", "content": "OpenAI社について説明してください。"},
{"role": "assistant", "content": "イーロン・マスクさんはOpenAIを辞めた。"}
]
)
curl
curl https://<リージョン名>.api.cognitive.microsoft.com/openai/deployments/<デプロイモデル名>/chat/completions?api-version=2023-05-15 \
-H "Content-Type: application/json" \
-H "api-key: $OPENAI_API_KEY" \
-d '{
"messages": [{"role": "system", "content": "あなたはジャーナリストです。"},{"role": "user", "content": "OpenAI社について説明してください。"},{"role": "assistant", "content": "イーロン・マスクさんはOpenAIを辞めた。"}]
}'
PowerShell (Windows)
$body = @{
"messages" = @(
@{
"role" = "system"
"content" = "あなたはジャーナリストです。"
},
@{
"role" = "user"
"content" = "OpenAI社について説明してください。"
},
@{
"role" = "assistant"
"content" = "イーロン・マスクさんはOpenAIを辞めた。"
}
)
} | ConvertTo-Json
Invoke-WebRequest `
-Headers @{"Content-type"="application/json"; "api-key"=$env:OPENAI_API_KEY} `
-Method Post `
-Body $body `
-Uri 'https://<リージョン名>.api.cognitive.microsoft.com/openai/deployments/<デプロイモデル名>/chat/completions?api-version=2023-05-15'