Azure OpenAI Service(ChatGPT)を使ってLINE Chatbotを作る
はじめに
少し出遅れ感はありますが、Azure OpenAI ServiceのプレビューであるChatGPT 3.5を使ってLINEのチャットボットを作りました。
Azureへのデプロイテンプレート(Bicep)、チャットプログラム(Python)は既に一式をGitHub上に公開しています。
特徴
リポジトリに公開しているAzureインフラ構成は以下の特徴があります。
- Bicepテンプレートによるデプロイ
- Azureリソース間はManaged Idを使ったAAD認証(パスワードを独自に保持していない)
- LINE Messaging APIの認証トークン、シークレットはAzure Key Vault上に安全に保存
- いつものスマホに皆入れているLINEアプリでChatGPTが利用可能になる
- 可愛いネコキャラがゆるい会話で和ましてくれる
- スタンプに対しても頑張って返答してくれる
必要なもの
以下が必要です
- Azure Subscription
- 加えてOpenAI Serviceの利用申請を行いChatGPT 3.5の利用が可能になっていること
https://learn.microsoft.com/ja-jp/azure/cognitive-services/openai/overview
- 加えてOpenAI Serviceの利用申請を行いChatGPT 3.5の利用が可能になっていること
- LINE Developerアカウント
- LINEアカウントがあれば簡単に利用可能になります
https://developers.line.biz/
- LINEアカウントがあれば簡単に利用可能になります
構成の説明
- LINEでフレンド追加されたChatBotがWeb HookにてAzure Functionsを呼び出します
- Functions上のプログラムが実行され以下の処理を行います
- LINEユーザ識別子を元に過去の会話履歴をAzure Table Storageから取得します
- 過去の会話履歴(直近10分かつ5件以内)を含め、ChatGPTに送信します
- ChatGPTから受けた返信メッセージをLINEに返却します
- 最新のチャットメッセージ(ユーザ、アシスタント)をAzure Table Storageに追加します
デプロイ方法
ツールの事前準備
クライアントPCに以下のツールをインストールしておきます
- Azure CLI
https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli - Azure Functions Core Tools
https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-run-local
LINE DevelopersにてMessaging APIの準備
以下を控えておきます
- チャネルシークレット
- チャネルアクセストークン(長期)
GitHubリポジトリのclone
適当なディレクトリ配下でファイル一式をcloneしてきます。
git clone https://github.com/katakura/azure-line-chatbot.git
Azureリソースのデプロイ
以下の手順を参考にAzure上にデプロイします。
# 環境変数の設定
rg_name="rg-chatbot"
location="japaneast"
openai_location="eastus"
line_token="???" # 先ほど控えたLINEトークン
line_secret="???" # 先ほど控えたLINEシークレット
# Azure Subscriptionへログイン
az login
# リソースグループの作成
az group create -g $rg_name -l $location
# リソースデプロイ
az deployment group create -g $rg_name --template-file templates/deploy.bicep --parameters location=$location openAiLocation=$openai_location lineToken=$line_token lineSecret=$line_secret
Functionsアプリのデプロイ
Functions Core Toolを使ってアプリをデプロイします。
# 作成されたFunctiosnのリソース名取得
func_name=$(az functionapp list -g $rg_name --query "[0].name" -o tsv)
# アプリデプロイ
func azure functionapp publish $func_name
LINE messaging APIのWeb Hook登録
FunctionsにデプロイされたアプリのWebhookのURLを確認します。
func azure functionapp list-functions $func_name --show-keys
$ func azure functionapp list-functions $func_name --show-keys
Functions in func-chatbot-xxxxxxxxxxxxx:
line-chat - [httpTrigger]
Invoke url: https://func-chatbot-xxxxxxxxxxxxx.azurewebsites.net/api/line-chat?code=xxx...xxx==
アプリのデプロイ完了まで少し時間がかかりますので5分くらい待ちます。
Invoke urlに表示されている内容をLINE DevelopersのWebhook URLに設定します。
動作確認
LINE Developersのコンソール画面でMessaging API設定のページにQRコードが表示されていますので、それをスマホで撮影してLINEのフレンドとして登録します。
あとは好きな会話を楽しみましょう!
まずは普通の会話
スタンプにもKeyword属性が含まれているものであればその内容に応じて返信してくれる
昔話も創作してくれる
会話の脈絡を保持しているのでスムーズな会話ができる(ネコなので直近10分で最大5つしか覚えられない)
ツンデレになってもらうにゃ
急に真面目な質問してもちゃんと真面目に答えてくれる
おわりに
時間を見つけて記事内容を今後も拡充していきますが、取り急ぎスピード感重視で一旦ポストしました。
始めはPythonの勉強がてら始めたのですが、自分で使ってみると正直すごく便利な仕組みだなと思いました(自画自賛)。
いつも手元にあるLINEで、知りたいことがあれば直ぐに使えるところが良いですね。
GitHub上のPythonコードは「とりあえず動いている」感があるので、是非有識者の方からのアドバイス(Issue)や、修正案(Pull Request)を頂けると助かります。
Discussion