Security Copilot で自社ナレッジ情報を参照させてみる ～ Azure AI Search サービスとファイルアップロード～

# 1. はじめに
Microsoft Security Copilot の高度なテクニックとして、自社のナレッジ情報のファイルを登録させておいて、インシデント検知時にナレッジ情報を参照させて回答させることが出来ます。MS Learn サイトに[ドキュメント](https://learn.microsoft.com/en-us/copilot/security/connect-org-kb)されているのですが、手順が分かり難いので残しておきます。

# 2. Security Copilot ナレッジ情報を参照させるメリット
想定する用途としては、自社で有するガイドラインや対応手順といったデータベースを AI を用いて読み込ませて自動回答させるニーズに適しています。
- 自社コンプライアンス規定を参照させる
- 対応手順などのテンプレート
- 自社 Wiki などの情報

:::note info
Azure AI 検索プラグインまたはファイルアップロードを使用すると organization のセキュリティ サポート情報などのビジネス コンテキストを Microsoft Security Copilot に取り込んで、セッションで直接参照できます。

組織のサポート技術情報には、Wiki、ポリシーおよびコンプライアンス文書、調査および対応手順のテンプレート、履歴データ、KQL (Kusto クエリ言語) ライブラリなどの組織の専有情報のリポジトリ、さらには Microsoft Learn ドキュメント、規範的なガイドライン、フレームワークなどのパブリック リポジトリからの情報が含まれる場合があります。

この豊富な知識を Copilot に統合することで Copilot はサポート情報またはドキュメントを推論し、より関連性が高く、具体的で、運用上のニーズに合わせてカスタマイズされた応答を生成できます。
:::

# 3. 自社ナレッジを取り込む 2 つの方法
2025.5 現在、Security Copilot よりナレッジファイルを参照させる手法は 2 つあります。
| 方法 | 説明 | メリット | デメリット |
|:---|:---|:---|:---|
| Azure AI Search プラグイン | 組織のサポート技術情報を含む Azure AI Search インデックスを作成する | - 複数ファイルでもOK<BR> - 対応する[ドキュメントの形式](https://learn.microsoft.com/ja-jp/azure/search/search-howto-indexing-azure-blob-storage#supported-document-formats)が豊富<BR> - カスタマイズ性が高い<br>- OCR スキャナなどの情報も参照できる<BR> - Free Tier が提供されている<br> - Security Copilot を利用する全ユーザーがデータ参照できる | - Azure AI Search のスキル習得が必要 |
| ファイルアップロード | Security Copilot ポータルから、各ユーザー単位でファイルをアップロードする | - 設定が容易<br> - ユーザー単位で実施出来る | - 対応するファイル形式が限定的<br> - カスタマイズは不可<br> - ユーザー単位での設定のため、全社共通としてのナレッジ登録は不可 |

詳細は公式サイトを参照下さい。

https://learn.microsoft.com/ja-jp/copilot/security/connect-org-kb#options-for-connecting-a-knowledge-base

# 4. 試してみる - 設定例
## 4.1 Azure AI Search プラグイン
Azure AI Search プラグインの手順例です。
2025.5 現在、Azure AI Search プラグインを用いた構成の場合、以下注意点があります。
**特にベクトル化の際に用いる Azure OpenAI モデルは指定モデルになっているため注意が必要です**

- ``text`` フィールドは検索可能である必要があります
- ``title`` フィールドはフィルター処理できる必要があります
- ``vector`` フィールドには **``text-embedding-ada-002``** を使用する必要があります

インデックスを効率的に作成する手法として、公式サイトに掲載されている[統合ベクトル化を使用する方法](https://learn.microsoft.com/ja-jp/azure/search/search-get-started-portal-import-vectors?tabs=sample-data-storage%2Cmodel-aoai%2Cconnect-data-storage)が分かりやすいので、今回はこの手法を用いています。

### 4.1.1 事前準備 - Azure Blob ストレージと Azure OpenAI の作成
データを取り込むために、格納先の Azure Blob ストレージと、Azure OpenAI サービスを作成しておきます。

- Blob ストレージには検索対象として用いるドキュメントを格納しておきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/300d1a85-71dc-4a97-97e4-4a0f7f61d825.png)

- Azure OpenAI サービスは、プラグインで指定されている ``text-embedding-ada-002`` をデプロイしておきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/80ed40df-2593-4862-b595-f2bcbcccdbc5.png)

### 4.1.2 Azure AI Search サービスの作成
Azure 画面より、「検索サービス」よりリソースを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/bc3202f2-b60d-45d0-af0f-1f18f6d18079.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/d482c17a-195d-4e4d-814d-639b3653ff15.png)

