ChatGPTモデルのAPIをテスト、発生したエラーやトラブルや指定方法とサンプルコード

2023-03-03ChatGPT レビュー・ほか,OpenAI,ChatGPT

ChatGPTモデルのAPIをテスト、発生したエラーやトラブルや指定方法とサンプルコード

2023年3月1日、OpenAIは対話型AIツール「ChatGPT」のAIモデルを使ったAPIを発表しました。
それまであった言語モデルと比較してAPIの課金ベースが10分の1になっているという事で、今後無料ツールとして活用可能な範囲内まで料金を抑えられるのか判断する事も考えて実装テストをしてみました。

また、次に公開する関連記事では、実際にChatGPTモデルのAPIを使って消費したトークン数から、課金額を算出して紹介する予定ですので、気になる方は少々お待ち下さい。

追記:関連記事を公開しました。

関連:ChatGPTモデルのAPI、使用トークンと従量課金の比較 | ONE NOTES

確認環境
  • ChatGPT PLUS

ChatGPTモデルのAPIを実装するにあたり、発生したエラーやトラブル

ChatGPTモデルのAPIを実装するにあたり、発生したエラーやトラブルの発生例と解決方法をまとめています。

This is a chat model and not supported in the v1/completions endpoint. Did you mean to use v1/chat/completions?

OpenAIのAPIにリクエストしていたコードでモデルを「gpt-3.5-turbo」または「gpt-3.5-turbo-0301」に変更し、最初に発生したエラー。

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

エラーメッセージでは、「gpt-3.5-turbo」「gpt-3.5-turbo-0301」がサポートされていないとの事。

どうやら、リクエストURLが違うようで、答えはメッセージ中にあるように「v1/chat/completions」を使えば良いのかと以下のリクエストURLで試したら成功しました。

https://api.openai.com/v1/chat/completions

messages’ is a required property

次は、「messages’ is a required property」というエラーが発生しました。

messages’ is a required property
メッセージは必須のプロパティです。

どうやら、これまでのAIモデルのAPIと違い、リクエストに「message」というプロパティを新しく持たせる必要があるようです。

JavaScriptでプロパティをオブジェクトで記述している場合は「message」は以下のように記述します。
直接JSONで記述している場合はダブルクオーテーションで記述。

'messages': [{ 'role': 'user', 'content': 'こんにちわ。' }]

また、他のモデルで利用している送信メッセージにあたる「prompt」プロパティは不要となっています。

xxx is not of type 'array’ – 'messages’

JavaScriptから「messages」の一式を入れたJSONデータをPHPに渡してそのまま、リクエストに使った際に発生しました。

そのままではオブジェクト型だったため、PHPにて一旦、配列型に戻す必要がある。
json_decode()で変換する際に「true」を付けないと配列型にならずにエラーになる可能性あり。

$messages = json_decode($messages, true);

配列にしたら、他のオプションと一緒にJSONに戻して送信で成功。

$data = array(
	'model' => 'gpt-3.5-turbo',
	'messages' => $messages,
);

$data = json_encode($data, JSON_UNESCAPED_UNICODE);

返信メッセージが取得できない場合

「prompt」ではなく「message」プロパティを使う事になり、レスポンスデータも一部変わっているようです。

response.choices[0].textに格納されていた返信メッセージはresponse.choices[0].messageに含まれるようになっています。

また、response.choices[0].messageでは、以下のようなデータが含まれていますので、返信メッセージのある場所はresponse.choices[0].message.contentとなります。

response.choices[0].message.content

チャット履歴を参照させる「message」プロパティの指定方法について

今までも、「prompt」プロパティでの送信メッセージに履歴を含ませる事で、それらを参照させて会話を繋げる事が可能になりましたが、ChatGPTモデルでは「message」プロパティを使う事で、機能面、おそらくコスト面でも効率的にチャットの履歴を伝える事が可能となっています。

チャット開始時の送信メッセージも「’role’ : ’user’」を使えば問題ないそうです。

'messages': [
	{ 'role': 'user', 'content': 'こんにちわ。今日は曇っています。' }
]

会話を続ける事に送信時やレスポンスからチャットのログを含めていって、順次追加していきます。
以下は実際にテストしたチャットの履歴で、最初のロールで告げた天気について、会話を重ねたあともAIが把握している事がわかります。

'messages': [
	{ 'role': 'user', 'content': 'こんにちわ。今日は曇っています。' },
	{ 'role': 'assistant', 'content': 'こんにちは。あいにくのお天気で残念ですね。' },
	{ 'role': 'user', 'content': 'そうなんです。でも元気ですよ。' },
	{ 'role': 'assistant', 'content': 'そうであれば良かったですね。今日も一日頑張りましょう!' },
	{ 'role': 'user', 'content': 'はい。そういえば、私は今日の天気について何と言いましたっけ?' },
	{ 'role': 'assistant', 'content': '「今日は曇っています」とおっしゃいましたね。' }
]

実際には、すべてのログを送信するのではなく、APIの利用トークンを抑える為に必要な履歴と選別していく必要があると思います。

JavaScriptでChatGPTモデルのAPIを実装したサンプルコード

今回、ChatGPTモデルの動作テスト用に作成したJavaScriptコードを置いておきます。

※ OpenAIのAPIキーが必要です。(従量課金制)

const chatGpt = () => {

	let xhr = new XMLHttpRequest();
	xhr.open('POST', 'https://api.openai.com/v1/chat/completions')
	xhr.setRequestHeader('Content-Type', 'application/json')
	xhr.setRequestHeader('Authorization', 'Bearer sk-xxxxxxxxxxYOUR-API-KEYxxxxxxxxxxxxxxxxxxxxxxxxxxx')

	xhr.onreadystatechange = function () {
		if (xhr.readyState === XMLHttpRequest.DONE) {
			let response = JSON.parse(xhr.responseText);
			console.log(response);
		}
	}

	xhr.send(JSON.stringify({
		'model': 'gpt-3.5-turbo',
		'messages': [
			{ 'role': 'user', 'content': 'こんにちわ。今日は曇っています。' },
		]
	}))

};

chatGpt()