はじめに
北國フィナンシャルホールディングス デジタルバリューの 北 です。
銀行のシステムを開発しています。
話題のChatGPTを導入して生産性向上を図りたい!でも、扱うデータに配慮をおきたい!
そういう場合の できるだけ手軽な方法 を検討してみました!という記事となります。
対象読者
- チャットツールに Mattermost を使用しているエンジニア
- もっと ChatGPT を社内に広めたい人たち
つくるもの
さっそく作るものです。
見ての通り、MattermostでChatGPTと連携して動くBot です。
Tips: Mattermost公式のブログに同様のもの があります。しかし、OpenAI 本家と連携するもので、Azure OpenAI Service は未対応だったため、今回 新たに実装してみます。
前提
- Mattermost が 構築済であること
- Azure OpenAI Service の利用申請を行っていること
- Azure OpenAI Service のオプトアウト申請を行っていること
Azure OpenAI Service の前提は下記が非常に良くまとまっています。
先輩方に学ばさせていただきましょう。
全体構成
サクッと作るので非常に単純です。
Botを図の真ん中 Azure Container Instance (ACI) で動かすという構成です。
機能
- いずれのチャンネルでも Botにメンションすると回答する
- スレッド内の会話を踏まえて回答する
Tips: 上記 1. について Privateチャンネルでも ChatGPTを活用できるよう、Mattermost Outgoing Webhook を用いた 一般的なBotの実装からあえて変更しています
Mattermostの設定
アカウントを作って AccessTokenを作成するだけです。
具体的には以下のようにして行います。
- invite link を ブラウザで開きます
- 各項目を埋めて作成完了です。
[アクセストークンの作成]
- 事前に admin権限をもつユーザで PersonalAccessToken 作成を有効にします
- 作成したbot用のユーザにPersonalAccessTokenを作成する権限を与えます
- 以下の Edit で作成できます。作成後は
AccessToken
を控えておいてください。
実装
てっとり早く最終的なソースを以下に添付します。
下記に詳細を記載しますが、あるGitHubリポジトリを活用しつつ、Azure OpenAI Service の差分を埋めるだけです。 Azure OpenAI Service と OpenAI との差分が少なくて驚きました。ステキですね
Azure OpenAI Service への適応
すでに出来合いのMattermost bot が以下にあったため、それを活用させてもらいます。
どこを修正すれば良いかを見極めるために、若干のコードリーディング が必要です。手っ取り早く導入したいのであれば、下記 デプロイ まで読み飛ばしてもOKです。
[コードリーディング]
コードを読むと仕様はシンプルです。
-
main.py
を実行すると Botのように振舞うプログラムが起動 - あるキーワードが指定されたら OpenAI にAPIを実行して会話に応答
また、内部の仕組みとしてもシンプルです。
- MattermostDriver でBotのように動作
- httpx (Httpクライアント) で OpenAI にAPIを実行
[コードの修正]
今回活用するソースコードも OpenAI 本家を利用する実装となっていますが、Azure OpenAI Service に対応させる必要があります。細かいこと気にせず、サクッと動かすには 以下のように OpenAIのendpoint と 認証ヘッダだけ 修正をすれば良い です。
上記ソースの時点で こちらの環境変数 設定後、main.py
を実行して プログラムが起動すると、Mattermost で以下のスクショのようになります。この段階では !gpt ping
や !chat ping
を 打ち込むと反応が出るはずです!
あとはこれを起点に、修正・リファクタリングしていきます。
さらに Botのように振舞わせるならば、メンションに反応し、スレッド内のやりとりについて、回答できたら良い感じです。
同様に動かして以下のようになります。
これで出来上がりです!
デプロイ
ポータビリティを意識し、Azure Container Instance (ACI) で構築してみます。
あらかじめ コンテナイメージをビルドし、Azure Container Registry (ACR) に pushします。
- Git pull
git clone -b supportAzureOpenAI https://github.com/kita-atsushi/mattermost_bot.git
cd mattermost_bot
- Dockerイメージ Build & Push
docker build -t chatgpt-mmbot:0.0.1 .
docker tag chatgpt-mmbot:0.0.1 <ACRリソース名>.azurecr.io/chatgpt-mmbot:0.0.1
docker push <ACRリソース名>.azurecr.io/chatgpt-mmbot:0.0.1
- ACI 構築
az container create -g <リソースグループ名> \
--location <リージョン名> \
--name aci-chatgpt-mmbot-jpeast \
--image <ACRリソース名>.azurecr.io/chatgpt-mmbot:0.0.1 \
--registry-username "<ACRのユーザ名>" \
--registry-password "<ACRのパスワード>" \
--restart-policy Never \
--environment-variables \
SERVER_URL="<MattermostのFQDN>" \
USERNAME="<Mattermostアカウントのユーザー名>" \
--secure-environment-variables \
LOGIN_ID="<Mattermostアカウントのメールアドレス>" \
ACCESS_TOKEN="<Mattermostアカウントのアクセストークン>" \
OPENAI_API_KEY="<Azure OpenAI Service AccessKey>" \
OPENAI_API_ENDPOINT="<Azure OpenAI Service URL>"
わかりづらい変数値は 以下で例を示します。
※environment-variables と secure-environment-variables オプション補足
変数名 | 説明 | 値の例 |
---|---|---|
SERVER_URL | MattermostのFQDN | my-mattermost.com |
USERNAME | Mattermostアカウントのユーザー名 | @myuser |
LOGIN_ID | Mattermostアカウントのメールアドレス | myuser@example.com |
ACCESS_TOKEN | Mattermostアカウントのアクセストークン | xxx |
OPENAI_API_KEY | Azure OpenAI Service AccessKey | yyy |
OPENAI_API_ENDPOINT | Azure OpenAI Service URL | https://myopenaiservice.openai.azure.com/openai/deployments/gpt-35/chat/completions?api-version=2023-03-15-preview |
上記コマンド実行後、Azureポータル上で ACIの状態が 実行中 であるか確認します!
最後に 冒頭に示した通り、Mattermostでbotにメンションし反応するか確認しましょう!
これから
今回は スピード最優先で 動かしてみました。
つぎは 拡張性を加味して LangChain または Semantic Kernel で 実装する予定です。