Azure OpenAIで独自データ追加機能(Add your data)を試してみた

# はじめに
23年6月19日にAzure OpenAIに独自データを追加できる機能「Add your data」がパブリックプレビューで発表されました。GPTは自分が知らない情報に関して、答えることができないですが、この機能を使うことで独自のデータとGPTモデルを簡単に連携させることができ、GPTが知らない独自のデータを参照して回答を生成できるようになります。また、回答のソースを独自データに限定することもできるので、ChatGPTの活用の幅が大きく広がります。

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

一通り使ってみたので、具体的な利用方法を解説していきます(公式ドキュメントにも詳しく記載されています)。

https://learn.microsoft.com/en-us/azure/cognitive-services/openai/use-your-data-quickstart?tabs=command-line&pivots=programming-language-studio

(23年9月追記)
Add your dataにベクトル検索の機能が追加されました。詳細はこちらのブログで丁寧に解説されていますので、ご参照ください。

https://zenn.dev/microsoft/articles/06063068b75a91

# 独自データの追加
使えるモデルはチャット形式のモデル「gpt-3.5-turbo」「gpt-4」になります。

https://learn.microsoft.com/en-us/azure/cognitive-services/openai/concepts/use-your-data#what-is-azure-openai-on-your-data

Azure OpenAI Studioのチャットを開くと[アシスタントのセットアップ]のウィンドウに「Add your data」が追加されています。[Add a data source]をクリックしましょう。

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/237d57e2-39a8-c368-5b9c-c17358c00a8c.png)

現時点(23/6/20)プレビュー版では、「Azure Cognitive Search」「Azure Blob Storage」「Upload files」の3つのデータソースが選べます。どのサービスを選んだとしても、Cognitive Searchによってインデックス化されて、データを利用することになります。今回はローカルにあるPDFを追加したいので、[Upload files]をクリックします。
![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/fe884071-e192-ec13-3e2e-436d4e3d2174.png)

アップロードするBlob storageのリソースとインデックスを作成するCognitive Searchのリソースを事前に用意しておき、こちらの画面から指定します。CORSの設定もワンクリックでできます(画面は設定完了済みです)。最後にCognitive Searchのインデックス名を入力して、[次へ]をクリックします。
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/dd01f021-c7b1-3e3e-dd90-309912481961.png)

対応しているファイル形式はこちらです。

https://learn.microsoft.com/en-us/azure/cognitive-services/openai/concepts/use-your-data#data-formats-and-file-types

PDFをアップロードしましょう。
![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/179cd0c1-ba39-e789-b82f-0b990a6287a6.png)

今回試すPDFはこちらです。Azure OpenAIの公式ドキュメントをPDFにしたものになります。
![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/af968fcc-22e2-ea98-c679-a09f5e2da9ff.png)

以上で設定は完了です。
![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/354eab4e-cb25-daa3-fbc7-7f6e3198d6ea.png)

「Limit responses to your data content」の選択にチェックを入れれば、データソース内の範囲でしか回答しなくなります。一度、Cognitive Searchのインデックスを見に行きましょう。
![画像8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/12da3510-d629-3180-15da-190377601203.png)

1つのPDFをアプロードしただけですが、6つのドキュメントに分かれて格納されています。**GPTから呼び出す時のトークン数に引っかからないように、上手いことチャンク分割されていている**んですね。素晴らしい！
![画像9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/cf47526f-12a6-e4ca-03d9-b32594288de0.png)
インデックスの設計もfilepathやurlなどの情報が含まれており、最適化されていています。一度、Cognitive Searchでインデックスを作ったことがある人なら分かりますが、チャンク分割やインデックス設計を自動でやってくれるのは本当にありがたいです！

:::note warn
Add your data経由でCognitive Searchのインデックスを作成した場合は、contentフィールドのアナライザーが英語(デフォルト)になるようで(6/20時点)、日本語での検索の精度が悪くなるみたいです。従って、現状はCognitive Searchのインデックス作成までは自前で行って、Add your dataで連携させるのがベストプラクティスになりそうです。

