社内向けChatGPTを費用を押さえつつ爆速で構築する方法をMicrosoftが提供してくれていた件

## 2024年4月追記
アップデート内容を簡単にまとめた記事を公開しました。

https://qiita.com/keitomatsuri/items/fbf0082f106f7ffabb3a

---

社内向けChatGPTを安く手軽に構築したいという方、少なくないのではないでしょうか。

いきなり結論ですが、Azure OpenAIを利用可能なAzureサブスクリプションを用意し、Microsoftが公開している以下のリポジトリのアプリケーションをREADME記載の手順でデプロイするだけでOKです。

https://github.com/microsoft/sample-app-aoai-chatGPT

![IMG_1422.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3290212/080cb365-564f-5212-02de-eb04f691d4b8.png)

このリポジトリは、Azure OpenAI Serviceの「Add your data」機能で使用されているアプリケーションです。
（以下の記事から知りました。ありがとうございます。）

https://zenn.dev/microsoft/articles/azure-openai-add-your-data#デプロイされるアプリはソースコードがgithubで公開されている

実はこのアプリケーション、Azure Cognitive Searchに関する環境変数を設定しなければ基本的なチャットアプリとしてデプロイすることが可能です。

「Deploy to Azure」ボタンから必須項目（デプロイ済みのAzure OpenAIの情報）のみ入力してデプロイし、[IDプロバイダーの設定](https://learn.microsoft.com/ja-jp/azure/app-service/scenario-secure-app-authentication-app-service)をするだけで、シンプルなチャットアプリを構築できてしまいます。

※Azure Cognitive Searchに関する環境変数`AZURE_SEARCH_SERVICE`,`AZURE_SEARCH_INDEX`,`AZURE_SEARCH_KEY`をブランクにしておく必要があります。

リポジトリをフォークしてカスタマイズしてデプロイするのもよいでしょう。
そのあたりのベストプラクティスについても[READMEに記載](https://github.com/microsoft/sample-app-aoai-chatGPT#best-practices)があります。

Add your data機能もそうですが、ここまでお膳立ていただけるとは、Microsoftには頭が上がらないです。
本当にありがとうございます。

社内向けChatGPTの構築でお困りの方は試してみるとよいのではないでしょうか。

構築手順はREADMEの通りで非常にシンプルなので、ここでは割愛します。

以下雑感など。

## 何が嬉しかったのか

社内にChatGPTをお試し導入するうえで、手軽にかつ費用を押さえる方法がないか検討していました。
会社でMicrosoft 365を契約しているのでPower AppsやPower Virtual Agentsで試作を進めていましたが、
Azure OpenAIにリクエストするために必要なPower AutomateのHTTPコネクタがプレミアムコネクタであるため別途ライセンスの購入が必要でした。
どのライセンスが必要かサポートに問い合わせてはみたものの、それなりの費用がかかることが分かり一旦保留に。
アプリケーションを自作してWeb Appsにデプロイしようか、と思っていた矢先に上記リポジトリの情報が入ってきて、これがまさに欲しかったものだ！となりました。

Web Appsを安いプランでデプロイすれば費用をグッと抑えられます。

IDプロバイダーの設定ができるので、会社のテナント配下のユーザーにのみアクセスを限定することが可能です。

カスタマイズもしやすく、例えばロゴを差し替えるとか文言を日本語にするといった変更も簡単です。

ストリームで表示できるのも嬉しいですね。

会話履歴などの機能はないですが、お試しなのでこれで十分でした。

## セキュリティ

デフォルトの設定ではStatic Web AppsからAzure OpenAIへのリクエストはインターネット経由になりますが、Web Apps側でvnet統合、Azure OpenAI側でプライベートエンドポイントを設定することによりセキュアな通信が可能になります。

アーキテクチャ的には以下の記事の「Azure OpenAI を VNET に限定する設定」の2つ目の図（の一部）になります。

https://qiita.com/nohanaga/items/a18009f8b605591348fe#7-azure-openai-を-vnet-に限定する設定

具体的な手順については、以下の記事の手順を参考にさせていただき、VMのところでWeb Appsのvnet統合を実施することで特に問題なく設定できました。

https://zenn.dev/microsoft/articles/198989f60eba61

また、これは試せていないですがAzure OpenAIのキーは環境変数に直接記載せずにKey Vaultに格納して参照すればよりセキュアになると思います。

https://learn.microsoft.com/ja-jp/azure/app-service/app-service-key-vault-references?tabs=azure-cli


## Add your dataの要否判定

app.pyの`should_use_data()`で、Add your data機能を使用するか否かを判定しているようです。

```python
def should_use_data():
    if AZURE_SEARCH_SERVICE and AZURE_SEARCH_INDEX and AZURE_SEARCH_KEY:
        return True
    return False
```

`AZURE_SEARCH_SERVICE`,`AZURE_SEARCH_INDEX`,`AZURE_SEARCH_KEY`
は同名の環境変数を読み込んでいるものなので、これらを環境変数に設定しなければAdd your dataではなく通常のAzure OpenAIのエンドポイントにリクエストするような仕組みになっています。

## start.cmd

ローカルでビルドする際には`start.cmd`を実行するようREADMEに記載がありますが、中身は非常にシンプルで以下を実行しているようです。

```
python -m pip install -r requirements.txt
npm install
npm run build
python ./app.py
```

カスタマイズする際は、毎回start.cmdは実行せず必要なコマンドのみ実行すればよいと思います。

## 環境変数の設定
Web Appsの環境変数は、[構成]>[アプリケーションの設定]から設定できます。

https://learn.microsoft.com/ja-jp/azure/app-service/configure-common?tabs=portal

Azure CLIでデプロイすると必要な環境変数が設定されていない状態で、手動での設定が必要でした。
もしデプロイしてアプリケーションが動いていてもAzure OpenAIへのリクエストがうまくいかない際は、ここも確認のポイントになると思います。

以上、雑感等でした。
何か気付いた点などあれば追記していきます。
もし内容に誤りがございましたらご指摘いただけますと幸いです。