メドピア開発者ブログ

集合知により医療を再発明しようと邁進しているヘルステックカンパニーのエンジニアブログです。読者に有用な情報発信ができるよう心がけたいので応援のほどよろしくお願いします。

社内版 ChatGPT を構築し、社内の ChatGPT 利用を促進した話

SRE の田中 @kenzo0107 です。

社内版 ChatGPT を構築し、社内の ChatGPT 利用を促進した話です。

社内版 ChatGPT が必要だった理由

以下要望を実現する為です。

  • 秘匿情報をクローズドな環境で OpenAI にポストしたい
  • 社員誰もが最新のモデルやバージョンで高精度、且つ、パフォーマンスの高い ChatGPT を利用したい

構成 - Web 版 社内 ChatGPT

  • Web サービスは AWS に配置
  • ALB を会社毎に分けて Google 認証する *1
  • ECS から Azure API Management 経由で Azure OpenAI Service に問い合わせ
    • API Management は Azure OpenAI Service の監査ログを取得する為に配置している *2
  • Azure 側ではネットワークセキュリティグループで AWS NAT Gateway の EIP を許可し、リクエスト制限する

AWS にサーバを立てている理由

Azure で完結した方が、よりクローズドでセキュアです。

弊社では AWS はセキュリティガードレールが整備されていますが
Azure は未完です。

その為、Azure 側は必要最低限の利用リソースのみにし
AWS 側で基本 Web サービスを配信する構成としました。

chatbot の選定

既に世の中には多くの OSS がありますが、 中でもコンテナに対応しており、スター数が多く、開発が活発だった mckaywrigley/chatbot-ui *3 を採用しました。

chatbot-ui v2 がリリースされていますが、 v1 を利用しています。*4

chatbot-ui v2 採用を見送った理由

  • supabase との連携を前提としている
    • AWS 上にクローズドな環境を構築するようなアーキテクチャを採用できない
  • 利用者が各自 Azure OpenAI Service デプロイ ID を設定・管理する必要がある

上記理由から採用を見送りました。

chatbot-ui v1 の問題点

v1 は各自設定不要で即利用できるメリットがあるものの、以下デメリットがありました。

  • API バージョンを 2023-03-15-preview からアップグレードするとエラーになる
  • Azure OpenAI Service からのレスポンスが途切れる
    • fetch メソッドで API エンドポイントからレスポンスを取得していたことが影響していた

上記はいずれも openai ライブラリを利用することで解決できました。*5

Slack から問い合わせたい!

社内リリースをし Google Analytics で利用者の増加を眺めながら一呼吸したのも束の間、 すぐさま以下の意見をいただきました。

  • VPN に繋いで Web ブラウザ開くのが手間
  • Slack からサクッと問い合わせたい

早速実現に向け動きました。

構成 - Slack 版 社内 ChatGPT

  • Slack Event Subscription を設定し、 Bot へのメンション・Direct Message をトリガーに Lambda を起動し Azure OpenAI Service へ問い合わせる
  • 弊社グループ会社毎の各 Slack Workspace で Slack App を作成*6
  • Slack 毎の Signing Secret や Bot User OAuth Token は Lambda 内で処理分け *7
  • VPC モードの Lambda から Azure OpenAI Service に問い合わせる
    • 出口 IP を NAT Gateway EIP に固定する為

Slack 参加メンバーはグループ会社のメールアカウントを所持しており、Google 認証はしない方針としました。

使用例1: チャンネル上から Slack App にメンションする

Slack Bot をチャンネルに招待し、 Bot へのメンションをトリガーに Azure OpenAI Service に問い合わせます。

スレッド中の Bot へのメンションは Azure OpenAI Service との会話に引き継がれます。*8

使用例2: Slack App に直接 Direct Message を送信する

チャンネル上でメンションする場合と異なり、スレッド上の全てが Azure OpenAI Service との会話となります。

利用上の注意点を社内通知

  • 秘匿情報を扱う際は Slack でなく Web 版を利用していただく
    • Slack はサードパーティであり、秘匿情報を第三者が取得できてしまう可能性がある為
  • Slack 検索時の @office-ai のノイズ除外したい時は -from:@office-ai して、というノウハウの通達*9

総評

Slack 版は、他の方が Azure OpenAI Service にどのように問い合わせることで回答を引き出すかのノウハウを知る機会を作ることができたと思います。

開発に際して、
Azure 関連のセキュリティや OSS の改修等、諸問題に対して、
Azure OpenAI Service を利用することで解決できました。

弊社では GitHub Copilot *10 を採用し生産性を向上していたりと AI による社内全体の業務促進する為に AI を利用するという好循環ができているように改めて感じました。

以上
参考になれば幸いです。


是非読者になってください


メドピアでは一緒に働く仲間を募集しています。 ご応募をお待ちしております!

■募集ポジションはこちら medpeer.co.jp

■エンジニア紹介ページはこちら engineer.medpeer.co.jp

■メドピア公式YouTube  www.youtube.com

■メドピア公式note
style.medpeer.co.jp

*1:ALB のリスナールールのデフォルトアクションでのみ Google 認証の指定が可能です。メドピア株式会社メンバーが持つ @medpeer.co.jp のメールアカウントとフィッツプラス株式会社メンバーが持つ @fitsplus.co.jp で Google Workspace が異なる為、 Google Workspace 毎に ALB を用意することとしました。

*2:Azure OpenAI Service 単独では Azure OpenAI Service へのリクエスト・レスポンスのログは取得できない仕様でした。 learn.microsoft.com

*3:Next.js ベースで作成されています

*4:legacy ブランチが v1 相当です

*5:v2 の参照実装で事なきを得ました。

*6:workspace を跨いだ Slack Bot が作れませんでした

*7:Event Subscription で指定したエンドポイントに "?workspace=medpeer" を追加することで判定しました。

*8:Bot にメンションしていないメッセージは Slack Event Subscription をトリガーできない為

*9:用途があるかと思ったので

*10:Copilot Business を導入しています