東京リージョンでも使用可能になったAmazon Kendraを使用してみた

# はじめに
こんにちは。株式会社ジールの@is_zealです。
Amazon Kendra というサービスが東京リージョンでも使用可能になったという情報があり、馴染みのないサービスだったため、どのようなことができるのか試しに使用してみました。

# Amazon Kendraとは？
Amazon Kendraとは、機械学習を使用した検索サービスのことです。
様々なデータソースに格納しているデータから情報を読み取り、利用者の検索に対して回答の提案と該当するデータの位置を表示します。
また、「りんごの価格は？」のような自然言語で検索した場合にも、その質問を読解して、データの中から検索し「〇〇円です」というように回答します。データ内に正確な情報がなかった場合は、最適な資料のリストを提示します。
https://aws.amazon.com/jp/kendra/features/
https://aws.amazon.com/jp/kendra/faqs/

例えば、社内ドキュメントから必要な情報を探したいとき、企業全体に散在する膨大な量のファイルから見つけなければいけないですが、Amazon Kendraで検索することで、自分で答えを探すことなく必要な情報を得ることができるようになります。

料金・サポートしているデータソースとドキュメントタイプについては、以下を参照ください。

〇料金
https://aws.amazon.com/jp/kendra/pricing/
〇データソース
https://docs.aws.amazon.com/ja_jp/kendra/latest/dg/hiw-data-source.html
〇ドキュメントタイプ
https://docs.aws.amazon.com/kendra/latest/dg/index-document-types.html

# Amazon kendraの使い方
実際に、Amazon Kendraを使用してみました。
Amazon Kendraを使用するために、以下の準備が必要になります。

・インデックスの作成
・データソースの追加
・データソースの同期

### インデックスの作成
インデックスとは、簡単に言うと「検索するための領域」のイメージです。
作成したインデックスにデータソースを追加することで、そのインデックス内で追加したデータソースに対し検索をすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/ff130aeb-2941-9295-08ec-45a04e770391.png)

①Amazon Kendraのコンソール画面から、「Create an Index」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/71f9fcaf-7b00-6e29-d75b-cce47e6b48e5.png)
②任意の「Index name」を入力し、「IAM role」を設定します。ここでは「create a new role」：新規作成を選択しています。
設定後、右下の「Next」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/b054adf4-c7b6-b409-4e6b-af85532a1262.png)
③アクセスコントロールの設定をし、右下の「Next」をクリックします。(今回は特に設定していません)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/10968e6f-4506-74a4-7aa1-5124b11c3b21.png)
④「Developer edition」と「Enterprise edition」のどちらを使用するかを選択し、右下の「create」をクリックします。(「Developer edition」と「Enterprise edition」の違いについては、前述『Amazon Kendraとは』の料金資料をご確認ください)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/b2fd6b81-c917-2554-1d56-70a7a8341d26.png)

⑤以下のような表示が出れば、インデックスの作成が完了します。
インデックスの作成が完了するまでに、30分ほど時間がかかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/8178aa58-7bc1-00db-0f15-bad9ec1cb756.png)

### データソースの追加
データを格納しているデータソースを追加します。

①「Add data sources」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/01356ff0-4fc4-7e35-7689-cba064c53e25.png)
②追加したいデータソースの「Add connector」をクリックします。(今回はAmazon S3を追加します)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/4b4087a8-9885-1187-e749-d20d4bf85c28.png)
③任意の「Data source name」を入力し、「Language」は「japanese(ja)」を選択して、右下の「Next」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/03a306dd-3ce5-be5b-f425-130d9e988826.png)
④IAM roleとVPCの設定をして、右下の「Next」をクリックします。
今回は、「create a new role」：新規作成、VPC：No VPCを選択しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/f8b62dd9-3835-63b3-1ad2-31f79eccddbe.png)
⑤「Enter the data source location」で、データを格納しているS3のバケットを指定し、「Sync run schedule」でデータの同期タイミングを指定して、右下の「Next」をクリックします。
今回は、「Sync run schedule」で「Run on demand」(実行時)を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/921b632d-3506-aa71-fd4a-9a326d265c0c.png)
⑥フィールドマッピングの設定を行い、右下の「Next」をクリックします。
今回は特に何も設定していません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/e1bf9bb8-406c-d64c-2c06-4eabdba8779c.png)
⑦確認画面で設定内容に問題がなければ、「Add data source」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/8574b8e8-784f-3705-84cb-6cf3013e1c14.png)
⑧以下のように表示されれば、データソースの追加が完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/7b3ed505-a669-bca7-7c40-4a3002b41257.png)

