生成AIチャットボットのリファレンスアーキテクチャ（コンポーネント紹介）

# はじめに
生成AIの活用事例としてよくある、顧客・社内向けのチャットボットのリファレンスアーキテクチャについてMicrosoftのドキュメントをベースに紹介していきます。実際に自分でも環境構築しながら気づいた点を追記することでできるだけ分かりやすく！を目指します。

# AIチャットボットのリファレンスアーキテクチャ
以下のようなAIチャットボットをエンタープライズユースで求められる要件を考慮した上で構築していきます。デモでは日本の首相は誰ですかという問いに対して、Wikipediaをソースとした回答を作成しています。

![ChatUI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/1e91f348-0a58-8d74-a794-f3f804d2e140.png)

## アーキテクチャダイアグラム
アプリケーションは以下のような構成でAzure上に構築していきます。本リファレンスアーキテクチャを使用したサンプルチャットアプリはMicrosoftが[GitHub](https://github.com/Azure-Samples/openai-end-to-end-baseline?tab=readme-ov-file)で公開しており、Readmeの手順に沿ってデプロイすることができます。この記事では実際にデプロイした環境を画面と共に紹介することで理解を深めていきます。[Microsoftのドキュメント]((https://learn.microsoft.com/en-us/azure/architecture/ai-ml/architecture/baseline-openai-e2e-chat))も合わせてご確認ください。

![Diagram.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/4c3ee119-a583-4913-d874-204a1fa2c406.jpeg)

リファレンスアーキテクチャの各コンポーネントについては（1）バックエンド（プロンプトフロー）、（2）フロントエンド（チャットUI）、（3）ネットワーク・セキュリティに分類してご紹介していきます。

## バックエンド（プロンプトフロー）
生成AIチャットボットにおけるバックエンドは、ユーザーのクエリに対する回答をデータやLLM、外部サービス（API）を活用して生成する処理を実施し、プロンプトフローがそれらの処理のオーケストレーターとなります。バックエンドを支える主なAzureサービスとして以下があります。

| サービス名 | 本構成における主な役割 |
|:-:|:-:|
| [Azure Machine Learning](https://learn.microsoft.com/ja-jp/azure/machine-learning/prompt-flow/overview-what-is-prompt-flow?view=azureml-api-2) | プロンプトフローの構築、ホスティング |
| [Azure OpenAI Service](https://learn.microsoft.com/ja-JP/azure/ai-services/openai/overview) | LLMの提供 |
| [Azure AI Search](https://learn.microsoft.com/ja-jp/azure/search/search-what-is-azure-search) | 検索によって回答生成に必要なデータを提供 |
| [Azure Storage](https://learn.microsoft.com/ja-jp/azure/storage/blobs/storage-blobs-overview) | 構築したプロンプトフローの保存領域 |
| [Azure Container Registry](https://learn.microsoft.com/ja-jp/azure/container-registry/container-registry-intro) | プロンプトフローのパッケージ管理 |

ここではバックエンドの中核となるプロンプトフローについて実際の画面と共にご紹介します。右側が全体のフローの流れを表し、左側に各コンポーネントのコードを表示しています。

![PromptFlow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/163da2cf-b74b-3556-6cdf-893de7d279f2.png)

今回の例では（1）ユーザーの質問から検索したいクエリを抜き出す（extract_query_from_question）、（2）Wikipediaで検索する（process_search_result）、（3）検索結果をもとに回答を作成する（augmented_chat）、の順に処理を実行しアウトプットを生成します。実際にプロンプトフローを使ってみて私が感じたメリットは以下3点です。

1. テストが容易：GUIでオーケストレーターを構築することができ、テスト用のChat UIを使ってその場でテストできる
2. オーケストレーターを簡単にホストできる：画面左上のペインから各種ツールを呼び出すことができ、LangChainやSemantic Kernelといったオーケストレーションツールもすぐに活用することができる。自前で実行環境を用意する必要がない
3. テンプレートがありすぐに実装可能：以下の図のようにQ&A on Your DataやChat with Wikipedia、Q&A  Evaluationなどすぐに実装できるテンプレートが複数提供されている。今後充実していくことが見込まれる。

## フロントエンド（チャットUI）
生成AIチャットボットにおけるフロントエンドは、ユーザーとバックエンドへのインプット/アウトプットの間を支えるインターフェースとしてのチャットUIになります。フロントエンドを支える主なAzureサービスとして以下があります。

| サービス名 | 本構成における主な役割 |
|:-:|:-:|
| [Azure App Service](https://learn.microsoft.com/ja-jp/azure/app-service/overview) | チャットアプリケーションをホスト |
| [Azure Monitor Application Insights](https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/app-insights-overview) | アプリケーションのパフォーマンス監視 |

## ネットワーク・セキュリティ
ユーザーのクラウド上のAIチャットボットへのセキュアな通信を提供します。主なAzureサービスとして以下があります。

| サービス名 | 本構成における主な役割 |
|:-:|:-:|
| [Microsoft Entra ID](https://learn.microsoft.com/ja-jp/entra/fundamentals/whatis) | ユーザーIDの管理 |
| [Azure Application Gateway](https://learn.microsoft.com/ja-jp/azure/application-gateway/overview) | パブリックIPからの単一のエンドポイントとしてトラフィックを管理 |
| [Virtual Network](https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-overview) | Azure内の仮想プライベートネットワークを構成 |
| [Private DNS zone](https://learn.microsoft.com/ja-jp/azure/dns/private-dns-privatednszone) | プライベートエンドポイントの名前解決 |

### ユーザーIDの管理（Microsoft Entra ID）
ユーザーはパブリックネットワークを介してチャットUIへアクセスするのでIDによる認証フローを実装することで外部からのアクセスを制限します。Microsoft Entra IDを活用してアプリケーションへのアクセスの認証フローを実装します。以下のAzure Portalの画面のようにAzure App Serviceに認証ペインからIDプロバイダを設定し、認証を追加することができます。

![Authentication.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/38795de9-de77-2960-6b9f-b073bb302199.png)

### ネットワーク
Azure Application Gatewayによってクライアントトラフィックの単一で安全なエントリポイントを提供します。主なセキュリティ観点の提供機能は以下です。

Web Application Firewall（WAF）のポリシーを構成し、Web攻撃を軽減
- 以下の図はリファレンスアーキテクチャでデフォルトで構成されたポリシーです。Microsoftにより提供されているマネージドポリシー（1）ボットからの攻撃保護のためのポリシー、（2）Open Web Application Security Project (OWASP) が特定した脆弱性に対するベースラインセキュリティを提供するためのポリシーが設定されていました。
![WAF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/a802dd5d-455e-e6c8-d795-4b049e4aff4f.png)

- エンドツーエンドTLS暗号化
HTTPSを使用して転送中のデータを暗号化するための仕組みを提供します。

またAzureサービス間の通信はプライベートエンドポイントによりパブリックIPアドレスを指定を使用せずにプライベート仮想ネットワークから直接Azure PaaSサービスにアクセスできます。さらに仮想ネットワークのセグメント化により通信を必要なトラフィックのみに制限します。以下の図のようなサブネットが構築され、各サブネットに紐づけられたセキュリティグループによって受信と送信のトラフィックの規則を設定していることが確認できます。
![Subnet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/27832f32-ab1b-bc32-0417-1293ae899f0f.png)

# まとめ
AIチャットボットのリファレンスアーキテクチャの主要なコンポーネントについて説明しました。Azure Machine Learning Prompt Flowは現在プレビュー中ですが、テンプレートからのフローの構築や評価・テスト、ホスティングなどGUIから行うことができ、Azure上で生成AIアプリを構築する場合には活用必須だと感じました。フローのエクスポート/インポートも可能なため、構築したフローを別の環境にも転用できる点も有効で生成AIアプリのオーケストレーターの開発が捗りそうです。