Amazon Kendra使いがAzure AI Searchやってみた

普段AWSばかりですが、他社の動向も知っておきたいと思って、Azure AI Searchを試しました。

先入観としては、Amazon KendraのAzure版だと思って始めました。うまく行けばRAGの情報源にしてKendraと比較がしたいと目論んでおります。
Azureに詳しい方のツッコミお待ちしております（笑）


Kendraについてはここを見るとわかった気になれます。

https://aws.amazon.com/jp/builders-flash/202302/kendra-search-system/

「Vertex AI Search and Conversationやってみた」はこちら

https://qiita.com/moritalous/items/cdf15eafb3d4d754a2fa

## Azure AI Searchを作ってみた。

Azureポータルでポチポチしてみました。

1. Azure AI serviceのポータルを表示。`Search サービス の作成`をクリック
    ![portal.azure.com__bundlingKind=DefaultPartitioner&configHash=EDdFK6f0BXIZ&env=portal&helppanenewdesign=true&l=ja.ja-jp&pageVersion=13.238.0.1236333.240328-0601.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/a7e23199-8c4c-4b1d-fc22-c72fdfc23c30.png)

1. サービス名などを入力し、`確認及び作成`をクリック
    ![portal.azure.com__bundlingKind=DefaultPartitioner&configHash=EDdFK6f0BXIZ&env=portal&helppanenewdesign=true&l=ja.ja-jp&pageVersion=13.238.0.1236333.240328-0601 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/d8f3469c-f7c5-af43-2c74-54c52f24326b.png)

    :::note
    価格レベル。（料金が見れるの便利！AWSにもほしい）
    
    ![portal.azure.com__bundlingKind=DefaultPartitioner&configHash=EDdFK6f0BXIZ&env=portal&helppanenewdesign=true&l=ja.ja-jp&pageVersion=13.238.0.1236333.240328-0601 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/bc23da33-2e9e-995c-7060-40bc7a89f41a.png)
    
   :::

1. `作成`をクリック
    ![portal.azure.com__bundlingKind=DefaultPartitioner&configHash=EDdFK6f0BXIZ&env=portal&helppanenewdesign=true&l=ja.ja-jp&pageVersion=13.238.0.1236333.240328-0601 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/e56fb899-d1e5-4326-3749-f90e4ad28d29.png)

1. デプロイの完了を待つ
    ![portal.azure.com__bundlingKind=DefaultPartitioner&configHash=EDdFK6f0BXIZ&env=portal&helppanenewdesign=true&l=ja.ja-jp&pageVersion=13.238.0.1236333.240328-0601 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/b3df34be-6d2b-6289-d11d-e2e84fd5ca40.png)

    デプロイが終わったら、`リソースに移動`をクリック

## データを登録してみた。

1. `データのインポート`をクリック
    ![portal.azure.com__bundlingKind=DefaultPartitioner&configHash=EDdFK6f0BXIZ&env=portal&helppanenewdesign=true&l=ja.ja-jp&pageVersion=13.238.0.1236333.240328-0601 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/4468299a-f031-0109-baa3-52964bdc6b7d.png)