### データソースの同期
追加したデータソースの中にあるデータを最新の状態にするため、同期を行います。
データソースを追加する際、「Sync run schedule」でデータの同期タイミングを「Run on demand」と指定した場合、自身でデータの同期を行います。

①同期したいデータソース名の左にある〇をクリックして選択し、「Sync now」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/d1c87737-e327-903e-75fd-658855eee608.png)
②データ同期中の表示が出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/bf56ae9d-7491-40d9-e885-a4a332f15b05.png)
③以下のように表示されれば、同期が完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/dcfa5bae-2ea7-9419-b420-ed666f81cf17.png)

### 実際に検索してみた
準備が整ったので、実際にAmazon Kendraを使用して検索してみます。
今回は、S3バケットに以下のxlsxファイルを格納して「カラスの色は？」と検索します。
(ファイル名：ファイル内のデータ)
test2.xlsx：カラスの色は黒です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/5303ce4f-70fd-39f7-5190-d9ef458b91a7.png)
①「Search indexed content」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/962c0316-8556-f7f9-3510-f09e033db140.png)
②Amazon Kendra search console画面へ遷移するため、設定マークをクリックし、Languageを「Japanese(ja)」に設定して「Save」をクリックします。(この設定を忘れると、日本語で検索しても回答を返してくれません)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/1c640c93-875e-5493-47ed-9a5dbfa3e8b0.png)
③「カラスの色は？」と入力して検索してみると、Amazon kendraが回答の提案と関連がありそうな資料を返してくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/4536db33-7f47-ba0a-752a-ebe6b431996f.png)

# 気になった点の検証
実際に検索を行ってみて、気になった点を検証してみます。

①一般常識ではなく、データの中身を見て回答するのか？
②矛盾したデータを格納した場合、どのように結果を返すのか？
③テキストファイル名に検索ワードがあると、そのファイルも検索結果に表示するのか？
④検索結果はand条件で返すのか、or条件で返すのか
⑤表からデータを読み取って回答を返すのか？

※検証で使用したファイルのデータはすべてテストデータです。

### 検証①
 **一般常識ではなく、データの中身を見て回答するのか？** 
以下、1ファイルのみをS3バケットに格納します。

(ファイル名：ファイル内のデータ)
test1.xlsx：カラスの色は白です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/05fc88ca-512c-254a-4397-032ed5519034.png)
このデータソースに対して、Amazon Kendraで「カラスの色は？」と検索した場合、一般的には「カラスの色は黒」ですが、データの中身を見て「カラスの色は白」という結果を返すのか検証しました。
以下、実際の検索結果画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/56e9f88a-8842-7cea-5c2d-3ebf84e1228c.png)
回答として「白」を提案してくれたため、データの中身を見て答えを返していることが分かります。

### 検証②
 **矛盾したデータを格納した場合、どのように結果を返すのか？** 
以下、2ファイルのみをS3バケットに格納します。

(ファイル名：ファイル内のデータ)
test1.xlsx：カラスの色は白です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/aa07128b-590e-c406-3c41-9fc00bef5dc5.png)
test2.xlsx：カラスの色は黒です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/921da5af-8cad-e144-76fb-b0e7642144b5.png)
「カラスの色は白」「カラスの色は黒」という矛盾したデータがデータソースにある状態で、「カラスの色は？」と検索してみると、どのような回答をするのか検証しました。
以下、実際の検索結果画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/f9a31eb6-e621-e5ca-714d-6243875f8926.png)
Amazon Kendraは回答の提案として「カラスの色は黒です」と記載したファイルを提示しました。また、関連のありそうなファイルを下に表示していることが分かります。

この検証で、Amazon Kendraは、S3バケットに最後にアップロードしたファイルであるtest2.xlsxファイルのデータを提案しました。このことから、矛盾したデータを持たせた場合、Amazon Kendraは新しくS3バケットにアップロードされたデータから答えを提案している可能性を考えました。
S3バケットにアップロードしたタイミングが関係しているかどうかを確認するため、S3バケットにアップロードする順番を逆にして検索すると、「カラスの色は白」と答えを提案するのか検証しました。

