[ChatGPT] Open AI API を Node.js x TypeScript で試してみた

2023.03.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!DA(データアナリティクス)事業本部 サービスソリューション部の大高です。

最近人気のChatGPTですが、OpenAI APIを利用することでも触ることができそうなので、今回は以下の組み合わせで試してみました。

  • Node.js
  • TypeScript

なお、アカウントの作成手順については、このエントリでは省略します。

プロジェクトの作成

まずは、以下を参考に Node.js & TypeScript のプロジェクトを作成していきます。

まずはGitHub上で.gitignoreNodeとしたプロジェクトを作成し、作成した空のリポジトリをCloneしてきて、以下で初期化していきます。

$ yarn init -y
$ yarn add --dev typescript @types/node ts-node nodemon
$ npx tsc --init --rootDir src --outDir lib --esModuleInterop --resolveJsonModule --lib es6,dom --module commonjs

ここまで出来たらpackage.jsonに以下を追加します。

package.json

  "scripts": {
    "start": "npm run build:live",
    "build": "tsc -p .",
    "build:live": "nodemon --watch 'src/**/*.ts' --exec \"ts-node\" src/index.ts"
  },

最後に、以下のコードを試すファイルを作成します。

src/index.ts

const msg: string = "Hello";
console.log(msg);

ここまで出来たら、想定どおりに動くか確認しておきます。

$ yarn start
yarn run v1.22.19
$ npm run build:live

> hello-openai-api@1.0.0 build:live
> nodemon --watch 'src/**/*.ts' --exec "ts-node" src/index.ts

[nodemon] 2.0.21
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): src/**/*.ts
[nodemon] watching extensions: ts,json
[nodemon] starting `ts-node src/index.ts`
Hello

良さそうですね。後でこのsrc/index.tsを利用してOpenAI APIを試していきます。

API Keyの発行

OpenAIのアカウントにログインしたら、下記URLにアクセスしてAPI Keyを発行します。

発行したAPI Keyは後で利用するので、先程作成したプロジェクトに.envファイルを追加して記述しておきます。

.env

OPENAI_API_KEY=sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

また、環境変数を利用したいのでdotenvも導入しておきます。

$ yarn add dotenv

なお、GitHub上で.gitignoreNodeとしたプロジェクトを作成していれば既に設定されているはずですが、.gitignore.envの設定がないとGit上に.envファイルがアップロードされてしまうので注意してください。

OpenAI APIを試してみる

では早速試してみたいと思います。

最初に必要なパッケージを追加しておきます。

$ yarn add openai

先程作成したsrc/index.tsを以下のようなコードにしてみます。

src/index.ts

import { Configuration, OpenAIApi } from "openai";
import * as dotenv from "dotenv";
dotenv.config();

const configuration = new Configuration({
  apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);

export async function ask(content: string, model = "gpt-3.5-turbo-0301") {
  const response = await openai.createChatCompletion({
    model: model,
    messages: [{ role: "user", content: content }],
  });

  const answer = response.data.choices[0].message?.content;
  console.log(answer);
}

const question = "Final Fantasy XIV の都市「ウルダハ」について教えてください";
ask(question);

まずはじめにdotenvを利用してAPIキーを取得してOpenAI APIの設定を行っています。

また、ask関数では、引数で指定した文言に答えるように、APIを呼び出して結果を表示させるようにしています。最後にこの関数を呼び出して終わりです。

早速実行してみます。

$ yarn start
yarn run v1.22.19
$ npm run build:live

> hello-openai-api@1.0.0 build:live
> nodemon --watch 'src/**/*.ts' --exec "ts-node" src/index.ts

[nodemon] 2.0.21
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): src/**/*.ts
[nodemon] watching extensions: ts,json
[nodemon] starting `ts-node src/index.ts`


ウルダハは、ファイナルファンタジーXIVの都市の1つで、砂漠の中にある商業都市です。この都市は、砂漠地帯に位置しているため、暑さに耐えるための特殊な建築技術を採用しています。 

ウルダハは、商業の中心地であり、多くの商店や工房、市場、ナイトクラブなどがあります。街全体は、サファイアの道、ルビーの道、アメジストの道など、宝石にちなんだ名前の通りに分かれています。

ウルダハには、3つの大きな区域があります。1つは、宿屋や装備品商人などの施設や場所がある小さな広場の「サファイアの道」区域です。もう1つは、闇市や冒険者ギルドなどがある「ルビーの道」区域です。最後に、「アメジストの道」区域には、グランドカンパニーがあります。

最後に、ウルダハには、アリーゼーという大きな競技場があります。アリーゼーは、闘技場としても使われ、アイテムを入手するための特別なトーナメントも開催されています。
[nodemon] clean exit - waiting for changes before restart

回答が返ってきました!

(いまからFF14プレイヤーにしか分からないことを話しますが、) 「宝石にちなんだ名前の通りに分かれています」 が凄いですね。「サファイアの道」、「ルビーの道」は、それぞれ「サファイアアベニュー」、「ルビーロード」のことを言いたいんだと思います。また、「アメジストの道」は「エメラルドアベニュー」を言いたいようです。

「闘技場」は「コロセウム」ですね。唐突に「アリゼー」らしき単語が出てきていますが、だいたい合っています。

まとめ

以上、Open AI API を Node.js で試してみました。

新しいことを試してみるのはワクワクしますね!まずは使い方が何となくつかめてきたので、色々試してみたいと思います。

どなたかのお役に立てば幸いです。それでは!

参考