OpenAI APIを使えるようにするところまで(Chat API、Node.js)
準備
- OpenAIのアカウントを作成
- gpt-4 のモデルを使うためには現時点では waitlist に登録して待つ必要あり
API Keyの作成
Keyを作っておく。
※作成したときに表示されたあとは二度と表示されないので控えておく
APIの使い方サンプル
Chat GPTと同じようなことをしたいなら Completions API でよさそうだ。
playgroundのページで「View code」をクリックすればコードが見れる。
node.js だと以下のようなコード。
const { Configuration, OpenAIApi } = require("openai");
const configuration = new Configuration({
apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);
const response = await openai.createCompletion({
model: "text-davinci-003",
prompt: "",
temperature: 0.7,
max_tokens: 256,
top_p: 1,
frequency_penalty: 0,
presence_penalty: 0,
});
とりあえず試すだけなら apiKey
のところは直書きしてもいい。
process.env.OPENAI_API_KEY
から読み込ませるなら .env を使う。後述。
prompt
に入力文字列を与える。
Chat GPTと同じようなことをしたいなら Completions API でよさそうだ。
うそ。Completions でもいいけど、チャット的に前の文脈を生かして次の回答をさせたいときは新しい Chat API を使うほうがよさそう。
でもplaygoundだとmode Chatを選んだときにView Codeがまだ見れるようになってないっぽい。
サンプルは後で書く。
Chat API リクエストパラメータ
公式ドキュメント、または以下のページがわかりやすい。
とりあえず気にするとこだけ。
- model*: どのモデルを使うか。GPT-4 がまだ使えるようにならないので
gpt-3.5-turbo
にしておく - messages*: role=system で前提条件を与えたうえで、role=user(自分の質問)、role=assistant(回答)を繰り返す形で文脈として渡す感じ
- n: 複数回答をいっぺんにもらいたいときに数を指定する感じか。ふつうは1でいいかな
- temperature, frequency_penalty, top_p: 最適値がわからないけどデフォルトのままにしておく
レスポンスの中身
data.choices
に以下のようなオブジェクトの配列として入ってくる。
n=1
なら配列要素数も1になるということか。
{
index: 0,
message: {
role: 'assistant',
content: '\n\nHello there, how may I assist you today?',
},
finish_reason: 'stop'
}
この回答に続けて質問したいときは、この message
をリクエストの messages
に追加して、そのあとに自分の質問を追加して送ることになる。
finish_reason
は、普通に回答された場合は stop
になるっぽい。
max_token
のせいで最後まで書けなかった場合は length
になるのかな。たぶん。
支払い設定
支払いの設定をしなくても、最初に付与される無料トライアル分でAPIを試すことはできる。
無料トライアルの残りは https://platform.openai.com/account/usage で確認できる。
支払いの設定は https://platform.openai.com/account/billing/overview からできそうだけどとりあえず割愛。
node.js x TypeScript での実装サンプル
-
npm init
でプロジェクト作成 -
npm install typescript openai ts-node dotenv
で必要なパッケージインストール -
npx tsc --init
で tsconfig.json をつくる -
.env
ファイルを作って、中にOpenAI API keyを書く
OPENAI_API_KEY=XXXXXXXXXXXXXXXXXXXXXXX
-
index.ts
ファイルを作って、以下のような感じで
import { Configuration, OpenAIApi } from "openai";
import { config } from "dotenv";
config();
const main = async () => {
const configuration = new Configuration({
apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);
const response = await openai.createChatCompletion({
model: "gpt-3.5-turbo",
messages:[
{ role:"system", content: "あなたは小学校の先生です" },
{ role:"user", content:"生徒に効率的に掛け算を覚えさせるアイデアを3つ考えてください" }
]
});
const answer = response.data.choices[0];
console.log(answer.message?.content);
};
main();
-
npx ts-node index.ts
で実行
結果。
1. 数字カードゲーム:生徒に数字カードを配って、それらを使って掛け算をするカードゲームを行います。例えば、一人が「4」と「5」の数字カードを引いた場 合は、「4×5=」と答えを言うことで、カードを得点として獲得できます。
2. 計算リレー:生徒をグループに分けて、掛け算を行う計算リレーをします。最初の生徒は問題を解き、その答えを次の生徒に渡していきます。最後の生徒が答 えを言うまでの間に、一定時間内に何問正確に解答できるかを競い合います。
3. 色や形で区別した教材:掛け算による面積や体積の概念を理解するために、色や形で区別した教材を使います。例えば、2cmの正方形が赤色で、3cmの正方形が 青色だとした場合、2×3の計算問題では赤と青の正方形を組み合わせて面積を表します。このような視覚的なアプローチで掛け算の意味を理解しやすくすることが できます。
このリクエストで 56 prompt + 378 completion = 434 tokens
だったようだ。
英語で送ればもう少し節約できるのかな。