変更前：test1.xlsx(カラスの色は白)アップロード ⇒ test2.xlsx(カラスの色は黒)アップロード = 「カラスの色は黒」と記載したファイルが最新
変更後：test2.xlsx(カラスの色は黒)アップロード ⇒ test1.xlsx(カラスの色は白)アップロード = 「カラスの色は白」と記載したファイルが最新

以下、実際の検索結果画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/dfe4877f-4adc-e868-3e9c-6abc5bf22561.png)
検証②で提案した回答と変わらず、「カラスの色は黒です」という回答が提案されたため、S3へアップロードしたタイミングは関係ないことが分かります。

### 検証③
 **テキストファイル名に検索ワードがあると、そのファイルも検索結果に表示するのか？** 
以下、3ファイルのみをS3バケットに格納します。

(ファイル名：ファイル内のデータ)
test1.xlsx：カラスの色は白です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/0ee12b8f-c27e-2c29-2b5a-c0c0bb6cb8d0.png)
test2.xlsx：カラスの色は黒です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/b85d8b42-90ba-0b2e-f813-2a819d5cc0f7.png)
カラスの色は黒です.xlsx：(データなし)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/87edbeff-407f-3755-0d25-9377b6aa69d9.png)
検証①と検証②では、データの中身に対して検索結果を表示していましたが、ファイル名に検索ワードが当てはまった場合は、データを持っていないファイルでも表示してくれるのかを検証しました。
以下、実際の検索結果画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/8e493258-a2f3-ca08-c03b-2f71ed7d74ca.png)
ファイル名に検索ワードが当てはまれば、データの中身がなくても関連するファイルとして表示されました。データの中身だけでなく、ファイル名も見て検索結果を表示していることが分かります。

### 検証④
 **検索結果はand条件で返すのか、or条件で返すのか** 
以下、2ファイルのみをS3バケットに格納します。

(ファイル名：ファイル内のデータ)
test1.xlsx：カラスの色は白です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/615e66d7-cb37-3674-a047-430aabf7f885.png)
test2.xlsx：カラスの色は黒です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/e4ce0cf1-8175-6706-d81f-0f7edefe2774.png)
この状態で「カラス　黒」と検索した場合、
・「カラス and 黒」の条件で検索し、test1.xlsxは検索結果に表示されない
・「カラス or 黒」の条件で検索し、test1.xlsxも検索結果に表示される
のどちらになるのか検証しました。
以下、実際の検索結果画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/a8432b74-8d6c-7c0a-d14d-44ac078a5c8d.png)
test1.xlsxも検索結果に表示されたため、「カラス or 黒」の条件で検索したことが分かります。

### 検証⑤
 **表からデータを読み取って回答を返すのか？** 
S3バケットに以下のファイルを格納します。

ファイル名：売上表.xlsx
ファイルのデータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/e4323b21-5d10-5541-31e0-049d5f201d3f.png)

検証①～検証③まではテキストに対して検索をしましたが、上のような簡単な表に対して、「1月のりんごの売上は？」と検索した場合、答えを返してくれるのか検証しました。
以下、実際の検索結果画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/9da05309-135d-c800-07aa-6afa3714aba5.png)
具体的な回答はせず、記載されているファイルのみを表示しました。
表を読み取って回答しないことが分かります。

# 次回検証してみたいこと
実際にAmazon Kendraを使用してみて、さらに気になる点があったため、以下のことも検証してみたいと思います。

・コネクタを使用せずにデータソースと接続することは可能？
・複数のデータソースを使用して検索してみる
・DBをデータソースとして検索してみる

# まとめ
今まで使用したことがなかったAmazon Kendraを実際に使用してみて、自分で知りたい情報を探す手間なく、楽に答えを見つけることができる利便性に驚きました。インデックスの作成やデータソースの追加などの手順も簡単でしたが、時間がかかるため、もっと早くできるようになってほしいと個人的には感じました。
今回はS3をデータソースとして、基本的な使い方と簡単な検証を行ったため、次回は異なるデータソースを使用してさらに検証したいと思います。




# 
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area