1. データソースを`Azure BLOB ストレージ`を選択し、データソース名を入力
    接続文字列部分の`既存の接続を選択します` をクリックして、BLOBストレージを選択
    ![portal.azure.com__bundlingKind=DefaultPartitioner&configHash=EDdFK6f0BXIZ&env=portal&helppanenewdesign=true&l=ja.ja-jp&pageVersion=13.238.0.1236333.240328-0601 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/234a4c35-0613-fe34-529f-b0b119b2b83e.png)

    :::note
    BLOBストレージの選択はこんな感じ
    ![portal.azure.com__bundlingKind=DefaultPartitioner&configHash=EDdFK6f0BXIZ&env=portal&helppanenewdesign=true&l=ja.ja-jp&pageVersion=13.238.0.1236333.240328-0601 (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/a8b3e003-65eb-93fc-33f6-57a4c3f38c44.png)
    
   :::

    :::note
    BLOBストレージ以外の選択肢
    ![portal.azure.com_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/abd1cc6d-92b0-d7d3-435b-c8878316d69c.png)
   :::

1. `スキップ`をクリック
    ![portal.azure.com__bundlingKind=DefaultPartitioner&configHash=EDdFK6f0BXIZ&env=portal&helppanenewdesign=true&l=ja.ja-jp&pageVersion=13.238.0.1236333.240328-0601 (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/e051a891-bc5c-c9c9-9f70-d8f1fea7b644.png)

1. `content`のアナライザーを`日本語`に変更し、`次`をクリック
    ![portal.azure.com__bundlingKind=DefaultPartitioner&configHash=EDdFK6f0BXIZ&env=portal&helppanenewdesign=true&l=ja.ja-jp&pageVersion=13.238.0.1236333.240328-0601 (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/ceb2e5db-7a6f-3b43-1eac-14decf15a67c.png)

1. 名前を入力して`送信`をクリック
    ![portal.azure.com__bundlingKind=DefaultPartitioner&configHash=EDdFK6f0BXIZ&env=portal&helppanenewdesign=true&l=ja.ja-jp&pageVersion=13.238.0.1236333.240328-0601 (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/33148c78-a537-8d9d-8c79-b299ae31c5ce.png)

1. 初回同期が自動で始まります。同期ステータスはインデクサーから確認できます。

    ![portal.azure.com_ (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/94057e8f-4994-8909-b49b-f8caae7c035e.png)

    同期には成功していますが、エラーが出ています。
    ![portal.azure.com_ (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/58e5b458-48cc-05e4-5314-20fe66d0f71f.png)

    ドキュメントによると、価格レベルにより、取り込めるサイズが決まっているとのことです。

    > インデクサーには、1 つのドキュメントから抽出できるテキストの量の制限があります。 この制限は、価格レベルによって異なります。Free レベルの場合は 32,000 文字、Basic の場合は 64,000 文字、Standard の場合は 400 万文字、Standard S2 の場合は 800 万文字、Standard S3 の場合は 1,600 万文字です。 切り詰められたテキストには、インデックスが付けられません。 この警告を回避するには、大量のテキストを含むドキュメントを複数の小さなドキュメントに分割してみてください。

    https://learn.microsoft.com/ja-jp/azure/search/cognitive-search-common-errors-warnings

## 登録されたデータを確認してみた。

1. インデックスメニューの、該当のインデックスをクリック

    ![portal.azure.com_ (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/e7b7073b-7216-9bc9-0430-82d9fa4bb43c.png)

1. キーワードを入れずにとりあえず検索
    ちなみに、登録したのはDX白書2023のPDFです。（ https://www.ipa.go.jp/publish/wp-dx/dx-2023.html ）

    ![portal.azure.com_ (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/67a95902-56e2-6a97-018a-5e8464908718.png)

Kendra使いの皆さん、お気づきになりましたでしょうか？

そうです、 **1ドキュメントが1件として登録される仕様** のようです。

設定漏れかもしれないのですが、分割して登録する方法がわかりませんでした（泣）

## LangChainのRetrieverをやってみた。

こんな状況ではありますが、LangChainのRetrieverで使ってみます。

LangChainのドキュメントのとおりです。

https://python.langchain.com/docs/integrations/retrievers/azure_cognitive_search

まだAzure Cognitive Search表記ですね。ちなみにVector storesには、`Azure AI Search`表記のものがあります。これからはベクトルストアとして使うのがメインで、Retrieverとしての機能はあまりメインじゃないのでしょうか？？

```python
import os

from langchain_community.retrievers.azure_cognitive_search import (
    AzureCognitiveSearchRetriever,
)

os.environ["AZURE_COGNITIVE_SEARCH_SERVICE_NAME"] = (
    "https://*****.search.windows.net"
)
os.environ["AZURE_COGNITIVE_SEARCH_INDEX_NAME"] = "*****"
os.environ["AZURE_COGNITIVE_SEARCH_API_KEY"] = "*****"

retriever = AzureCognitiveSearchRetriever(content_key="content", top_k=10)

retriever.get_relevant_documents("DXとはなんですか？")
```

```
[Document(page_content='.........', metadata={'@search.score': 0.6293055, 'metadata_storage_path': 'aHR0cHM6Ly9yYWdiYzU5NmFjYi5ibG9iLmNvcmUud2luZG93cy5uZXQvcmFnLWNvbnRhaW5lci9EWCVFNyU5OSVCRCVFNiU5QiVCODIwMjMucGRm0'})]
```

取れたけど、、1件。。

次はGoogle CloudのVertex AI Search and Conversationに挑戦してみようと思います。