概要
普段プログラミングをしないインフラメインのエンジニアが社内で業務利用できる生成AIchatbotをAzureとGCP、Slackを連携させて作って導入した話しです。
開発の目的
- Chatgptから乗り換えたい
- 学習のオプトアウトは申請できるとはいえ、保証はない(開発当時はその辺りが不透明だった)
- 使い方によっては社内情報が漏洩する可能性がある
- MicrosoftのAzure自体は一部サービスで利用実績があり、日本リージョンがある
- Azure OpenAIであれば自分のAzureリソース内でしか学習されないことが明言されている
- gpt-4を含め気兼ねなく業務でAIを使いたい
- 新技術へのチャレンジとノウハウの取得
- 最先端の人工知能技術を活用してAIの応用に関する知識やスキルを向上させていきたい
- ゆくゆくは社内情報を学習データとして投入していきたい
- githubレポジトリの内容を食わせたり出来るとリファクタなども楽に
- 情報システム周りの問い合わせ自動化
- 事務手続き自動化
- ...etc
主な仕様
- pythonのslack_boltで作成
- アプリケーションを載せるインフラはCloud Run
- GPTバージョンは3.5-turbo-16k
- ボットとのチャットは、ダイレクトメッセージ(DM)で行う
- ボットに対してメッセージを送ると、スレッドで返信される
- 受付時点でスタンプ応答する
- スレッド内容を過去の会話記憶として使用する
- 会話トークン数が16k近くになると古いものから記憶を消していく
Azureのノウハウをほとんど持っていないためそこの学習に時間をかけるよりはAPIサーバとしての利用に留めて、手慣れているGCP上(Cloudrun)にアプリケーションを構築することを選択しました。
pythonコードはAzure OpenAI Studio Chat のプレイグラウンドでAIと対話しながら作成。
そのほか仕様
- Clourun側でのリクエスト署名検証
- chatbotがインストールされたSlackワークスペースからのアクセスかどうかをX-Slack-Signatureを使用して検証
- slack_bolt組み込みの機能を使用
- chatbotがインストールされたSlackワークスペースからのアクセスかどうかをX-Slack-Signatureを使用して検証
- Slack app へのIPアドレス制限
- Cloudrunの送信元IPアドレスを固定(VPC connector & CloudNATを利用)
- Slack app側で受け付けるIPアドレスを制限
- 会話履歴の保存
- システム管理者しかアクセスできないGCPプロジェクト側に難読化をほどこして保存
- botとのDMに制限
- ユーザープライバシーを保ちながらボットとの対話が可能
- ボットが他のチャンネルで混乱を引き起こす可能性を排除
構成図
導入まで
開発作業より手間暇がかかったのが社内調整。
- 全従業員利用想定のインフラ&生成AI費用見積もりと予算確保
- セキュリティ要件を担保できるかAzure OpenAIの利用規約の読み込みと社内法務へのプレゼンを実施
- 法務でのでリーガルチェックを待ちつつ、導入に合わせて社内の生成AI利用規約を刷新して公開
- chatbotの利用マニュアルを作成して関連部署のレビュー
そして、ようやく導入となりました。
現状わかっている課題など
- ファインチューニングは難しい
- キーバリュー形式でデータは簡単に食わせられるが、期待した回答はなかなかしない
- 膨大なパターンを含めたデータを投入する、AIが回答しやすい質問に再生成等の工夫が必要
- RAGで上手いことやりたいけどまだ手を動かせていない
- 会話ログの取り扱い
- AIの学習のためには実使用時の会話が重要だが、会話自体が機密情報でもある
- 貯めたデータはどう扱うかは検討中
- Cloudrun費用が結構かさむ
- Always on CPU必須なため
- CloudrunだとSlackのソケットモードと相性が悪い
- ライフサイクルで自動的にコンテナが落ちるのでソケットモードを利用する場合は別途キックの仕組みが必要になる
- これがうまく使えればIPアドレス制限のセキュリティ対策は必要なかった
- Azure OpenAI APIサーバの機能
- 月に何度かは落ちていた(開発当時)
- 機能追加はOpenAI純正の後追いで遅い
作ってみての感想とか
- プログラミングは普段ほぼしないが、AIと会話しながらでかなり捗った
- Azure OpenAIに会話を投げつけること自体はとても簡単
- Slackを使うとコンテキストを理解させるための会話ログの取得はSlack上に残っているものを使えば良いので、別途ストレージ用意しなくてよくて楽チン
- slack appの仕様を理解するのとか運用設計に時間がかかった
ということでツラツラ書いてきましが、生成AIを使うとコードの作成を含め色々と捗ります。
開発当時は不安定だったAzure OpenAIも今は安定してレスポンスも早くなりました。
実現したいことがあるけどプログラミングは苦手なので後回しにしていた...なんて方は生成AI使うと幸せになれますよ。