🎃

Amazon Kendra実装②:Kendraファセット検索やってみる

2023/12/17に公開

やること

Kendraでより詳細な検索ができるようになるというファセット検索を試してみる。

ファセット検索とは

Amazon Kendraのファセット検索は、検索結果を特定の属性やメタデータフィールドに基づいて絞り込む機能です。特定のカテゴリや値で検索結果をフィルタリングすることができます。

ファセット検索を使うことで検索結果の精度を上げることができそうです。

参考

構築手順

(1)メタデータの作成
(2)S3バケットにデータおよびメタデータを格納
(3)Kendraインデックスを作成
(4)S3バケットへのコネクター作成
(5)Index fieldsにcategory属性を追加
(6)クロール実行
  ※ここまでで構築完了※
(7)aws cliコマンドで検索

(1)メタデータの作成

Amazon S3ドキュメントメタ情報 を参考にメタデータを作成します。
今回作成したデータとメタデータファイルはgithubに置きました。

https://github.com/zgw426/llm-mysamples/tree/main/sample-data/02-momo-taro-2

たとえば、momo/item_list.csvのメタデータmetadata/momo/item_list.csv.metadata.jsonはこのようにcategoryという属性を追加しました。

metadata/momo/item_list.csv.metadata.json
{
    "DocumentId": "document ID",
    "Attributes": {
        "category": "item"
    },
    "Title": "dagger",
    "ContentType": "TXT"
}

(2)S3バケットにデータおよびメタデータを格納

作成したメタデータ含めS3バケットhogefuga-us-east-1に格納します。リージョンはus-east-1にしました。

(3)Kendraインデックスを作成

S3バケットhogefuga-us-east-1と同じリージョンでKendraインデックスを作成します。作成手順は省略します。
作成したKendraインデックスのIndex IDは検索のaws cliコマンド実行時に必要になります。(今回のIndex ID12345678-1234-1234-1234-123456789012です)

(4)S3バケットへのコネクター作成

以下のAdd data sourcesボタンをクリックしS3バケットhogefuga-us-east-1へのコネクタを作成します。

(4-1)Default language of source documentsの設定

S3バケットにある検索対象のデータは日本語文字列を含むので、Japanese(ja)を設定

(4-2)Metadata files prefix folder locationの設定

メタデータの格納パスを指定。今回使用したデータではmetadata/を設定

(5)Index fieldsにcategory属性を追加

Amazon KendraFacet definitionIndex fieldsAdd fieldボタンでメタデータで設定したcategory属性を追加します。

Usage typesはとりあえず全部にチェックいれました。

このようにcategoryが追加されました

(6)クロール実行

作成したKendra IndexのSync nowボタンでクロールを実行します。
クロールの実行が完了したら構築完了です。

(7)aws cliコマンドで検索

メタデータで追加したcategory属性で検索できるか検証します。以下はaws cliでKendraにクエリを発行する例です。

  • 検索条件
    • メタデータで追加した属性categoryの値がindex
    • 検索文字列が第1章
    • 属性_language_codejaを設定
aws kendra query --index-id 12345678-1234-1234-1234-123456789012 --query-text '第1章' --attribute-filter '{
    "AndAllFilters":[
        {
            "EqualsTo":{
                "Key":"category",
                "Value":{
                    "StringValue":"index"
                }
            }
        },
        {
            "EqualsTo":{
                "Key":"_language_code",
                "Value":{
                    "StringValue":"ja"
                }
            }
        }
    ]
}'
  • ※補足
    • 属性_language_codeはデフォルトで作成される属性で、デフォルト値はusのようです。日本語を検索する場合はjaを指定します。
    • 未検証ですが、検索結果を絞るなら--page-size 1みたいにオプションを設定するといけそうです。

(参考)コマンド実行結果

Kendraにクエリを発行するaws cliコマンドの実行結果です。

