Power Virtual Agentsで社内文書を読み込んでトピックを作成する


# はじめに

Power Virtual Agents のトピックの提案機能では公開された文書の読み込みにしか対応していません。公開できない社内文書を読み込むにはどのようにすべきか、ここではその方法を紹介します。

## 対象者

Power Virtual Agents の初心者の方
Power Virtual Agents でトピックの提案機能を使いたい方
公開できない社内文書からトピックを作成したい方

:::note
Power Virtual Agents は以降PVAと表記。
:::

# 公開できない社内文書を読み込んでトピックを作成

今回は公開できない社内文書を Azure Blob Storage にアップロードし、その URL を PVA のオンラインコンテンツとして指定することでトピックの作成を行いました（下図）。
![14社内文書取込結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025334/fa67c4a1-6665-c5f0-b880-0d15808ebb1a.png)

## トピックの作成手順

具体的な作成手順は以下の通りで、以降説明していきます。

1. ストレージアカウントを作成する。
2. ネットワークアクセスの設定で、PVAが使用するIPアドレスを追加する。
3. コンテナーを作成する。（アクセスレベルはコンテナーかBLOBを選択）
4. 社内文書をアップロードする。
5. PVAのトピックの提案を実行する。

# 経緯

ChatGPT 4.0 のリリースが発表され、ほとんどの内容は ChatGPT を利用すればいいのかなと思いますが、さすがに社内固有の情報について ChatGPT を利用することはできません。そこで、PVA の利用を考えました。

![01PVA利用シーン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025334/ddce95bb-5998-94f7-902f-33f5b61585b8.png)

実際、ChatGPT に PVA の使い道を訊いてみると、4.内部サポート として挙がってきました。

![02PVA使い道.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025334/fa6250e6-5969-d299-2d50-07624bc89edd.png)

# トピックの提案

PVA に **トピックの提案** という機能があり、既存の社内文書をもとに問い合わせトピックを作成してくれます。

:::note
トピックの提案は、FAQ またはサポート構造を使用して、コンテンツからトピックを抽出する機能です。 構造が異なる Web ページは、予想どおりに機能しない可能性があります。 Web ページからコンテンツを抽出できない場合は、コンテンツを CSV ファイルとして提供してみてください。
引用元 https://learn.microsoft.com/ja-jp/power-virtual-agents/advanced-create-topics-from-web
:::
![03トピックの提案.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025334/4e598112-bdba-d900-b5ae-a899b841d8e1.png)

## トピックの提案でサポートされているコンテンツ

トピックの提案機能は現時点（2023年3月）でファイルのアップロードには対応しておらず、下図の要件を満たす必要があります。ですが、この要件は公開できない社内文書を保存しておける環境ではありません。
（そのうちアップロードにも対応してくれるのではないかと期待していますが）

![04サポートされているコンテンツ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025334/4c42f950-9742-e7c6-7450-57059dfd0ce0.png)

## ストレージアカウントの設定

今回は Azure Blob Storage に社内文書を保存する方法で進めました。Azure Blob Storage では PVA からのアクセスのみを許可して、PVA 以外のアクセスを禁止するようにできれば要件をクリアできるはず。

![05社内文書への不正アクセス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025334/1b2c00d0-a87f-c1a8-5d34-72a5784839ae.png)

PVA からのアクセスのみを許可する方法、思い付くのはIPアドレスによるフィルタリングでした。
Azure Blob Storage のネットワーク設定の画面で許可するIPアドレスを追加していけば実現できるはず。

![05AzureBlobStorageの設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025334/66e7704c-458f-0e73-60fc-f26dbb47f3c2.png)

## PVA が使用するIPアドレス

