21
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AzureOpenAI(ChatGPT)を使ったエンタープライズ向けMattermostBotをサクッと実装する

Posted at

はじめに

北國フィナンシャルホールディングス デジタルバリューの 北 です。
銀行のシステムを開発しています。

話題のChatGPTを導入して生産性向上を図りたい!でも、扱うデータに配慮をおきたい!
そういう場合の できるだけ手軽な方法 を検討してみました!という記事となります。

対象読者

  • チャットツールに Mattermost を使用しているエンジニア
  • もっと ChatGPT を社内に広めたい人たち

つくるもの

さっそく作るものです。
見ての通り、MattermostでChatGPTと連携して動くBot です。

mm_azure_openai_gpt_3.gif

Tips: Mattermost公式のブログに同様のもの があります。しかし、OpenAI 本家と連携するもので、Azure OpenAI Service は未対応だったため、今回 新たに実装してみます。

前提

  • Mattermost が 構築済であること
  • Azure OpenAI Service の利用申請を行っていること
  • Azure OpenAI Service のオプトアウト申請を行っていること

Azure OpenAI Service の前提は下記が非常に良くまとまっています。
先輩方に学ばさせていただきましょう。

全体構成

サクッと作るので非常に単純です。
Botを図の真ん中 Azure Container Instance (ACI) で動かすという構成です。

image.png

機能

  1. いずれのチャンネルでも Botにメンションすると回答する
  2. スレッド内の会話を踏まえて回答する

Tips: 上記 1. について Privateチャンネルでも ChatGPTを活用できるよう、Mattermost Outgoing Webhook を用いた 一般的なBotの実装からあえて変更しています

Mattermostの設定

アカウントを作って AccessTokenを作成するだけです。

具体的には以下のようにして行います。

[アカウントの作成]
001.png
002.png

  • invite link を ブラウザで開きます

003.png

  • 各項目を埋めて作成完了です。

004.png

[アクセストークンの作成]

  • 事前に admin権限をもつユーザで PersonalAccessToken 作成を有効にします

101.png
102.png

  • 作成したbot用のユーザにPersonalAccessTokenを作成する権限を与えます

103.png
104.png
105.png

  • 以下の Edit で作成できます。作成後は AccessToken を控えておいてください。

106.png

実装

てっとり早く最終的なソースを以下に添付します。

下記に詳細を記載しますが、あるGitHubリポジトリを活用しつつ、Azure OpenAI Service の差分を埋めるだけです。 Azure OpenAI Service と OpenAI との差分が少なくて驚きました。ステキですね :relaxed:

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 を 打ち込むと反応が出るはずです!

mm_azure_openai_gpt_2.gif

あとはこれを起点に、修正・リファクタリングしていきます。
さらに Botのように振舞わせるならば、メンションに反応し、スレッド内のやりとりについて、回答できたら良い感じです。

同様に動かして以下のようになります。

mm_azure_openai_gpt_3.gif

これで出来上がりです! :tada:

デプロイ

ポータビリティを意識し、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の状態が 実行中 であるか確認します!

スクリーンショット 2023-05-19 082648.png

最後に 冒頭に示した通り、Mattermostでbotにメンションし反応するか確認しましょう!

これから

今回は スピード最優先で 動かしてみました。
つぎは 拡張性を加味して LangChain または Semantic Kernel で 実装する予定です。

21
10
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
21
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?