Closed6

OpenAI APIを使えるようにするところまで(Chat API、Node.js)

A KidA Kid

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 に入力文字列を与える。

A KidA Kid

Chat GPTと同じようなことをしたいなら Completions API でよさそうだ。

うそ。Completions でもいいけど、チャット的に前の文脈を生かして次の回答をさせたいときは新しい Chat API を使うほうがよさそう。

でもplaygoundだとmode Chatを選んだときにView Codeがまだ見れるようになってないっぽい。
サンプルは後で書く。

A KidA Kid

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 からできそうだけどとりあえず割愛。

A KidA Kid

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の計算問題では赤と青の正方形を組み合わせて面積を表します。このような視覚的なアプローチで掛け算の意味を理解しやすくすることが できます。
A KidA Kid

このリクエストで 56 prompt + 378 completion = 434 tokens だったようだ。
英語で送ればもう少し節約できるのかな。

このスクラップは2023/04/01にクローズされました