ChatGPT APIに関するQ&A
今さらながらChatGPTのAPIを試してみて、分かりにくかった点についてまとめます。
先に結論
-
gpt-3.5-turbo
とgpt-3.5-turbo-0301
って何が違うの?
→ 一緒 - GPT-4モデルは使えるのか
→ 2023/03/19時点では誰でもは使えない。 waitlist で予約した人から先行で使える。 - なぜAPIリクエスト時の例に
role: "assistant"
が含まれているの?
→ これまでの会話の文脈を理解させるため
そもそもChatGPTのAPIとは
OpenAIのAPIのうち、2023年3月1日に公開された「Chat completions」機能を指します。
(これまでも似たようなことを実現できたが、より低コスト・高速になった)
概要や利用方法については以下サイトが参考になりました。
APIリクエストの例
例えば、Node.jsでAPIを利用する場合、最小のコードは以下のようになります。
import { Configuration, OpenAIApi } from "openai";
const openai = new OpenAIApi(new Configuration({ apiKey: "<<YOUR API KEY>>" }));
async function ask(content) {
const response = await openai.createChatCompletion({
model: "gpt-3.5-turbo",
messages: [{ role: "user", content }],
});
console.log(response.data);
}
ask("大谷選手について教えて");
実行結果
{
id: 'chatcmpl-6vj...',
object: 'chat.completion',
created: 1679218202,
model: 'gpt-3.5-turbo-0301',
usage: { prompt_tokens: 21, completion_tokens: 380, total_tokens: 401 },
choices: [
{
message: {
role: 'assistant',
content: '大谷翔平選手は、1994年7月5日生まれの日本のプロ野球選手で...(省略)'
},
finish_reason: 'stop',
index: 0
}
]
}
gpt-3.5-turbo
と gpt-3.5-turbo-0301
の違いは?
modelには gpt-3.5-turbo
と gpt-3.5-turbo-0301
が指定できます。 gpt-3.5-turbo-0301
は、3月1日時点の gpt-3.5-turbo
のスナップショットであり、今は gpt-3.5-turbo
と指定すると gpt-3.5-turbo-0301
が使われる、ということのようです。
つまり、modelには gpt-3.5-turbo
を指定しておけば問題なさそうです。
GPT-4は使えるの?
GPT-4モデル は2023/03/19時点では Limited beta であり、誰でもは使えないようです。
model: "gpt-4"
と指定すると以下のようなエラーが返ってきました。
error: {
message: 'The model: `gpt-4` does not exist',
type: 'invalid_request_error',
param: null,
code: 'model_not_found'
}
waitlist に登録していれば、キャパシティができた時に使えるようになるようなので、登録してメールを待ちましょう。
messagesのroleは何?
roleに指定するのは system
assistant
user
の3つがあります。
system
system
は、AIアシスタントの設定を記述でき、以下のようにAIに人格を与えるような面白いことができるようです。
(※gpt-3.5-turbo-0301 時点ではこの設定を重視してくれない場合もあるようです)
assistantとuser
assistant
はAIからの回答、 user
はユーザーからの発話であり、基本的には user
として聞きたいことを送る形になります。
ではなぜ assistant
というものがあるかというと、AIからの返答を含むこれまでの会話を全て送ることで、その文脈を踏まえて回答してもらえるようにするためです。
文脈について
例えば、上記のコード例で以下のように関連する質問を投げると、2つ目の質問には答えられません。
ask("大谷選手について教えて").then(() => ask("彼の身長は?"));
'大谷翔平選手は、1994年7月5日生まれの日本のプロ野球選手で...(省略)'
'申し訳ありませんが、この質問に対する具体的な回答を提供することはできません。何か具体的な情報や文脈を提供していただけますか?'
そこで、以下のようにそれまでの会話を保存して送るようにすると、
const messages = [];
async function ask(content) {
messages.push({ role: "user", content });
const response = await openai.createChatCompletion({
model: "gpt-3.5-turbo",
messages,
});
const answer = response.data.choices[0].message;
messages.push(answer);
console.log(response.data);
}
文脈を踏まえて回答してくれるようになります。
ask("大谷選手について教えて").then(() => ask("彼の身長は?"));
'大谷翔平選手は、1994年7月5日生まれの日本のプロ野球選手で...(省略)'
'大谷翔平選手の身長は191cmです。'
注意点
ただし、これまでの会話を送ると、その分入力トークン数が増えていき、料金が多くかかるため、注意が必要です。
これまでの会話を送らなかった時の "彼の身長は?" の質問の使用トークン数
usage: { prompt_tokens: 15, completion_tokens: 63, total_tokens: 78 },
これまでの会話を送った時の "彼の身長は?" の質問の使用トークン数
usage: { prompt_tokens: 314, completion_tokens: 20, total_tokens: 334 },
トークン・利用料金についての参考
あとがき
まだ自分もこれからAPIを使い始めるところなので、間違いなどがありましたらご指摘いただけますと幸いです🙏
余談ですが、大谷選手の身長についてGPT-3.5で聞くと、191cmと言ったり、188cmと言ったりと不正確でした(Wikiによると実際は193cm)。
ただ、GPT-4で試すと「約193センチメートル(6フィート4インチ)」と正確に答えてくれたので、本当に進歩がすごいですね。
Discussion