LoginSignup
3
2

今、なんとか動作するLine ChatGPT Bot

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

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

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

キャプチャsss.PNG

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

aaaキャプチャ.PNG

次に「LINE公式アカウント機能」の「応答メッセージ 」の緑色の「編集」ボタンを
クリックし、以下の画面が出たら、「チャット」と「あいさつメッセージを」をoffにし、Webhookをオンにする。
応答設定.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

注意

今回はとりあえず動くことをめざしたため、きちんとしたチェックをしていません。サービスで提供する場合は無駄なコードや、非効率な動作等があるかもしれません。また、セキュリティ上の問題やChatGPTの使用量の問題などがないかなどチェックなどが必要です。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2