生成AI用Cognitive Searchの言語アナライザーを日本語にしたい

# 6/22時点の課題
先日(6/19)発表されたAzure OpenAIのAdd your dataの機能を使うと簡単に独自データと連携できることを前回の記事で記載しました。「Upload files」を使うと手元にあるPDFをアップロードするだけで、チャンク分割からインデックス作成までワンクリックで自動実行され、GPTと連携することができます。

https://qiita.com/tmiyata25/items/75a370154c28ee6c6983

しかし、Add your data経由でCognitive Searchのインデックスを自動作成した場合、いくつかの課題があります。
1. [検索精度] Add your data経由でインデックスを作ると、contentフィールドの言語アナライザーが英語(デフォルト)になり、Cognitive Search自身の日本語の検索精度が少し悪い。使えないことは無いけど本番化にあたってはもう少し頑張ってほしいレベル。
1. [更新の自動化] Cognitive Searchにインデクサーが作成されないので、ナレッジベースを更新する際は手動でインデックスを更新する必要がある。インデクサーがあれば、データソースに対して定期的にスキャンをかけてインデックスを更新できるのだが。。。

Cognitive Searchを自分で構築すれば上記の二つの課題は解決されるのですが、インデックスの作成、インデクサーのマッピング、チャンク分割、など、Cognitive Searchに精通している人でも結構しんどい作業が待ち受けています。特にチャンク分割に関しては、生成AI流行前は需要が無かったので実装に関する情報が少ないです。

といったこともあり、何とかAdd your dataのインデックス自動作成機能だけ上手く使いたい、というモチベーションがあります。今回は1を解決するために公式が用意しているデータ準備ツールを紹介します。

# データ準備ツール
公式が用意しているデータ準備ツール([リンク](https://learn.microsoft.com/en-us/azure/cognitive-services/openai/concepts/use-your-data#data-source-options))の挙動は下記の通りです(ドキュメントがPDFの場合)。
1. ローカルのドキュメントをForm Recognizerでテキスト化
1. テキストをチャンクに分割
1. 分割されたテキストをCognitive Searchのインデックスとして作成

事前にCognitive SearchとForm Recognizerを準備する必要があります。Form Recognizerのリソース作成方法はこちらをご参照ください。

https://qiita.com/tmiyata25/items/e0d6d2fb759acb9796dd#%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90

Cognitive Searchのリソース作成方法はこちらをご参照ください。Cognitive Searchの価格プランですが「Basic」以上のプランでなければ、Azure OpenAI側から連携できませんのでご注意ください(Freeプランは連携不可)。

https://qiita.com/tmiyata25/items/861f1691b5ca56706242#%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90

記事の開発環境は以下の通りです。
- Ubuntu 22.04 on WSL2
- python 3.10.6

事前準備として、pipのインストールとAzure CLIのインストールを実施します。

```terminal
$ sudo apt-get update
$ apt install python3-pip
```
Ubuntuの場合このコマンドでAzure CLIをインストールできます。

```
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
```

https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli-linux?pivots=apt


データ準備ツールのレポジトリは下記です。

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

まずはこちらのリポジトリをローカルにクローンし、pythonライブラリをインストールします。

```terminal
$ git clone https://github.com/microsoft/sample-app-aoai-chatGPT.git
$ pip install -r requirements-dev.txt
```

次にドキュメントをアップロードするためのフォルダを作成して、PDFファイルをフォルダにアップロードしましょう。

```terminal
$ mkdir data
```

次に```scripts```ディレクトリへ移動して、```config.json```を編集します。データ準備ツールを実行すると、```config.json```に記載された設定で既存のリソースがあれば、それを利用、ない場合は新規作成、という挙動になります。

```json:config.json
[
    {
        "data_path": "<path to data>",
        "location": "<azure region, e.g. 'westus2'>", 
        "subscription_id": "<subscription id>",
        "resource_group": "<resource group name>",
        "search_service_name": "<search service name to use or create>",
        "index_name": "<index name to use or create>",
        "chunk_size": 1024, // set to null to disable chunking before ingestion
        "token_overlap": 128 // number of tokens to overlap between chunks
        "semantic_config_name": "default",
        "language": "en" // setting to set language of your documents. Change if your documents are not in English. Look in data_preparation.py for SUPPORTED_LANGUAGE_CODES
    }
]
```
| 項目 | 説明 | 例 |
|:-|:-|:-|
|data_path   | ドキュメントのディレクトリパス  | ../../data  |
|location   |  Cognitive Searchリソースのリージョン | japaneast  |
|subscription_id   | Cognitive Searchリソースのサブスクリプション  | 5290deef-ab3d-4e26-90bb-2296ecd99c71  |
|resource_group   | Cognitive Searchリソースのリソースグループ  | cognitive-handson  |
|search_service_name   | Cognitive Searchリソースのリソース名   | cg-instance-115  |
|index_name   |  Cognitive Searchのインデックス名  | openai-doc-ja  |
|chunk_size   | ドキュメントを分割する際のチャンクサイズ  | 1024  |
|token_overlap   | 分割する際のオーバーラップ(文脈が途切れないように)  | 128  |
|semantic_config_name   |セマンティック検索に関する設定名(使わないのでdefaultでＯＫ)   | default  |
|language   | 言語アナライザーの言語。**確実に変更しましょう!** | ja  |

Cognitive Searchの設定に関してはポータルから確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/da541317-0621-0f0d-683c-d5b7894f10d3.png)

PDFをドキュメントへ変換するためにForm Recognizerを活用します。Form Recognizerの設定を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/5dcfa354-0794-2899-9e10-2c93489cb62b.png)