### 4.1.2 Azure AI Search サービスの権限設定
作成した Azure AI Search サービス側に対して、Azure OpenAI の利用権限と、Azure Blob ストレージに格納されたドキュメントを読み出すための権限を与える必要があります。「Cognitive Services ユーザー」と「ストレージ BLOB データ閲覧者」の権限を付与します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/c2e14d0e-7c54-4cc5-8e91-38eab9aad9e8.png)

### 4.1.3 Azure AI Search サービスからデータをインポートする
Azure AI Search サービスに戻って、「データのインポートとベクター化」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/9a3d0fff-f1e5-4928-a3d7-37acc333d920.png)

- 「データへの接続」より「Azure BLOB ストレージを選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/fe29cf9e-fc31-4c78-a2a3-d6919f6b411c.png)

- Azure Blob Storage の構成画面で、対象先を指定します
    - 先に作成した Azure Blob ストレージ、Blob コンテナー名を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/b72defd1-0a36-4323-b0a8-8755d5d861eb.png)

- 認証設定が正しければ、次の「テキストをベクトル化する」画面に移れます
    - Azure OpenAI サービスで作成した ``text-embedding-ada-002`` を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/601fecdd-5d07-4a30-988f-469ee6d55708.png)

- （オプション）画像ファイル、スキャンデータの場合は、「画像をベクター化してエンリッチする」より構成します
    - 今回は Word ドキュメントの文字データだけなので、省略しました

- 詳細設定にて、インデックスフィールドを確認します
    - フィールドの値は初期値で以下のように定義されています。今回のドキュメントでは初期値のまま設定してみました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/3b078b59-9677-4d92-9b27-dcc7866ac28b.png)

| フィールド | 適用対象 | 説明 |
|:--- |:---|:---|
| ``chunk_id`` | テキストと画像ベクトル | 生成された文字列フィールド。検索可能、取得可能、並べ替え可能。これはインデックスのドキュメント キーです |
| ``text_parent_id`` | テキスト ベクトル | 生成された文字列フィールド。取得可能、フィルター可能。チャンクの作成元である親ドキュメントを識別します |
| ``chunk`` | テキストと画像ベクトル | 文字列フィールド。データチャンクの人間が判読可能なバージョン。検索可能で取得可能ですが、フィルター可能、ファセット可能、または並べ替え可能ではありません |
| ``title`` | テキストと画像ベクトル | 文字列フィールド。人間が読みやすいドキュメントのタイトル、ページタイトル、またはページ番号。 検索可能で取得可能ですが、フィルター可能、ファセット可能、または並べ替え可能ではありません |
| ``text_vector`` |	テキスト ベクトル | Collection(Edm.single)。 チャンクのベクトル表現。 検索可能で取得可能ですが、フィルター可能、ファセット可能、または並べ替え可能ではありません |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/937afa38-4fbe-4dcb-b5f2-278849b5317f.png)

- 最後に「レビューと作成」画面に移って、「作成」ボタンを押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/673e74b2-5e4c-495d-85b5-8d023330bc82.png)

- 「インデクサー」画面より、Azure Blob Storage のファイルが解析されると、以下のように成功記録が確認出来ます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/c2902b89-a313-4fb8-b9e8-f5631335910a.png)

- 「インデックス」画面より、ベクトルインデックスによって作成されたインデックス情報を確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/67992206-2258-4f84-b39a-b9a3a40fec30.png)

格納したドキュメントの内容に沿って、インデックス情報から固有名詞などで検索を実施してみると、``text`` フィールドや、``highlights`` フィールドで応答が返って来ます。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/7d39b98e-3826-4722-bd79-49343946e556.png)



### 4.1.5 Security Copilot から Azure AI Search プラグインを設定する
Azure AI Search サービスの準備が終わったら、Security Copilot プラグインの設定を行います。
Security Copilot のリソースを作成後、プラグインより Azure AI Search を有効化し、設定ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/0c428118-666a-435a-97be-b1df123eb4cf.png)

Azure AI Search の設定パラメータを入力します。
2025.5 現在、Security Copilot と Azure AI Search との接続はパブリック網経由で VNET 閉域などのプライベートエンドポイント接続は対応していないのでご注意下さい。
パラメータは Azure AI Search サービスのデータインポート設定の際に指定するフィールド値を正しくマッピングする必要があります。

