Azure OpenAI on your data でノーコードで ChatGPT 対応エンタープライズサーチを構築する

# はじめに
Microsoft Build 2023 で発表のあった Azure OpenAI on your data のパブリックプレビューが開始されました。「on your data」の名前の通り、Azure OpenAI Studio の Chat Playground 上で **Azure Cognitive Search のデータを参照**し、モデルが知らない内容を答えられるようにしてからノーコードでAzure AD 認証付きチャットアプリのデプロイまでやってしまうという機能です。

https://techcommunity.microsoft.com/t5/ai-cognitive-services-blog/introducing-azure-openai-service-on-your-data-in-public-preview/ba-p/3847000

# 内部アーキテクチャ
「on your data」の仕組みは以下のようなアーキテクチャになっていると考えられます。考えられますというのは、Azure Cognitive Search からの Grounding の処理が on your data [REST API](https://learn.microsoft.com/en-us/azure/cognitive-services/openai/reference#completions-extensions) 内部で行われるため、詳細が隠蔽されているためです。今回使用する Azure OpenAI モデルが ChatGPT 系だけなので、検索クエリ生成も gpt-35-turbo を使っているかと思います。そして**ベクトル検索機能は使用されません**。
![017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/a03033fd-71be-38d8-daed-ce4c6fbd4d18.png)
すでにこのアーキテクチャは以下の記事で実装できるサンプルコードを紹介していますので、ご自分で構築されている方はあまり必要のない機能かと思います。

https://qiita.com/nohanaga/items/803c09b5a3a4e2d1776f

# 使用方法
[ドキュメント](https://learn.microsoft.com/en-us/azure/cognitive-services/openai/concepts/use-your-data)を参考に Chat Playground 上から設定します。現状データソースは 3 つから選択できます。
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/a84a7e92-8016-a77a-b7f3-54691b1c97dd.png)

# 日本語対応
パブリックプレビュー開始時点では**日本語での検索に制約がありますので以下の 1 のみが動作します。** 日本語で[セマンティック検索](https://qiita.com/nohanaga/items/4b9506c62b9e5796f405)は使用できません。

1. Azure Cognitive Search 既存インデックス連携
既存の[日本語アナライザー](https://qiita.com/nohanaga/items/7296505f7b63e23f94a6)を設定済みの**インデックスを用意してから**、Semantic search configuration を 「No semantic search configuration selected」状態で接続する必要があります。これはセマンティック検索クエリのパラメータ `queryLanguage` が `en-us` に固定されているためです。

1. Azure Blob Storage or Upload files 
Azure Blob Storage を用意して、コンテナーにファイルを格納しておけば、自動的にドキュメントをチャンク分割して Azure Cognitive Search インデックスとして登録してくれる機能。現状だと自動で英語アナライザー([standard.lucene](https://lucene.apache.org/core/6_6_1/core/org/apache/lucene/analysis/standard/StandardAnalyzer.html))のインデックスを作成してしまうので、日本語検索はうまくできません。（日本語だと一文字ずつトークナイズされているので、一見検索できているように見える）。現状は日本語にちゃんと対応したチャンク分割やインデックス作成をしてあげないといけないですが、早く改善してもらうために、試された方はフィードバックにご協力ください。

![013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/02568ba3-7f89-c494-d61e-62cb00efd48e.png)

はい、前回すでに[チャンク分割済み戦国武将データ](https://github.com/nohanaga/busho-index/blob/main/TextChunking_RegisterIndex.ipynb)を作ってましたので、すぐに Grounding できました。この Playground 上で、`system` メッセージなどをカスタマイズしたり、「Limit responses to your data content」をチェックすることで Azure Cognitive Search のデータのみから回答することができます。現状、すべてのプロンプトが公開されている[こちら](https://qiita.com/nohanaga/items/803c09b5a3a4e2d1776f)と比較して、Grounding の精度が悪い印象です。隠蔽されている部分のプロンプト、カスタムできるようにしてもらえないだろうか。フィードバックしておきます。一応戦国武将のデモ用のチャンク分割の[サンプルノートブック](https://github.com/nohanaga/busho-index/blob/main/TextChunking_RegisterIndex.ipynb)もあります。

https://github.com/nohanaga/busho-index/blob/main/TextChunking_RegisterIndex.ipynb


# Azure Cognitive Search へのデータ登録
Azure Cognitive Search へデータを登録する部分を含めた参考アーキテクチャですが、「on your data」がドキュメントのチャンク分割を含めた Ingest の部分を自動化しているのでとても楽になります。対応していないファイルや、高度な AI OCR が必要な場合などは、[Azure Form Recognizer](https://azure.microsoft.com/ja-jp/products/form-recognizer) も検討いただければと思います。
![016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/e002cc28-574d-bdee-b069-0f6e5532bb58.png)

# デプロイ
Chat Playground の右上にある「Deploy to...」ボタンをクリックすると、Azure AD 認証付きチャットアプリを App Service にデプロイできます。デフォルトで Azure AD 認証がかかるように設定されていますが、企業データを扱われる方は通信等のセキュリティには注意してください。
![010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/9aa17d91-79e7-8ebe-af0c-aafbbf669e63.png)
Azure Cognitive Search でヒットした検索結果を表示する引用機能もあります。
![011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/6483467b-6a0a-f374-390f-fc27799eea18.png)

# REST API
Azure OpenAI on your data は [REST API](https://learn.microsoft.com/en-us/azure/cognitive-services/openai/use-your-data-quickstart?pivots=rest-api&tabs=command-line#example-curl-commands) 経由でも呼び出すことができます。この実装では、Azure Cognitive Search へのクエリー変換やデータの Grounding 部分は `extensions/chat/completions` API 側が行う処理のためこの部分だけはカスタマイズすることができません。

```sh
curl -i -X POST $AOAIEndpoint/openai/deployments/$AOAIDeploymentId/extensions/chat/completions?api-version=2023-06-01-preview \
-H "Content-Type: application/json" \
-H "api-key: $AOAIKey" \
-H "chatgpt_url: $ChatGptUrl" \
-H "chatgpt_key: $ChatGptKey" \
-d \
'
{
    "dataSources": [
        {
            "type": "AzureCognitiveSearch",
            "parameters": {
                "endpoint": "'$SearchEndpoint'",
                "key": "'$SearchKey'",
                "indexName": "'$SearchIndex'"
            }
        }
    ],
    "messages": [
        {
            "role": "user",
            "content": "三浦義澄って何した人"
        }
    ]
}
'
```

# エンタープライズセキュリティ
「on your data」機能はどなたでも手軽に試せるツールといった位置付けです。実際にエンタープライズで利用する場合は以下も検討ください。

## 閉域網(VNET)構成
エンタープライズでのセキュアな利用は以下のような閉域網構成も構築可能です。設定はご自分で行う必要があります。
![014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/0944519d-7a63-2035-2024-b6d30803b4b7.png)

https://qiita.com/nohanaga/items/a18009f8b605591348fe#7-azure-openai-%E3%82%92-vnet-%E3%81%AB%E9%99%90%E5%AE%9A%E3%81%99%E3%82%8B%E8%A8%AD%E5%AE%9A

## セキュリティフィルター
エンタープライズで Azure Cognitive Search を利用する場合、セキュリティフィルターの考慮が重要になります。Azure AD と連携させてユーザーごとにドキュメントを出し分けるという利用方法はよくあるニーズですので、以下を参考にフィルタークエリの利用を検討してください。

https://learn.microsoft.com/azure/search/search-security-trimming-for-azure-search-with-aad

# カスタマイズ
チャット UI のフロントエンドについては、以下の GitHub にて公開されているのでカスタマイズすることができます。

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

このリポジトリの `/scripts` にドキュメントをチャンク分割して日本語インデックスを作成して登録するスクリプトが用意されてますので、ノーコードではないですがご確認ください。

# おわりに
Azure Cognitive Search を用いたデータの Grounding を簡単に試しながらチャットアプリまでデプロイできるようになりました。現在は日本語対応が甘いですが、[Azure Cognitive Search Workshop](https://github.com/nohanaga/Azure-Cognitive-Search-Workshop) を行っていただくと、インデックスの作成方法から検索クエリーの理解まで通してできますのでおすすめです。