Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Amazon Kendra で独自文書に対するセマンティック検索(自然言語での検索)を実現する

こんにちは、機械学習チーム YAMALEX の駿です。
YAMALEX は Acroquest 社内で発足した、会社の未来の技術を創る、機械学習がメインテーマのデータサイエンスチームです。
(詳細はリンク先をご覧ください。)

ここ一か月、健康的な食事を心がけ、 1kg 減量しました。
リモートワークだから仕方ないと思っていたのが、間違いでした。

さて、今回は Amazon Kendra での検索について検証していきます。

1. Amazon Kendra とは

Amazon Kendra (以下、 Kendra )は Amazon が提供する、機械学習を利用したインテリジェント検索サービスです。
複数の場所にある複数のフォーマットのドキュメントに対応しており、自前でコードを書くことなく目的のコンテンツを見つけることができます。
AWS の S3 、 RDS などはもちろんのこと、 AWS 外の Google DriveMicrosoft Sharepoint にも接続できるため、既に蓄積されているデータをそのまま活用できます。

また、検索する際にはキーワード検索だけでなく、自然言語を使った「セマンティック検索」も可能で、自然なやり取りで検索をすることができます。

セマンティック検索とは、機械学習自然言語処理の技術を用いて単語の意味や文脈を理解して、より正確な検索結果を提供する技術です。
キーワード検索が単に文字列が文書に含まれているかどうかを検索するのに対し、セマンティック検索は単語やフレーズの意味、文脈、関連性なども考慮します。
例えば従来のキーワード検索だと「サイバー攻撃」のように検索していたところを、セマンティック検索では「サイバー攻撃を防ぐための予防策」のように人に聞くときと同じように自然言語で検索できます。

これにより、ユーザーは求めている情報に短時間でたどり着くことができます。

今回はいくつかある検索方法をそれぞれ試してみました。

2. 環境構築

下に今回利用する構成図を示します。

Kendra のインデックスに2つのデータソースを設定し、それぞれ S3 上のファイル、インターネット上のウェブサイトを参照するようにしました。

構成図

# データソース 内容
1 S3 IPA が公開している EC サイト構築・運用セキュリティガイドライン
2 WebCrawler Kendra の公式ドキュメント

インデックスとデータソースの作り方については AWS 公式のドキュメントを参照してください。

docs.aws.amazon.com

3. 検証

実施した検証内容は下記の通りです。

  1. 複数文書の検索
  2. 高度なクエリ構文による検索
  3. 文書の更新があった場合の確認

今回の検証は Kendra のインデックスとあわせて提供される検索コンソールを利用しました。
検索コンソール右側のスパナアイコンから、ソースの言語を指定しないと日本語での検索はできないため、注意が必要です。
(指定しない場合、関連度の低いドキュメントがヒットするのではなく、検索結果が0件になります)

検索コンソール

Japanese を選択しないと検索できない

3.1. 複数の文書の検索

話題沸騰ポットの仕様書と Kendra のドキュメントがインデックスに含まれている状態で、検索した結果が下記です。

セマンティック検索を試すため、キーワードではなく、自然言語で質問を入力してみました。
いずれも期待するドキュメントが最上位の結果として取得できていることが分かります。

ソースを指定せずに自然に質問するだけで必要な情報が取得できるのがいいですね。

それぞれの検索結果

3.2. 高度なクエリ構文による検索

次に高度なクエリ構文による検索のうち、 AND / OR を試してみます。
その他に対応している検索方法の詳細については公式ドキュメントを参照してください。

まず AND 検索です。
下の結果のように条件を追加すると、ドキュメントの中のさらにピンポイントの部分の検索結果を返すようになります。 しかし、当然絞りすぎると条件にヒットするドキュメントがなくなってしまいます。

AND 検索

次に OR 検索をやってみます。 下の結果のように、いずれかしか含まれないドキュメントが検索できていることが分かります。

OR 検索

特定のドキュメントを見つけたいときや、検索した結果をさらに絞り込みたいときに有用だと思いました。

3.3. 文書の更新があった場合の確認

最後に文書の更新があったときの挙動を確認します。

簡単のため、 データソースは S3 のもののみにして検証します。 またファイルとして、 IPA が公開している EC サイト構築・運用セキュリティガイドライン(以下、 EC サイトガイドライン)と Kendra の公式デベロッパーガイド( PDF )を使用します。

下記の手順で行いました。

# 手順 期待結果
1 S3 バケット(空の状態)に、EC サイトガイドラインを S3 にアップロード。 Sync を手動実行 新規ドキュメントが追加され、検索でヒットするようになること
2 S3 バケットに、 Kendra のデベロッパーガイドをさらにアップロード。 Sync を手動実行 新規ドキュメントが追加され、検索でヒットするようになること
3 S3 バケットに変更を加えず、 Sync を手動実行 データソースに変化がないこと
4 S3 バケットから Kendra のデベロッパーガイドを削除。 Sync を手動実行 ドキュメントが削除され、検索でヒットしなくなること
5 Kendra のデベロッパーガイドのファイル名をEC サイトガイドラインと同じにし、 S3 に上書きアップロード(ファイル名は変えずに内容が変わった状態)。 Sync を手動実行 ドキュメントが更新され、新しいバージョンの内容のみヒットするようになること

下の Sync 履歴を見ると、ファイルが変更されていないときは、更新を行わないこと、同じファイル名でも変更があれば更新が走ることが分かります。

Sync履歴

検索結果を以下に示します。

データソースに含まれるドキュメントが検索出来ているのは当然ですが、
想定通り、 データソースから削除されたドキュメントは結果に含まれないことが分かりました。

「○月○日よりも前の情報が知りたい」といった要件がある場合は、同じファイルを更新していくのではなく、 ファイル名でバージョン分けして、検索時に更新日時でフィルタする、などの処理が必要になりそうです。

1. の後

2. の後

4. の後

5. の後

データソースのSync スケジュールについて

今回は Sync を手動実行しましたが、頻繁に更新されるドキュメントの最新を検索したい場合は、定期的に Sync を自動実行するように設定が可能です。

一時間ごとなどの決められた頻度のほかに、 Custom を選択すると任意の cron 式を使ってスケジュールを定義できます。
ドキュメントの更新タイミングが決まっている際などに、できるだけ早く検索結果に反映できます。

Sync スケジュール設定

4. まとめ

Kendra で利用できる検索を検証しました。

従来は同等のセマンティック検索を実現しようとした場合、文章の分割、ベクトル化、固有表現抽出、類似度計算など、 複数の技術を組み合わせて実装する必要がありました。
しかし、 Kendra を使えば高精度の検索が実装不要で利用できるのが魅力的だと思いました。

Acroquest Technologyでは、キャリア採用を行っています。
  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSクラウドサービスを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
  少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。 www.wantedly.com