現在、方言を話すおしゃべり猫型ロボット「ミーア」を開発中。
下記noteを参考に、ChatGPT APIとGASを使ったLINE Botを作成してみたのだが、GAS以外の方法で、かつ大規模運用にも耐えられるように設計したいと思うようになった。
https://chatgpt-lab.com/n/n55257c082a9d
Udemyで『ChatGPTを用いたLINEBot開発入門-基本的な機能からPDFを用いたQ&Aまで、クラウド上での開発方法を徹底解説』というタイトルの講座を発見
GCPというクラウドサーバーを使うのと、単純にChatGPTのAPIを使うだけではなく、追加情報をPDFで用意してベクトル化するという点が新しく、勉強したいと思ったので受講したところ、非常に勉強になった。
https://www.udemy.com/course/chatgpt-linebot-gcp/
講座で紹介されていたコードをもとに、今回作成したい「方言を話すLINE BOT」用に少し変更(あと、2023年12月時点での最新のOPENAIのAPI呼び出しに対応。ただし今後変わりうる)したので、備忘録として記載。
会話記憶を持たせるLINE BOT作成の全体像
手書きが汚すぎるが、こんな感じ。

ちなみに、Show Me Diagramという ChatGPT Pluginを使って、下記のプロンプトを指示したところ
エンドユーザーがLINEにメッセージを送信すると、Cloud functionsにwebhookでリクエストが送信され、CloudfunctionsのChat GPT APIを利用した返答を生成し、LINEに返し、ユーザーにメッセージが返ってきます。
また、Cloud functionsからFirestoreに対話内容を保存し、firestoreから過去の対話履歴を呼び出してCloud functionsに戻します。
このことを表す図表を作成してください
下記の返答がきて、ダイアグラムを作成してくれた。
こちらが、エンドユーザーがLINEにメッセージを送信し、Cloud Functionsを介してChat GPT APIを利用して返答を生成し、LINEを通じてユーザーにメッセージが返されるプロセスを示すシーケンス図です。また、この図にはCloud FunctionsからFirestoreに対話内容を保存し、Firestoreから過去の対話履歴を呼び出してCloud Functionsに戻すプロセスも含まれています。

結局、Googleスライドで作成した。ここら辺、手書きから自動化して、良い感じのダイアグラムを作成できるようになるとありがたいな。

ユーザーがLINEにメッセージを送信すると、その内容はLINEのWebhookによってCloud Functionsに転送され、Cloud Functionsで設定した関数でOpenAI APIを通じてChatGPTを利用してユーザーのメッセージに対する応答が生成される。
生成された応答はLINEを通じてユーザーに返送される。このプロセスには、セキュリティのためのChannel SecretとAPIの認証のためのChannel Access Tokenが用いられる。また、Cloud FunctionsとFirestoreの間でユーザーメッセージや応答などのデータが保存され、交換される。
LINE Messaging APIの仕様とDeveloperアカウントの設定
LINE Messaging APIの仕組み
https://lineapiusecase.com/ja/api/msgapi.html

- エンドユーザーが送信したメッセージは、LINEプラットフォームに届く。
- LINEから、ボットサーバーのWebhook URLにメッセージ(Webhookイベント)が送信される。LINEから送られていることを証明する秘密鍵(Channel Secret)も一緒に送信する。
- Webhookイベントに応じて、LINEプラットフォームに用意されているREST APIを利用(この時にボットサーバーがLIINEに権限を持っていることの証明情報(Channel Access Token)も送る)して、ボットサーバーからエンドユーザーにメッセージを送信する。
(参考)なぜチャネルアクセストークンを使うのか?
https://developers.line.biz/ja/docs/basics/channel-access-token/#why-use-channel-access-token

LINE developers アカウント設定
Messaging APIを始めるには、LINE developersコンソールにログインして、チャネルを作成するる必要があり、やり方はこちらを参照。
https://developers.line.biz/ja/docs/messaging-api/getting-started/#using-console
私の場合は、ログインするとこのような画面に。
今、テストで、ミーアちゃんの鹿児島弁bot「ミーアじゃっど」と京都弁bot「ミーアどす」を作っているので、このような画面になっている。

ChannelSecretとChannelAccessTokenを取得
ChannelSecretは、Developersコンソールの「チャネル基本設定」のタブをクリックして、下にスクロールすると記載されている。

ChannelAccessTokenは、Developersコンソールの「Messaging API設定」のタブをクリックして、下にスクロールすると記載されている。ChannelSecretとChannelAccessTokenは記載されているタブの場所が異なるので注意。

どちらも後で使うので、メモしておく。
OpenAI APIキー取得
ChatGPTによる返答を作成するために、Open ai APIキーを取得する。
Open ai APIのサイトをクリックして、「API」を選択
https://openai.com/blog/openai-api

左サイドバーで「API keys」を選択

「Create new secret key」を選択して、OpenAI APIキーを発行する。

Cloud Functionsで対話機能実装
Cloud Functionsとは?
Cloud Functionsとは、Goolge Cloud( GCP )が提供するサーバーレスのクラウドコンピューティングサービスのひとつ。サーバーの制御は自動で行われるので、自分でサーバー運用をする必要がなく、アプリケーションの実装に集中できるのが利点。
Cloud Functions設定
下記サイトをクリックし、「コンソールへ移動」をクリックする。
https://cloud.google.com/functions
「ファンクションを作成」をクリック

必要なAPIの有効化のアラートが出たら、有効にするをクリック

リージョン
- サービスを使う場所と地理的に近い方が、サービス速度が速い。今回は、東京を使用。
- Cloud storageを用いる場合で、Cloud storageのregionをUSに指定した場合は、cloud functionsのリージョンもUSがよい。ちなみに、今回はCloud Storageは使わないので無視してOK。
トリガー
- ここに記載されているURL(最後のディレクトリは、設定した関数名:function-1)にリクエスト送ると関数を実行できる
- 「未認証の呼び出しを許可」を選択。そうしないとLINE側からCloud Functionを呼び出すことができない。セキュリティに関しては、コード側で対応する

ランタイムタブでランタイム環境変数だけ追加する。「変数を追加」をクリックし、名前の欄に先ほど取得した、LINE_CHANNEL_ACCESS_TOKEN、LINE_CHANNEL_SECRET、OPENAI_API_KEYを入力し、対応する値を貼り付ける。
「次へ」を押すと、下記のようなNode.jsの画面が出てくる。ファンクションの処理内容を記述するソースコードの入力となる。

最初にランタイムからPythonX.XXを選ぶ。今回はPython3.12を選択。開発環境などに応じて変える。デフォルトのコードは下記。

基本はmain.pyとrequirements.txtの2つのファイルから構成されていて、main.pyにファンクションの処理、requirements.txtにインストールが必要なパッケージを記述する。ファイルは+ボタンで追加可能。
ここまでで、結構な分量になったので、実際のコード入力からは、こちらの記事で。
コメント