iamusr0001:~/environment $ aws kendra query --index-id 12345678-1234-1234-1234-123456789012 --query-text 4 --attribute-filter '{
>     "AndAllFilters":[
>         {
>             "EqualsTo":{
>                 "Key":"category",
>                 "Value":{
>                     "StringValue":"item"
>                 }
>             }
>         },
>         {
>             "EqualsTo":{
>                 "Key":"_language_code",
>                 "Value":{
>                     "StringValue":"ja"
>                 }
>             }
>         }
>     ]
> }'
{
    "QueryId": "00000000-8989-1212-1234-111111111111",
    "ResultItems": [
        {
            "Id": "00000000-8989-1212-1234-111111111111-77a329ad-a63a-4803-ba57-a98ead8f2345",
            "Type": "DOCUMENT",
            "Format": "TEXT",
            "AdditionalAttributes": [],
            "DocumentId": "s3://hogefuga-us-east-1/momo/items/healing_robe.txt",
            "DocumentTitle": {
                "Text": "item name Healing Robe",
                "Highlights": []
            },
            "DocumentExcerpt": {
                "Text": "アイテム名:癒しの・・・ベル4となっています。",
                "Highlights": [
                    {
                        "BeginOffset": 30,
                        "EndOffset": 31,
                        "TopAnswer": false,
                        "Type": "STANDARD"
                    },
                    {
                        "BeginOffset": 238,
                        "EndOffset": 239,
                        "TopAnswer": false,
                        "Type": "STANDARD"
                    }
                ]
            },
            "DocumentURI": "https://hogefuga-us-east-1.s3.amazonaws.com/momo/items/healing_robe.txt",
            "DocumentAttributes": [
                {
                    "Key": "category",
                    "Value": {
                        "StringValue": "item"
                    }
                },
                {
                    "Key": "_source_uri",
                    "Value": {
                        "StringValue": "https://hogefuga-us-east-1.s3.amazonaws.com/momo/items/healing_robe.txt"
                    }
                },
                {
                    "Key": "s3_document_id",
                    "Value": {
                        "StringValue": "document ID"
                    }
                }
            ],
            "ScoreAttributes": {
                "ScoreConfidence": "LOW"
            },
            "FeedbackToken": "AYADeCOnmmf5iWvLtBzr・・・8ead8f"
        },
        {
            "Id": "00000000-8989-1212-1234-111111111111-b6165911-491e-465b-b3b1-cded96cad501",
            "Type": "DOCUMENT",
            "Format": "TEXT",
            "AdditionalAttributes": [],
            "DocumentId": "s3://hogefuga-us-east-1/momo/items/grandmothers_cane.txt",
            "DocumentTitle": {
                "Text": "item name Grandmother's Cane",
                "Highlights": []
            },
            "DocumentExcerpt": {
                "Text": "アイテム名:おばあさんの杖\n\nクラス: 癒し手専・・・しの力を象徴しています。",
                "Highlights": [
                    {
                        "BeginOffset": 31,
                        "EndOffset": 32,
                        "TopAnswer": false,
                        "Type": "STANDARD"
                    },
                    {
                        "BeginOffset": 241,
                        "EndOffset": 242,
                        "TopAnswer": false,
                        "Type": "STANDARD"
                    }
                ]
            },
            "DocumentURI": "https://hogefuga-us-east-1.s3.amazonaws.com/momo/items/grandmothers_cane.txt",
            "DocumentAttributes": [
                {
                    "Key": "category",
                    "Value": {
                        "StringValue": "item"
                    }
                },
                {
                    "Key": "_source_uri",
                    "Value": {
                        "StringValue": "https://hogefuga-us-east-1.s3.amazonaws.com/momo/items/grandmothers_cane.txt"
                    }
                },
                {
                    "Key": "s3_document_id",
                    "Value": {
                        "StringValue": "document ID"
                    }
                }
            ],
            "ScoreAttributes": {
                "ScoreConfidence": "LOW"
            },
            "FeedbackToken": "AYADeCOnmmf5i・・・ded96"
        }
    ],
    "FacetResults": [
        {
            "DocumentAttributeKey": "category",
            "DocumentAttributeValueType": "STRING_VALUE",
            "DocumentAttributeValueCountPairs": [
                {
                    "DocumentAttributeValue": {
                        "StringValue": "item"
                    },
                    "Count": 2
                }
            ]
        }
    ],
    "TotalNumberOfResults": 2
}
iamusr0001:~/environment $
iamusr0001:~/environment $ aws kendra query --index-id 12345678-1234-1234-1234-123456789012 --query-text '第1章' --attribute-filter '{
>     "AndAllFilters":[
>         {
>             "EqualsTo":{
>                 "Key":"category",
>                 "Value":{
>                     "StringValue":"index"
>                 }
>             }
>         },
>         {
>             "EqualsTo":{
>                 "Key":"_language_code",
>                 "Value":{
>                     "StringValue":"ja"
>                 }
>             }
>         }
>     ]
> }'
{
    "QueryId": "0b54cd52-4cde-7890-a01b-84b4acef9c21",
    "ResultItems": [
        {
            "Id": "0b54cd52-4cde-7890-a01b-84b4acef9c21-5af2fbf7-365f-42d7-90b5-4b3a4c894f06",
            "Type": "ANSWER",
            "Format": "TEXT",
            "AdditionalAttributes": [
                {
                    "Key": "AnswerText",
                    "ValueType": "TEXT_WITH_HIGHLIGHTS_VALUE",
                    "Value": {
                        "TextWithHighlightsValue": {
                            "Text": "第1章: 桃太郎の・・・れ、村人たちを苦しめた。",
                            "Highlights": []
                        }
                    }
                }
            ],
            "DocumentId": "s3://hogefuga-us-east-1/momo/contents.txt",
            "DocumentTitle": {
                "Text": "Table of Contents of Momotaro",
                "Highlights": []
            },
            "DocumentExcerpt": {
                "Text": "第1章: 桃太郎の誕生\n\nある日、老夫婦が子供・・・、村人たちを苦しめた。",
                "Highlights": [
                    {
                        "BeginOffset": 0,
                        "EndOffset": 214,
                        "TopAnswer": false,
                        "Type": "STANDARD"
                    }
                ]
            },
            "DocumentURI": "https://hogefuga-us-east-1.s3.amazonaws.com/momo/contents.txt",
            "DocumentAttributes": [
                {
                    "Key": "category",
                    "Value": {
                        "StringValue": "index"
                    }
                },
                {
                    "Key": "_source_uri",
                    "Value": {
                        "StringValue": "https://hogefuga-us-east-1.s3.amazonaws.com/momo/contents.txt"
                    }
                },
                {
                    "Key": "s3_document_id",
                    "Value": {
                        "StringValue": "document ID"
                    }
                }
            ],
            "ScoreAttributes": {
                "ScoreConfidence": "MEDIUM"
            },
            "FeedbackToken": "AYADeDmYiJn8・・・4b3a4c894f06"
        },
        {
            "Id": "0b54cd52-4cde-7890-a01b-84b4acef9c21-98b6f751-bd74-4752-be10-333333333333",
            "Type": "DOCUMENT",
            "Format": "TEXT",
            "AdditionalAttributes": [],
            "DocumentId": "s3://hogefuga-us-east-1/momo/contents.txt",
            "DocumentTitle": {
                "Text": "Table of Contents of Momotaro",
                "Highlights": []
            },
            "DocumentExcerpt": {
                "Text": "第1章: 桃太郎の誕生\n\nある日、老夫婦が子供・・・を苦しめた。",
                "Highlights": [
                    {
                        "BeginOffset": 0,
                        "EndOffset": 1,
                        "TopAnswer": false,
                        "Type": "STANDARD"
                    },
                    {
                        "BeginOffset": 1,
                        "EndOffset": 2,
                        "TopAnswer": false,
                        "Type": "STANDARD"
                    },
                    {
                        "BeginOffset": 2,
                        "EndOffset": 3,
                        "TopAnswer": false,
                        "Type": "STANDARD"
                    },
                    {
                        "BeginOffset": 106,
                        "EndOffset": 107,
                        "TopAnswer": false,
                        "Type": "STANDARD"
                    },
                    {
                        "BeginOffset": 108,
                        "EndOffset": 109,
                        "TopAnswer": false,
                        "Type": "STANDARD"
                    },
                    {
                        "BeginOffset": 181,
                        "EndOffset": 182,
                        "TopAnswer": false,
                        "Type": "STANDARD"
                    },
                    {
                        "BeginOffset": 183,
                        "EndOffset": 184,
                        "TopAnswer": false,
                        "Type": "STANDARD"
                    }
                ]
            },
            "DocumentURI": "https://hogefuga-us-east-1.s3.amazonaws.com/momo/contents.txt",
            "DocumentAttributes": [
                {
                    "Key": "category",
                    "Value": {
                        "StringValue": "index"
                    }
                },
                {
                    "Key": "_source_uri",
                    "Value": {
                        "StringValue": "https://hogefuga-us-east-1.s3.amazonaws.com/momo/contents.txt"
                    }
                },
                {
                    "Key": "s3_document_id",
                    "Value": {
                        "StringValue": "document ID"
                    }
                }
            ],
            "ScoreAttributes": {
                "ScoreConfidence": "LOW"
            },
            "FeedbackToken": "AYADeDmYiJn8・・・333333333333"
        }
    ],
    "FacetResults": [
        {
            "DocumentAttributeKey": "category",
            "DocumentAttributeValueType": "STRING_VALUE",
            "DocumentAttributeValueCountPairs": [
                {
                    "DocumentAttributeValue": {
                        "StringValue": "index"
                    },
                    "Count": 1
                }
            ]
        }
    ],
    "TotalNumberOfResults": 2
}
iamusr0001:~/environment $ 

おわりです。

Discussion