Azure AI SearchのIndexer, Skillsetテンプレ！

# はじめに

* Azure OpenAIを利用してRAGをやるときに、Azure AI Searchを利用される方は多いと思いますが、DBにデータを取り込むIndexerやSkillsetを利用しようとすると、すべての人がハマると思うので、この記事に沿ってやれば即使える、というテンプレを書きたいと思います

# 今回作る構成

* BlobにCSVデータを格納してIndexerを実行したら、Answer列の情報がベクター化されてDBに格納されます
* Q&A形式のCSVですが汎用性高く、いろいろな場面に適用できると思います

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/40a273bc-7de5-abfc-ffdf-61bc890a83b6.png)


# テンプレ解説

## csv データ形式

* FAQや、特定のトピックに関する情報を想定し、以下の形式をテンプレとして扱います
* これをCSVとして保存しましょう
* 文字コードはUTF-8必須なので注意すること

| Question                              | Answer                                                             | URL                   |
|---------------------------------------|----------------------------------------------------------------------|--------------------------------|
| 営業時間は何時から何時までですか？    | 当店は午前9時から午後9時まで営業しております。                       | https://example.com/hours      |
| メニューにビーガン対応の料理はありますか？ | はい、ビーガン対応の料理としてサラダやビーガンパスタをご用意しています。 | https://example.com/vegan-menu |
| Wi-Fiは利用できますか？               | はい、無料Wi-Fiをご利用いただけます。店内でパスワードをご確認ください。 | https://example.com/wifi       |

## Azure blobに格納

* Azure blobを作成したら、適当にフォルダを作って格納しよう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/037dca4c-1679-2b8b-1c9e-12c2d26b7a80.png)


## Azure AI Search

* 以下の順に作っていきます

### Index
* 今回のCSVのタイトルと、フィールド名は、しっかりと合わせます
* URL行は、ソートやフィルタもできるようにチェックつけてますが、そこはお好みで
* ベクター用にembeddingというフィールドも作ること
    * embedding というフィールド名はSkillsetでも利用するので、もし変更する場合は、Skillset作成の際に留意すること！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/82ddaac1-26d3-7e93-e8e7-2a782c8998ad.png)


### データソース
* 先ほど作ったBlobのフォルダをしっかり指定しよう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/de16f246-a602-749e-a260-5e6bb930d3c1.png)

### Skillset
* Skillsetを作成しようとすると、いきなりJSONの記入を求められて、大抵ここで途方にくれます
* なので、即貼り付けて使えるテンプレを共有します！JSONを以下のテンプレに置き換えて、以下３点だけ気を付けて保存しよう
    * 事前にAzure OpenAIインスタンスは作成し、text-embedding-small-3 のモデルデプロイも終わっているものとします
    * xxxxxxxの箇所は、自分のOpenAIの情報に書き換えること
    * inputsのAnswerは、CSVのタイトルと合わせること！本テンプレでは、Answer列をベクター化します

```
{
  "name": "embedding-skill",
  "description": "",
  "skills": [
    {
      "@odata.type": "#Microsoft.Skills.Text.AzureOpenAIEmbeddingSkill",
      "name": "#1",
      "description": "Connects a deployed embedding model.",
      "context": "/document",
      "inputs": [
        {
          "name": "text",
          "source": "/document/Answer",
          "inputs": []
        }
      ],
      "outputs": [
        {
          "name": "embedding",
          "targetName": "embedding"
        }
      ],
      "resourceUri": "https://xxxxxxxxxxxxxxxxxxxxxxxxxxxx.openai.azure.com",
      "deploymentId": "text-embedding-3-small",
      "apiKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "modelName": "text-embedding-3-small",
      "dimensions": 1536
    }
  ]
}
```

### Indexer

* 設定するIndexやデータソース、Skillsetは上記で作成したものを指定するだけなので、迷いはないはず
* 注意点はCSVに合わせた以下４項目だけ
    * デリミタには、カンマ（ , ）をちゃんと設定しましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/1ed8cc30-d0a4-2074-d82e-1aaa087a621a.png)

* そして、JSONでの編集ボタンから、以下のように、ベクターデータのフィールドを追記します
    * ~~GUIだけで設定できると思わせて、JSON編集必須とは、なんてこった！~~

```
  "outputFieldMappings": [
  ],
```
↓
```
  "outputFieldMappings": [
    {
      "sourceFieldName": "/document/embedding",
      "targetFieldName": "embedding",
      "mappingFunction": null
    }
  ],
```


# Indexerを動かしてデータを取り込む！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/34b0b644-c290-107a-8415-3d2125615e51.png)

* データの様子

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/a9d7955a-1777-3064-c8ef-84f6567b08d4.png)


# おわりに
* このテンプレを利用して、AI Searchのハッピーライフを過ごしていただければと思います