プログラムを実行する前に```az login```コマンドを実行し、AD認証を行います。

```terminal
$ az login
```


AD認証完了後、データ準備ツールを実行します。

```terminal
$ python data_preparation.py --config config.json --njobs=1 --form-rec-resource fr-instance-115 --form-rec-key XXXXXXXX
```

Cognitive Searchのインデックスへアクセスし、きちんとインデックスが作成されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/de7fe03e-ba58-9a29-0257-4593bbd43683.png)

アナライザーも日本語になっていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/141917e5-23c8-f106-b0f7-ba0cc7a801de.png)

それではAdd your dataで連携してみましょう。Azure OpenAI Studioへアクセスし、[Add a data source]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/cb9eacc7-397e-c94a-5854-4207fe7ad5be.png)
先ほど作成したインデックスを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/c2cfce5e-9bce-507c-dc01-6d0091666961.png)
Azure OpenAIのAPIが参照するデータ項目とCognitive Searchのインデックスのフィールドのマッピングを行います。データ準備ツールでインデックス化した場合は、データ項目とインデックスが自動で1対1になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/bbc6299c-7762-0150-2fa2-24d2f350e582.png)
最後に保存して閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/604eec0a-62e9-7fd0-0175-8fc951862406.png)
システムメッセージに日本語で考えて答えるように指示します(by公式のベストプラクティス)。
「あなたは人々が情報を見つけるのを助けるAIアシスタントです。日本語の書類を取り出したら、日本語でよく読んで、日本語で答えてください。」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/065d40bb-2a24-2c64-818c-6315b2b833f8.png)
公式の「Multi-lingual support」の項に書かれています。

https://learn.microsoft.com/en-us/azure/cognitive-services/openai/concepts/use-your-data#interacting-with-the-model


前回の記事と同じ質問「どんなモデルがある？」をしてみましたが、今回の回答の方がしっくりきますね。GPT-4の情報も含まれています。根拠となるドキュメントも前回は微妙でしたが、今回は良い感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/ada1fb48-4924-8d64-c147-64ce01cee49b.png)

[参考]前回の記事は、言語アナライザーが英語(デフォルト)でシステムプロンプトに何も入力しませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/c5dd1788-06f9-50bd-beda-428eb06bd092.png)

# まとめ
今回は生成AI用Cognitive Searchの言語アナライザーを日本語にするために、データ準備ツールを解説しました。このツールを使うとお手軽に日本語ベースのナレッジベースが作成できます。一方で、新しくドキュメントをナレッジベースに追加したい場合は、このツールを手動実行する必要があり、めんどくさいです。検証用途としては十分使えるツールになっていると思うので、是非参考にしていただければと思います。