【10分でできる】Node.jsを使ってChatGPTのAPIを使用したチャットCLIを作成

今日の記事で紹介するChatGPTのAPIキーの取得の仕方はこちらの記事を参考にしてください。

完成したコードはGitHubのリポジトリから見てください。

https://github.com/DanNakatoshi/Node-ChatGPT-CLI

初めに

この記事では、Node.jsとChatGPTを使用してチャットアプリケーションを構築する基本的な方法を紹介します。Node.jsのCLIアプリとして動作するチャットアプリケーションを作成し、OpenAIのChatGPTを活用してAIとの対話を実現します。このチュートリアルに従えば、誰でも簡単に始めることができます。

このサンプルコードを利用して、メールの起案や他の文章作成、ドキュメントに関する質問への回答、対話エージェントの作成、ソフトウェアに自然言語インターフェースを与えること、さまざまな科目でのチュータリング、言語の翻訳など、様々な活用方法があります。

この記事では、チャットの完成機能を使ってチャットアプリケーションを構築する基本を学びます。プログラマーの方でも簡単に始められるような内容です。このチュートリアルに従って進めれば、自分でもできると思えるようになるでしょう。

このチュートリアルは、gpt-3.5-turboモデルをベースにしています。

前提条件として、JavaScript、CSS、Node.jsの基本的な知識が必要です。

また、chatGPTがホストされているOpenAIプラットフォームのアカウントも必要です。アカウントは無料で作成できますので、こちらから作成してください。

Node.jsを使用してCLIチャットAIアプリを作成する方法について、以下に焦点を当てて説明します。

まず、プロジェクトのためのディレクトリを作成します:

mkdir nodejs-chatgpt-app

#作成したディレクトリに移動します
cd nodejs-chatgpt-app

#プロジェクトを作成します
npm init -y

これにより、プロジェクトの詳細を追跡するためにpackage.jsonファイルが作成されます。

以下のコードをファイルに追加します:

"type": "module"


#結果
{
  "name": "nodejs-chatgpt-app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "type": "module",
  "keywords": [],
  "author": "You",
  "license": "MIT"
}

これにより、ES6モジュールのimport文を使用することができるようになります。

次のコマンドを使用してOpenAIをインストールします:

npm i openai

メインのコードが実行できるファァイルを作成します。ファイルの名前はindex.jsとしますt:

touch index.js


OpenAIモジュールからConfigurationとOpenAIApiをimportし、readlineモジュールからreadlineをimportします:

※readlineモジュールは、Node.jsの組込みモジュールの1つであり、コンソールやターミナル上でのユーザーの入力を扱うためのインタラクティブな機能を提供します。

import { Configuration, OpenAIApi } from "openai";
import readline from "readline";


次のようにOpenAIの設定を構築します:

※APIKeyは他人とシェアしないこと!また.envファイルの環境変数から呼ぶようにしましょう。

const configuration = new Configuration({
  organization: "org-0nmrFWw6wSm6xIJXSbx4FpTw",
  apiKey: "sk-Y2kldzcIHNfXH0mZW7rPIuusDvUQg",
});


このコードはConfigurationオブジェクトの新しいインスタンスを作成します。その中には、アカウントが組織の場合は企業コードとapiKeyの値を入力します。組織の詳細は「設定」で確認でき、apiKeyの情報は「APIキー」で確認できます。既存のAPIキーを持っていない場合は、新しく作成できます。個人アカウントで作成した場合は、組織のコードは不要になります。

次のコードを設定の後に入力して、OpenAI APIの新しいインスタンスを作成します:

const openai = new OpenAIApi(configuration);


これをプロジェクト全体で使用します。

以下のコードを入力してcreateChatCompletion関数をテストします:

openai
  .createChatCompletion({
    model: "gpt-3.5-turbo",
    messages: [{ role: "user", content: "Hello" }],
  })
  .then((res) => {
    console.log(res.data.choices[0].message.content);
  })
  .catch((e) => {
    console.log(e);
  });


このコードはcreateChatCompletion関数を呼び出し、エンドポイント(https://api.openai.com/v1/chat/completions)をトリガーします。この関数は、使用するchatGPTのモデルと、ユーザーとAIの間のメッセージの配列という引数のオブジェクトを受け取ります。次のセクションで、チャットの履歴を保持し、アプリを改善するためにメッセージ配列を使用する方法について見ていきます。

各メッセージは、送信者(つまり、メッセージがAIからのものであればassistant、人間からのものであればuserという値)と内容(送信される情報)を含むオブジェクトです。

最後に、以下のコマンドを使用してターミナルでファイルを実行します:

node index


数秒後にAIからの応答が返されます。

これでチャットボットを作成するために必要なものがすべて揃いました!

ただし、ユーザーがメッセージの内容をコードにハードコーディングするのではなく、ユーザーからの入力をリクエストしてアプリケーションをよりインタラクティブにすることが望ましいでしょう。readlineモジュールがそのために役立ちます。

インタラクティブにするために、最後に入力したコードを削除し、以下を追加します:

const userInterface = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});


このコードは、ユーザーが質問を入力できるようにターミナル上にUIを作成します。

次に、ユーザーにメッセージを入力するように促すために、以下のコードを追加します:

userInterface.prompt();


最後に、以下のコードを入力します:

userInterface.on("line", async (input) => {
  await openai
    .createChatCompletion({
      model: "gpt-3.5-turbo",
      messages: [{ role: "user", content: input }],
    })
    .then((res) => {
      console.log(res.data.choices[0].message.content);
      userInterface.prompt();
    })
    .catch((e) => {
      console.log(e);
    });
});


上記のコードでは、

  • ユーザーが何かを入力してEnterキーを押すと、コードはコールバック関数をトリガーします。
  • ユーザーが入力した内容をinputとして渡します。
  • 入力はcontentとして使用されます。
  • AIの応答が表示された後、ユーザーは次のメッセージの入力を求められます(thenブロック内でuserInterface.prompt()が呼ばれます)。

ファイルを実行してAIとの対話をしてみましょう。以下のような画像のようになります:

これで対話型のCLIチャットが完成しました。

完成したコードはGitHubのリポジトリから見てください。

https://github.com/DanNakatoshi/Node-ChatGPT-CLI

私のPCはアメリカで設定されているので日本語を入力するとコマンドプロンプトがフリーズしてしまいましたが、環境が日本で設定されている場合は問題がないと思います。(もし分かれば教えてください。)

これはエンジニアなど一部の人々にとって有用ですが、サーバーサイドにあるためセキュリティが良好です。

しかし、CLIアプリケーションの使用方法を理解できないかもしれない他のユーザーのために、もっと使いやすく、より良いユーザーインターフェース(UI)とユーザーエクスペリエンス(UX)を備えたアプリケーションが必要になることもあるかもしれません。

次回以降では、クライアント側のJavaScriptやVueを使用してより洗練されたチャットアプリケーションを作成する方法を見ていきます。

ではお疲れ様でした。