(30/100) Node-REDからChatGPTのAPIをたたく/Node-RED100本ノック

↓今回のフロー

[{"id":"1","type":"tab","label":"ChatGPTフロー","disabled":false,"info":""},{"id":"12b23f84d8b019f8","type":"tab","label":"Dashboard","disabled":false,"info":"","env":[]},{"id":"fa0fde1dc04ab30c","type":"ui_group","name":"フォーム","tab":"2dfcfda6f4726031","order":1,"disp":true,"width":"12","collapse":false,"className":""},{"id":"2dfcfda6f4726031","type":"ui_tab","name":"ChatGPT","icon":"dashboard","order":1,"disabled":false,"hidden":false},{"id":"d56f9202dbc48ccc","type":"inject","z":"1","name":"スタート","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":180,"y":240,"wires":[["43ccf054b73f6473"]]},{"id":"43ccf054b73f6473","type":"function","z":"1","name":"リクエスト作成","func":"// apikeyをglobalから取得\nconst apikey = global.get(\"apikey\");\n\nconst model = \"gpt-3.5-turbo\";\nconst url = \"https://api.openai.com/v1/chat/completions\";\n\nlet content = msg.payload.content;\n\nvar temperature = 0;\nvar maxTokens = 2048;\n\nconst requestBody = {\n    \"model\": model,\n    \"messages\": [{ \"role\": \"user\", \"content\": content }],\n    \"temperature\": temperature,\n    \"max_tokens\": maxTokens,\n};\n\nmsg.headers = {\n    \"Content-Type\": \"application/json\",\n    \"Authorization\": \"Bearer \" + apikey\n};\n\nmsg.url = url;\n\nmsg.payload = requestBody;\n\n\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":280,"y":320,"wires":[["bfdaf3ba7f190b5e"]]},{"id":"bfdaf3ba7f190b5e","type":"http request","z":"1","name":"POSTリクエスト","method":"POST","ret":"obj","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":390,"y":380,"wires":[["a9fb4b7eaa0975bc"]]},{"id":"a9fb4b7eaa0975bc","type":"change","z":"1","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.choices[0].message.content","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":480,"y":440,"wires":[["5c688a41f24f9b5d","dc951849f6df42b9"]]},{"id":"5c688a41f24f9b5d","type":"debug","z":"1","name":"出力","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":550,"y":560,"wires":[]},{"id":"d8ce217832f33e6d","type":"change","z":"1","name":"APIKEY","rules":[{"t":"set","p":"apikey","pt":"global","to":"","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":480,"y":140,"wires":[[]]},{"id":"15612061ddb92e18","type":"link in","z":"1","name":"Out","links":["77c24522ac2f3581"],"x":135,"y":420,"wires":[["43ccf054b73f6473"]]},{"id":"49a8371f62fc98c7","type":"link out","z":"1","name":"content","mode":"link","links":["ca42d03aba490be8"],"x":785,"y":520,"wires":[]},{"id":"dc951849f6df42b9","type":"function","z":"1","name":"改行作成","func":"msg.payload = msg.payload.replace(/\\n/g, \"<br>\");\n\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":680,"y":460,"wires":[["49a8371f62fc98c7"]]},{"id":"1da2eb02faa9d92b","type":"inject","z":"1","name":"初期設定","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":220,"y":140,"wires":[["d8ce217832f33e6d"]]},{"id":"77c24522ac2f3581","type":"link out","z":"12b23f84d8b019f8","name":"ToFlow","mode":"link","links":["15612061ddb92e18"],"x":415,"y":220,"wires":[]},{"id":"a2d1c1d0d0a76cbd","type":"ui_form","z":"12b23f84d8b019f8","name":"","label":"質問","group":"fa0fde1dc04ab30c","order":2,"width":"12","height":"5","options":[{"label":"","value":"content","type":"multiline","required":true,"rows":5}],"formValue":{"content":""},"payload":"","submit":"submit","cancel":"cancel","topic":"payload","topicType":"msg","splitLayout":"","className":"","x":210,"y":180,"wires":[["77c24522ac2f3581","af645bdc56a62508"]]},{"id":"83f7c3d78eaa4563","type":"ui_text","z":"12b23f84d8b019f8","group":"fa0fde1dc04ab30c","order":2,"width":"12","height":"12","name":"回答","label":"回答","format":"{{msg.payload}}","layout":"col-center","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":370,"y":360,"wires":[]},{"id":"ca42d03aba490be8","type":"link in","z":"12b23f84d8b019f8","name":"link in 1","links":["49a8371f62fc98c7"],"x":185,"y":360,"wires":[["83f7c3d78eaa4563"]]},{"id":"af645bdc56a62508","type":"function","z":"12b23f84d8b019f8","name":"表示維持","func":"\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":220,"y":260,"wires":[["a2d1c1d0d0a76cbd"]]}]

こんにちは。本動画では、Node-REDを使用してOpenAIのChatGPT APIと連携し、質問を送信してその回答を取得する仕組みを構築する方法を紹介します。この動画は、Node-REDの基礎から始め、ChatGPT APIとの連携を段階的に進める実践的な内容となっています。


1. 動画の概要

動画冒頭では、長らく中断していたNode-REDを使ったプロジェクト「Node-RED 100本ノック」の第30回目として、ChatGPT APIをNode-REDから活用する方法をテーマに取り上げています。具体的には、Node-REDを用いてChatGPT APIに質問を送信し、APIから返された回答を処理して活用するまでの一連の流れを解説しています。


2. ChatGPT APIの概要

OpenAIが提供するChatGPT APIは、自然言語処理を利用して様々な質問に答えたり、テキスト生成を行ったりする機能を提供します。このAPIは、モデルとしてGPT-3.5やGPT-4を利用でき、APIキーを使ってアクセスします。本動画では主にGPT-3.5 Turboを使用しています。

APIを使用する際に重要なポイントとして以下が挙げられます:

  1. APIキーの取得
    OpenAIのアカウントからAPIキーを発行する必要があります。これが認証に使われます。
  2. リクエスト構造
    リクエストはHTTP POSTで送信され、ヘッダーにはAuthorizationとして「Bearer + APIキー」を含める必要があります。リクエストボディには、送信するプロンプトやモデル指定などの情報が含まれます。

3. Node-REDでの構築手順

(1) 初期設定

まず、Node-REDの環境を準備します。この動画では、インジェクトノードを使って質問を入力し、HTTPリクエストノードを経由してChatGPT APIにリクエストを送信する構成を採用しています。

以下のノードが使用されています:

  • インジェクトノード
    質問をトリガーとして送信する。(テスト用です)
  • 関数ノード
    リクエストボディを構築し、ChatGPT APIが求める形式に整える。
  • HTTPリクエストノード
    APIに対してリクエストを送信し、結果を取得する。
  • デバッグノード
    APIから返されたレスポンスを確認する。

(2) APIキーの設定

関数ノード内で、取得したAPIキーをグローバル変数として設定します。この方法により、他のノードから簡単にAPIキーを参照できます。設定の際は、セキュリティを考慮してAPIキーを暗号化または環境変数で管理することが推奨されます。

(3) リクエストボディの構築

リクエストボディには以下のような情報を含めます:

  • モデルの指定(例: gpt-3.5-turbo
  • プロンプト(質問内容)
  • トークン数の制限(生成される回答の最大文字数)

Node-RED内ではJSON形式でこれを作成し、HTTPリクエストノードに渡します。

(4) ダッシュボードの構築

ダッシュボードノードを活用して、ユーザーがフォームに質問を入力できる仕組みを作成します。入力した質問はAPIを通じて送信され、返された回答が画面に表示されるよう設定します。


4. APIとの通信のポイント

動画では、APIのリクエストやレスポンスにおける重要な技術的ポイントも詳しく解説されています。以下がその一部です:

  1. ヘッダーの設定
    Authorization: Bearer <APIキー> の形式で設定。
  2. レスポンスの処理
    APIから返されるレスポンスには、回答本文が含まれます。これをNode-REDで取り出し、必要に応じて加工します。

5. 応用例と今後の展望

動画後半では、Node-REDとChatGPT APIの連携をさらに活用するためのアイデアについても触れています。例えば:

  • スマートオフィスやスマートホームでの応用
    Node-REDを使った音声アシスタントの開発や、KNX、DALIなどのプロトコルと組み合わせて、建物の自動化システムを強化。
  • ダッシュボードのカスタマイズ
    ユーザーインターフェースを改良し、より直感的に操作できるシステムを構築。
  • AIエージェントの作成
    複雑な質問に対して柔軟に回答するエージェントを開発。

6. この動画を通じて得られること

この動画は、Node-REDの初心者から中級者までを対象に、実践的なアプローチを通じてChatGPT APIとの連携を学べる内容です。以下のスキルが習得できます:

  • Node-REDを使用したAPIとの連携方法
  • ChatGPT APIの基本的な使い方
  • 自分のプロジェクトに応用するためのアイデア発想

動画の最後には、「まず基本的な技術を覚え、それを基に自分のアイデアを形にしてみてください」とのメッセージが伝えられています。このシンプルなプロジェクトから始めることで、より高度なシステムの構築や応用が可能になります。