🐈

Azure OpenAI Service(ChatGPT)を使ってLINE Chatbotを作る

2023/04/22に公開

はじめに

少し出遅れ感はありますが、Azure OpenAI ServiceのプレビューであるChatGPT 3.5を使ってLINEのチャットボットを作りました。

Azureへのデプロイテンプレート(Bicep)、チャットプログラム(Python)は既に一式をGitHub上に公開しています。

https://github.com/katakura/azure-line-chatbot

特徴

リポジトリに公開しているAzureインフラ構成は以下の特徴があります。

  • Bicepテンプレートによるデプロイ
  • Azureリソース間はManaged Idを使ったAAD認証(パスワードを独自に保持していない)
  • LINE Messaging APIの認証トークン、シークレットはAzure Key Vault上に安全に保存
  • いつものスマホに皆入れているLINEアプリでChatGPTが利用可能になる
    • 可愛いネコキャラがゆるい会話で和ましてくれる
    • スタンプに対しても頑張って返答してくれる

必要なもの

以下が必要です

構成の説明

  • LINEでフレンド追加されたChatBotがWeb HookにてAzure Functionsを呼び出します
  • Functions上のプログラムが実行され以下の処理を行います
    • LINEユーザ識別子を元に過去の会話履歴をAzure Table Storageから取得します
    • 過去の会話履歴(直近10分かつ5件以内)を含め、ChatGPTに送信します
    • ChatGPTから受けた返信メッセージをLINEに返却します
    • 最新のチャットメッセージ(ユーザ、アシスタント)をAzure Table Storageに追加します

img

デプロイ方法

ツールの事前準備

クライアントPCに以下のツールをインストールしておきます

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のフレンドとして登録します。

あとは好きな会話を楽しみましょう!

まずは普通の会話

img

スタンプにもKeyword属性が含まれているものであればその内容に応じて返信してくれる

img

昔話も創作してくれる

img

会話の脈絡を保持しているのでスムーズな会話ができる(ネコなので直近10分で最大5つしか覚えられない)

img

ツンデレになってもらうにゃ

img

急に真面目な質問してもちゃんと真面目に答えてくれる

img

おわりに

時間を見つけて記事内容を今後も拡充していきますが、取り急ぎスピード感重視で一旦ポストしました。

始めはPythonの勉強がてら始めたのですが、自分で使ってみると正直すごく便利な仕組みだなと思いました(自画自賛)。

いつも手元にあるLINEで、知りたいことがあれば直ぐに使えるところが良いですね。

GitHub上のPythonコードは「とりあえず動いている」感があるので、是非有識者の方からのアドバイス(Issue)や、修正案(Pull Request)を頂けると助かります。

Discussion