Microsoft の公式サイトに公開されています。
➡[PVA のクォータ、制限、構成の値](https://learn.microsoft.com/ja-jp/power-virtual-agents/requirements-quotas#required-services)
日本リージョンで使用されるIPアドレスは下図の通りでしたので、これをもとに設定を進めます。

![06日本リージョンでのPVAのIPアドレス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025334/6fa11127-8057-c73f-52e2-baa765368a08.png)

## アクセスを許可するIPアドレスの追加

IPアドレスの設定は、**IPアドレス** か **CIDR形式** である必要があるため、サイトの情報そのままでは設定できません。Excelで加工して CIDR形式 にしています。実際に追加するのは、Azure Portalからではなくコマンドで行いたいため、数式を使ってコマンド文字列を作成しています。

:::note warn
今回はCIDR形式で設定するため、20.43.71.224-20.43.71.255 を 20.43.71.0/24 のように置き換えています。このため、PVA の使用IPアドレス範囲を超えてアクセスが許可されています。現状この方法しか思い付かなかったためとなりますので、ご注意ください。
:::

:::note
```powershell:IPアドレスを追加するためのコマンド
az storage account network-rule add --resource-group "[resourcegroup]" --account-name "[storageaccount]" --ip-address "[ipaddress]"
```
:::

Excelで加工したときの状態。
![07IPアドレス群の許可.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025334/c55b465a-8a08-f048-f55e-f7c5f11274ce.png)

Azure Portal のツールバーにある Cloud Shell ボタンをクリックすると、コマンドラインのペインが表示されるので、ここで生成したコマンドを入力していく。

![08コマンド実行.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025334/ade6016e-371c-6463-f59f-7fed16b13228.png)


コマンドで追加した結果。

![09コマンド実行結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025334/d9044251-d0c5-5390-4854-43800fc11bf0.png)

PVA からのみアクセスできるように設定できたので、下表の通りコンテナーを作成します。
その後作成したコンテナーに社内文書（InternalUseOnly.docx）をアップロードします。

|項番|コンテナー名      |アクセスレベル |アクセスした結果|
|---:|-----------------|-------------|---------------|
|   1|public-container |コンテナー    |アクセスできる  |
|   2|blob-container   |BLOB         |アクセスできる  |
|   3|private-container|プライベート  |アクセスできない|

![10コンテナ作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025334/2d544fbb-37c9-6a16-09bb-386e7fd915be.png)

:::note warn
アクセスレベル＝プライベートは外部からアクセスできないんだろうなとは予想できますが、アクセスレベル＝コンテナーと BLOB は正直違いが分かっておりません。ご容赦ください…
:::

## 作成したコンテナー上の社内文書にアクセスした結果

コンテナー上の社内文書にHTTPリクエストを送信したところ、上の表のアクセスした結果の通りとなりました。

:::note warn
クライアントからアクセス可否を確認するためには、アクセスを許可するIPアドレスに追加する必要があります。
![11アクセス確認用の設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025334/f63dd251-bc34-8fe8-5022-6863e42e2768.png)
:::



```powershell:public-container にアップロードした社内文書にアクセスした結果
PS C:\Users\******> Invoke-WebRequest -URI 'https://st4pva.blob.core.windows.net/public-container/InternalUseOnly.docx'

StatusCode        : 200
StatusDescription : OK
Content           : {80, 75, 3, 4…}
RawContent        : HTTP/1.1 200 OK
                    ETag: 0x8DB267F1472320E
                    Server: Windows-Azure-Blob/1.0
                    Server: Microsoft-HTTPAPI/2.0
                    x-ms-request-id: ddcb99be-301e-0050-2a1b-5e81dd000000
                    x-ms-version: 2009-09-19
                    x-ms-lease-sta…
Headers           : {[ETag, System.String[]], [Server, System.String[]], [x-ms-request-id, System.String[]], [x-ms-vers
                    ion, System.String[]]…}
RawContentLength  : 24509
RelationLink      : {}
```

```powershell:blob-container にアップロードした社内文書にアクセスした結果
PS C:\Users\******> Invoke-WebRequest -URI 'https://st4pva.blob.core.windows.net/blob-container/InternalUseOnly.docx'

StatusCode        : 200
StatusDescription : OK
Content           : {80, 75, 3, 4…}
RawContent        : HTTP/1.1 200 OK
                    ETag: 0x8DB267F230ACFCC
                    Server: Windows-Azure-Blob/1.0
                    Server: Microsoft-HTTPAPI/2.0
                    x-ms-request-id: ee1cf8f4-d01e-0058-091a-5e9bd2000000
                    x-ms-version: 2009-09-19
                    x-ms-lease-sta…
Headers           : {[ETag, System.String[]], [Server, System.String[]], [x-ms-request-id, System.String[]], [x-ms-vers
                    ion, System.String[]]…}
RawContentLength  : 24509
RelationLink      : {}
```

```powershell:private-container にアップロードした社内文書にアクセスした結果
PS C:\Users\******> Invoke-WebRequest -URI 'https://st4pva.blob.core.windows.net/private-container/InternalUseOnly.docx'
Invoke-WebRequest: ResourceNotFoundThe specified resource does not exist.
RequestId:7662f44f-101e-0035-511b-5e2f99000000
Time:2023-03-24T06:38:48.1098402Z
```

:::note
クライアントのIPアドレスを追加しない場合、アクセスできないことも確認しています。

```powershell:public-container および blob-container にアップロードした社内文書にアクセスした結果
PS C:\Users\******> Invoke-WebRequest -URI 'https://st4pva.blob.core.windows.net/public-container/InternalUseOnly.docx'
Invoke-WebRequest: AuthorizationFailureThis request is not authorized to perform this operation.
RequestId:1e10bf5e-b01e-0095-5520-5eab38000000
Time:2023-03-24T07:15:05.1582253Z

PS C:\Users\******> Invoke-WebRequest -URI 'https://st4pva.blob.core.windows.net/blob-container/InternalUseOnly.docx'
Invoke-WebRequest: AuthorizationFailureThis request is not authorized to perform this operation.
RequestId:0de688ef-701e-0023-0e20-5ed94e000000
Time:2023-03-24T07:15:01.7957341Z
```
:::
# まとめ

PVAのトピックの提案機能がアップロードに対応していなかったため、公開できない社内文書からトピックを作成することはできないかと思いましたが、Azure Blob Storage を利用することで実現できました。私のようなAzure初心者でもできたので、おすすめです。
うまくいかないところや気になる点があれば、コメントお願いします。