ChatGPT風のLINEチャットボットを立ち上げる

OpenAIが提供するAPIサービスを使って、ChatGPTっぽい応答をしてくれるLINEボットを立ち上げます。
といっても、OpenAIが用意してくれているnpmモジュールを使えば簡単です。
（すでにたくさんの有志の方が試されているので、あまり真新しさはないですが。。。）

OpenAIの文章生成AIとして、ChatGPTと同じtext-davinci-003というGPT3.5系文章生成モデルを使います。また、適当な文字を入れると、それに合った画像を表示してくれるようにもしてみます。

環境一式を以下にアップしました。

poruruba/line_aibot

https://github.com/poruruba/line_aibot

# OpenAIのAPIキーを発行

以下のサイトを参考にさせていただきました。

[【2023年版】OpenAIのAPIキー発行手順！ChatGPT風の文章生成やDALL-Eの画像生成AI利用](https://auto-worker.com/blog/?p=6988)

# LINEボットを立ち上げる

以下のサイトを参考にしました。

[LINEボットを立ち上げるまで。LINEビーコンも。](https://qiita.com/poruruba/items/c71c96ca83c7403c2930)

# LINEボットを実装する

OpenAIを扱うための便利なnpmモジュールと、LINEボット用のnpmモジュールを使います。

> npm install openai
> npm install @line/bot-sdk

```js:api\controllers\aibot-api\index.js
'use strict';

const HELPER_BASE = process.env.HELPER_BASE || "/opt/";
const Response = require(HELPER_BASE + 'response');

const OPENAI_APIKEY = "【OpenAIのAPIキー】";

const { Configuration, OpenAIApi } = require("openai");
const configuration = new Configuration({
  apiKey: OPENAI_APIKEY
});
const openai = new OpenAIApi(configuration);

const LINE_CHANNEL_ACCESS_TOKEN = "【LINEのチャネルアクセストークン】";
const LINE_CHANNEL_SECRET = "【LINEのチャネルシークレット】";

const config = {
  channelAccessToken: LINE_CHANNEL_ACCESS_TOKEN,
  channelSecret: LINE_CHANNEL_SECRET
};
const LineUtils = require(HELPER_BASE + 'line-utils');
const line = require('@line/bot-sdk');
const app = new LineUtils(line, config);

app.message(async (event, client) =>{
  console.log(event);
  console.log(event.message.text);

  var text = event.message.text.trim();
  var type = "normal";
  if( text.endsWith("の画像") || text.endsWith("の写真") ){
    text = text.slice(0, -3);
    type = "image";
  }else if( text.endsWith("の絵") ){
    text = text.slice(0, -2);
    type = "image";
  }
  if( type == "image" ){
    const image = await openai.createImage({
      prompt: text,
      size: "256x256",
    });
    console.log(JSON.stringify(image.data), null, '\t');

    var url = image.data.data[0].url;
    var message = app.createImageResponse(url);
    return client.replyMessage(event.replyToken, message);
  }else{
    const response = await openai.createCompletion({
      model: "text-davinci-003",
      prompt: text,
      temperature: 0.9,
      max_tokens: 1024,
    });
    console.log(JSON.stringify(response.data), null, '\t');

    var text = response.data.choices[0].text.trim();

    var message = app.createSimpleResponse(text)
    return client.replyMessage(event.replyToken, message);
  }
});

exports.handler = app.lambda();
```

大したことはやっていません。```openai.createCompletion()```の部分や、```openai.createImage()```の部分が大事です。
パラメータは以下を参考にしてください。

Completions

https://platform.openai.com/docs/api-reference/completions

Images

https://platform.openai.com/docs/api-reference/images

LINEボットサーバのためのエンドポイントは、以下に示す通り/aibot-talkとしました。LINE Developer Consoleで、Webhookとして指定します。

```yaml:api\controllers\aibot-api\swagger.yaml
paths:
  /aibot-talk:
    post:
      parameters:
        - in: body
          name: body
          schema:
            $ref: "#/definitions/CommonRequest"
      responses:
        200:
          description: Success
          schema:
            $ref: "#/definitions/CommonResponse"
```

以下の部分を各自の環境に合わせて編集してください。

```js:api\controllers\aibot-api\index.js
const OPENAI_APIKEY = "【OpenAIのAPIキー】";

const LINE_CHANNEL_ACCESS_TOKEN = "【LINEのチャネルアクセストークン】";
const LINE_CHANNEL_SECRET = "【LINEのチャネルシークレット】";
```

# 使い方

使い方は、立ち上げたLINEボットを友達登録して、会話したい文章をLINEアプリから伝えるだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/5e6436e3-4c9d-bd76-c817-8100aeb8bbba.png)

また、「XXXXの写真」とか「XXXXの画像」とか「XXXXの絵」という文章を入れると、XXXXにあった画像が表示されるようにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/063393f4-f30c-7743-f867-de55327418f8.png)

# 終わりに

かなり端折って説明しました。。。

以上