| パラメータ | 説明 |
|:---|:---|
| Name of Azure AI Search Service | Azure AI Search サービスの名称 |
| Name of index | Azure AI Search サービスで設定したインデックス名称 |
| Name of vector field in index | Azure AI Search サービスで設定した[ベクトルインデックス](https://learn.microsoft.com/ja-jp/azure/search/vector-search-how-to-create-index?tabs=config-2024-07-01%2Crest-2024-07-01%2Cpush%2Cportal-check-index)名称。<BR>※本ケースではデフォルト値 ``text_vector`` を指定 |
| Name of text field in index | Azure AI Search サービスでテキスト情報を埋め込んだフィールド値。<BR>※本ケースではインデックスのドキュメント キー ``chunk_id`` を指定 |
| Name of title field in index | Azure AI Search サービスでタイトル情報を埋め込んだフィールド値。<BR>※本ケースではドキュメント本文である ``title`` を指定 |
| Value  | Azure AI Search サービスの API キー |


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/a8a66887-ac39-4141-b617-49d7ca4f31c6.png)

### 4.1.6 Security Copilot からプロンプトで試す
設定が完了したので、Security Copilot からプロンプトを打って試してみます。
公式サイトに掲載されている[サンプルプロンプト](https://learn.microsoft.com/ja-jp/copilot/security/connect-org-kb#prompting-for-a-knowledge-base-connected-using-azure-ai-search)を参考に問い合わせた例です。

```text
Azure AI Search インデックスを検索します。xxx について回答して
```

今回は Microsoft セキュリティコンプライアンスの FAQ ドキュメントをアップロードしましたので、以下のようにプロンプトを投げてみました。

```text
Azure AI Search インデックスを検索します。Microsoft の暗号化について教えてほしい。
```
応答が以下のように返ります。
```markdown
Microsoftのクラウドのセキュリティとコンプライアンスに関する文書によると、Microsoftはデータの暗号化に関して以下のような取り組みを行っています。

1. **データの暗号化**:
   - Microsoftは、データの保護のために暗号化技術を使用しています。これには、データが保存されているとき（静止データ）と、ネットワークを通じて転送されるとき（転送中データ）の両方が含まれます。
   - 静止データの暗号化には、Azure Storage Service Encryption（SSE）やSQL Database Transparent Data Encryption（TDE）などの技術が使用されます。
   - 転送中データの暗号化には、Transport Layer Security（TLS）やSecure Sockets Layer（SSL）などのプロトコルが使用されます。

2. **キー管理**:
   - Microsoftは、暗号化キーの管理に関しても高度なソリューションを提供しています。これには、Azure Key Vaultを使用したキーの生成、管理、監査が含まれます。
   - ユーザーは、自分のキーを管理することも、Microsoftが提供するキー管理サービスを利用することもできます。

3. **コンプライアンス**:
   - Microsoftの暗号化技術は、さまざまな業界標準や規制に準拠しています。これには、ISO/IEC 27001、SOC 1、SOC 2、GDPRなどが含まれます。

これらの取り組みにより、Microsoftはクラウド環境におけるデータの機密性、完全性、および可用性を確保しています。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/f4bc09a3-0793-44ad-bfa3-ae30f31cd6ef.png)

実際に用いているスキル情報、詳細をチェックすると、「Choose Azure AI Search」が選択されており、プロンプトのリクエストに対して、AI Search サービスのインデックス情報を探していることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/fe51df87-ee53-4d7f-ae67-fa0e3f5db16e.png)

## 4.2 ファイルアップロード
ファイルアップロードによるナレッジファイルの検索は容易に設定出来ます。
但し、簡易版であるためドキュメントサイズの制限( 3MB 以下)や、ドキュメント拡張子が ``docx``、``pdf``、``txt``、``md`` の制限事項が有ること、ユーザー単位での設定のため、ナレッジファイルの共有が出来ない点に注意する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/9ac13586-da2f-4fbe-bf66-7db8e26bc523.png)

ファイルは個々のファイル毎にアップロードする仕組みです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/bf215001-b40a-4c93-8e2d-f5096f047808.png)

プロンプトは以下のように「アップロードされたファイル～」といったファイル名を直接指定して問い合わせを行います。単体ファイル毎の問い合わせになるため、複数ファイルなどのナレッジ検索の場合は Azure AI Search サービスを用いる必要があります。

```text
アップロードされたファイル xxx を参照、xxx を教えて
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/3244a2a7-4dff-4f10-bf0d-ca302ce6d96a.png)

# 5. まとめ
Security Copilot の活用の応用編として、お客様から自社ナレッジ情報の活用検討を期待する声が大きいのですが、このように Azure AI Search サービスを用いて複数ファイルの一括インデックスを作成したり、単体ファイルを用いて参照させることが出来るようになります。本記事が Security Copilot にご興味ある方々のためになれば幸いです。

＊本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。



# 参考文献

https://learn.microsoft.com/ja-jp/copilot/security/plugin-azure-ai-search

https://learn.microsoft.com/ja-jp/azure/search/search-get-started-portal-import-vectors?tabs=sample-data-storage%2Cmodel-aoai%2Cconnect-data-storage

https://learn.microsoft.com/ja-jp/copilot/security/upload-file