ChatGPT GPT-4 APIを使用するのに苦労した話
使用できないことの確認
※この記事は2023年10月16日現在の情報です。今後OpenAIの仕様に依存して同じ手順でも再現しなくなる場合があります。
2023年3月14日にChatGPTのGPT-4がリリースされました。また、OpenAIはChatGPTのAPIを提供しています。そのため、当然ながらGPT-4のAPIも提供されています。
(2023年7月6日) Starting today, all paying API customers have access to GPT-4
Today all existing API developers with a history of successful payments can access the GPT-4 API with 8K context.
と書かれています。私は以下のように支払い設定を行っていたため、GPT-4 APIを利用できると思っていました。
- 支払い設定が終わった状態でplatform.openai.com/account/billing/overviewにアクセスした場合
- 支払い設定が終わっていない状態でplatform.openai.com/account/billing/overviewにアクセスした場合
しかし、実際には使用できませんでした。使用できるかはPlaygroundのModelから確認できます。
使用できない理由
GPT-4 APIのリリースページにはこのように書かれています(再掲)。
Today all existing API developers with a history of successful payments can access the GPT-4 API with 8K context.
この文章の「with a history of successful payments」が重要で、以下のようにChatGPTを結構使用していましたが、Billing Historyには1ドルも請求されていませんでした。
対策
支払い履歴が存在すれば良いのですが、少し使ったくらいでは請求書の「繰越し」項目で割り引かれてしまい支払いがされないようです。おそらく、無料枠があるんでしょうね。その枠がどれくらいなのかわかる方がいれば教えてください🙏
そこで、ChatGPTに大量にアクセスを行い、無理やり支払い履歴を作ります。以下がその割と適当なスクリプトです。DoS対策でよくAPIのエラーが出ますが、気にせず再実行とかしてください。また、今回はDenoを使っていますがcurlでもPythonでもなんでも良いです。Denoがない人はreadTextFileSync
をNodeのやつにするのが一番楽そうです。
type Message = {
role: "user" | "system" | "assistant";
content: string;
};
// CHANGE ME from https://platform.openai.com/account/api-keys
const apiKey = "";
const completeChat = async (messages: Message[]): Promise<Message> => {
const body = JSON.stringify({
messages,
model: "gpt-3.5-turbo",
});
try {
return fetch("https://api.openai.com/v1/chat/completions", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${apiKey}`,
},
body,
})
.then((res) => res.json())
.then((data) => data.choices?.[0]?.message);
} catch (e) {
return {
role: "system",
content: "Error: " + e,
}
}
};
const chat = async (message: string, idx: number) => {
const messages: Message[] = [
{
role: "user",
content: message,
},
];
completeChat(messages).then((res) => {
console.log(`(${idx})-[${new Date().toISOString()}] ${res?.content}`);
});
};
const readJson = (start: number, end: number) => {
// Quiz Dataset
// https://domo-support.domo.com/s/article/360043931814?language=ja
const data = Deno.readTextFileSync("./questions.json");
const json = JSON.parse(data);
return json.slice(start, Math.min(end, json.length));
};
const main = async () => {
const start = 0;
const qSize = 216930;
const batchSize = 1000;
for (let i = Math.floor(start / batchSize); i < qSize / batchSize; i += 1) {
const startIdx = i * batchSize;
const endIdx = startIdx + batchSize;
const json = readJson(startIdx, endIdx).map((d: any) => d.question);
for (let idx = 0; idx < json.length; idx++) {
await chat(json[idx], i * batchSize + idx);
await new Promise((r) => setTimeout(r, 50));
}
}
};
main();
Usageページで逐次、利用量を確認しつつ、私は16.98ドルでスクリプトを止めました。すると、このように支払い履歴が作成されました!ただし、請求書のCREATEDが10月1日になっていますが、実際に私の方から見えるようになったのは10月11日でした。月が変わったらすぐに使えるようになるわけではない、ということに注意してください。
そして、PlaygroundのModelからGPT-4が選択できるようになりました🎉
まとめ
- GPT-4 APIを使用するには、支払い履歴が必要
- 支払い履歴は、請求書の「繰越し」項目で一部割り引かれてしまう
- 支払い履歴が発生するほどのアクセスをしても、月が変わったらすぐに使えるわけではないので注意
Discussion