Cognitive Searchのインデックス作成の支援ツールもあり、こちらを使うと言語も柔軟に設定してくれそうです。
https://github.com/microsoft/sample-app-aoai-chatGPT/tree/main/scripts
:::

(6/22)対処方法を記事にまとめました。

https://qiita.com/tmiyata25/items/e8866dfed6dd4b9a02ad

# いろいろ聞いてみる
いろいろ聞いてみました。
![画像10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/e693a8f9-e5d3-c51a-6ec8-488355b155a9.png)

「どんなモデルがある？」という質問に対しては、ドキュメント内から適切に回答してくれました。「好きな食べ物は？」という質問に対しては、ちゃんと分からないと、答えてくれています。「GPT-5について教えて」という質問に対しては、「GPT-3が最新のモデル」と答えちゃっています(正しくはGPT-4)。とはいえ、「GPT-5はOpenAIの最新のモデルで～」みたいな間違い方はしていないですね。

下のreferencesの部分をクリックすると、根拠となるドキュメントを知ることができ、右側でそのドキュメントの内容を確認することができます。便利すぎる！
![画像13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/7740557c-b235-9454-1344-619f70f2cfff.png)
ただし、この参照されているドキュメント、ちょっとずれているような気がしてて、そこは要検証ですね、、


# アプリのデプロイ
Add your dataで連携させたプレイグラウンドはWebアプリとしてデプロイできます。
![画像11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/6481ba87-0276-ec2a-c967-4653e473ac1d.png)

Web Appsへデプロイするために必要なリソースグループやリージョン、価格プランなどを選択します。作成されたアプリにはAzure Active Directoryの認証がかかっているので、デモなどでURLを公開してしまうケースでも安心してお使いいただけます。
![画像12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/7fe79395-db65-c15d-1d5e-ea2670a2935f.png)

デプロイされたアプリはこんな感じです。
![画像14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/2bb4dfa0-bb96-26ae-6e2a-53a1c25571cc.png)

# API連携に関して
API連携の部分はこちらの07JP27さんのブログがとても参考になります。

https://zenn.dev/microsoft/articles/azure-openai-add-your-data

APIリファレンスをみると、Completions extensionsというAPIが追加されています。APIのバージョンは```2023-06-01-preview```のみとなります。

https://learn.microsoft.com/en-us/azure/cognitive-services/openai/reference#completions-extensions

具体的には下記のように```dataSources```にCognitive Searchの情報追加するだけでAzure OpenAI自身がCognitive Searchと連携して答えを返してくれるようです。
```
$ curl -i -X POST YOUR_RESOURCE_NAME/openai/deployments/YOUR_DEPLOYMENT_NAME/extensions/chat/completions?api-version=2023-06-01-preview \
-H "Content-Type: application/json" \
-H "api-key: YOUR_API_KEY" \
-H "chatgpt_url: YOUR_RESOURCE_URL" \
-H "chatgpt_key: YOUR_API_KEY" \
-d \
'
{
    "dataSources": [
        {
            "type": "AzureCognitiveSearch",
            "parameters": {
                "endpoint": "'YOUR_AZURE_COGNITIVE_SEARCH_ENDPOINT'",
                "key": "'YOUR_AZURE_COGNITIVE_SEARCH_KEY'",
                "indexName": "'YOUR_AZURE_COGNITIVE_SEARCH_INDEX_NAME'"
            }
        }
    ],
    "messages": [
        {
            "role": "user",
            "content": "What are the differences between Azure Machine Learning and Azure Cognitive Services?"
        }
    ]
}
'
```

# 「Add your data」で出来る事と出来ない事
「Add your data」は簡単に独自データにつなげる事ができる一方で、日本語の精度がイマイチであったり、閉域構成がとれない、といった出来ない事も存在します。詳しくは07JP27さんのブログで記載されていますので、是非ご確認ください！

https://zenn.dev/microsoft/articles/azure-openai-add-your-data-procon


# まとめ
いかがでしたでしょうか？ChatGPTと独自のデータを連携させるには、オーケストレーションのプログラム開発やナレッジベースの作成が必要であり、実装に結構時間がかかりました。今回の機能で、お手軽に独自データと連携できるようになったと思いますので是非お試しください。