今、なんとか動作するLineBot x ChatGPT

### 今、なんとか動作するLine ChatGPT Bot
　生成AI、GPT-4界隈は日進月歩ならぬ、秒新分歩の進化を遂げているので、半年以上の記事などの情報では、APIの仕様変更などで、今試してもすんなり動かないことが多い。
　筆者も、LineBot x CHatGPTを実験しようとして、この沼にはまったが、とりあえず動作した手順とコードを記す。

最初の躓(つまづ）きどころは、LINE Devepper上の設定で、

https://developers.line.biz/console/

上で、自分のサーバーとの交信をするための設定をする。
下図のタブの「チャンネル基本設定」の設定後、「Messaging　API設定」で設定する。
今回はGPTのモデルは"gpt-3.5-turbo"を使用する。


![キャプチャsss.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430586/0970eb30-6908-58e6-de07-1d9a54630946.png)

この下のWebhook設定で、Webhook URLを自分のAPIサーバーのURLを
設定し、Webhookの利用をonにする。

![aaaキャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430586/64b3a41e-010e-4f22-d67c-d06065403683.png)

次に「LINE公式アカウント機能」の「応答メッセージ 」の緑色の「編集」ボタンを
クリックし、以下の画面が出たら、「チャット」と「あいさつメッセージを」をoffにし、Webhookをオンにする。
![応答設定.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430586/b451679d-5a60-95a7-4910-7798c2af639c.png)

### Flask+uWSGI+NginxでAPIを実装
https://developer-note.com/how_to_create_flask_uwsgi_nginx_api/
と、
  https://qiita.com/quittardis/items/62caf057fb499648859a
  を参考にFlask+uWSGI+NginxでAPIを設定する。

API用のFlaskのコードline.pyを以下のようにする。

```
from flask import Flask, request, abort

from linebot import (
    LineBotApi, WebhookHandler
)

from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)
from linebot.exceptions import LineBotApiError

from settings.setting import API_KEY
from settings.setting import CHANNEL_ACCESS_TOKEN 
from settings.setting import CHANNEL_SECRET 

import json

from openai import OpenAI
app = Flask(__name__)

line_bot_api = LineBotApi('CHANNEL_ACCESS_TOKEN')

@app.route("/",methods=['POST'])
def hello_world():
    return "<h1>It Works!</h1>"

@app.route("/callback", methods=['POST'])
def callback():

    # get request body as text
    body = request.get_data(as_text=True)
    data = json.loads(body)
    ui = data["events"][0]["source"]["userId"]
    app.logger.info("Request body: " + body)
    prompt = data["events"][0]["message"]["text"] 
   
    client = OpenAI(
            # This is the default and can be omitted
            api_key=API_KEY,
     )
    response = client.chat.completions.create(
            messages=[
                        {
                           "role": "user", "content": prompt,
                        }
            ],
            model="gpt-3.5-turbo",
         )
   
    content = response.choices[0].message.content

    try:
          line_bot_api = LineBotApi(CHANNEL_ACCESS_TOKEN)
          line_bot_api.push_message(ui, TextSendMessage(text=content))
    except LineBotApiError as e:
                 print(e.message)


```

このコードと同じ階層に、settingsといいフォルダを作成し、
その中に、setting.pyというファイル名のファイルは以下のようにする。
```
API_KEY = "（OpenAI上から得たAPIキー）"
CHANNEL_ACCESS_TOKEN="LINE Devepper上から得た同名のキー"
CHANNEL_SECRET="LINE Devepper上から得た同名のキー"
```
ここで、最大の沼は上の、line.pyの中の
```
content = response.choices[0].message.content
```
この行。これは、GPTからのレスポンスをオブジェクトとして受け取って
その中から、回答のテキストを取りだすところだが、GPT-4先生にエラー
メッセージを投げてもなかなか正解にたどりつけず、結局試行錯誤で
これにたどりついた。(実は、本家OpenAIのここに書いてあった! https://platform.openai.com/docs/guides/text-generation/chat-completions-api)
line.pyを以下のように起動する。
```
uwsgi --socket=/tmp/uwsgi.sock --wsgi-file=line.py  --callable=app --chmod-socket=666
```

ユーザー側は、Line Developperの「Messaging　API設定」のtagの下のQRコード
をlineアプリで読んで、友達登録をする。
これで、ChatGPTとlineで会話ができるようになる。

![Screenshot_20240302-094846_LINE.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430586/5af7e827-017d-2221-a83e-0deb3eaa6b49.jpeg)
### 注意
今回はとりあえず動くことをめざしたため、きちんとしたチェックをしていません。サービスで提供する場合は無駄なコードや、非効率な動作等があるかもしれません。また、セキュリティ上の問題やChatGPTの使用量の問題などがないかなどチェックなどが必要です。