👻

Amazon Kendra実装①:Python3で使ってみる

2023/11/26に公開

はじめに

Kendra使ってみる。とりあえずPython3で実行できるところまでやってみる。

構成図

Kendraに格納するデータをS3バケットに格納します。データは桃太郎をベースにChatGPTに作ってもらいました。

サンプルデータについて

桃太郎をベースにデータを作成しました。作成したデータには以下のようにリレーションがはれるようになっています。

データはgithubに格納しました。

https://github.com/zgw426/llm-mysamples/tree/main/sample-data

Kendraセットアップ

用意したデータをKendraで使用できるようにします。AWSコンソールでセットアップしました。手順の紹介は割愛します。

Kendraの動作検証①

まずはKendra付属の機能Search indexed contentで検証します。
以下のようにSettingsでJapanise(ja)を設定しました。

『キジのアイテム』で検索するとそれっぽい結果が表示されました。いい感じです。

Python3スクリプト

PythonでKendraを使うスクリプトです。

kendra-test.py
import boto3

def search_kendra(index_id, query):
    kendra = boto3.client('kendra')

    response = kendra.retrieve(
        QueryText=query,
        IndexId=index_id,
        AttributeFilter={
            "EqualsTo": {
                "Key": "_language_code",
                "Value": {"StringValue": "ja"},
            },
        },
    )
    
    return response

# KendraのインデックスIDと検索クエリを指定
## index_idの確認コマンド
## $ aws kendra list-indices --query 'IndexConfigurationSummaryItems[].{ID:Id, Name:Name}' --output table

index_id = 'YOUR_INDEX_ID'  # KendraのインデックスID
query = 'おじいさんの杖'

response = search_kendra(index_id, query)

print("Query results:")
print(response)
print("----")
for item in response['ResultItems']:
    #print(item['DocumentExcerpt']['Text'])
    documentid = item['DocumentId']
    print(f"documentid = ${documentid}")
    print(item['DocumentTitle'])
    print(item['Content'])
    #print(item['DocumentUrl'])
    #print(item['DocumentAttributes'])
    print("===")

変数index_idには、KendraのインデックスIDを設定します。
KendraのインデックスIDは、AWSコンソールでの確認の他にAWS CLIコマンドでも確認できます。

iam0001:~/environment/bedrock $ aws kendra list-indices --query 'IndexConfigurationSummaryItems[].{ID:Id, Name:Name}' --output table
--------------------------------------------------
|                   ListIndices                  |
+----------------------------------------+-------+
|                   ID                   | Name  |
+----------------------------------------+-------+
|  11111111-2222-3333-4444-555555555555  |  momo |
+----------------------------------------+-------+

動作検証②

pythonスクリプトkendra-test.pyを実行しKendraを操作できるか確認します。
以下のような応答があれば成功です。

iam0001:~/environment/kendra $ python kendra-test.py 
Query results:
{
    "QueryId": "11111111-2222-3333-4444-555555555555",
    "ResultItems": [
        {
            "Id": "11111111-2222-3333-4444-555555555555-xxxxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx",
            "DocumentId": "s3: //hogefugapiyo-us-east-1/momo-taro/桃太郎物語_アイテム_おじいさんの杖.txt",
            "DocumentTitle": "桃太郎物語_アイテム_おじいさんの杖.txt",
            "Content": "属性: 光の属性: 杖から発せられる魔法は光の属性を帯びており、暗闇を払いのける効果がある。 賢者の属性: おじいさんの杖は賢者の知識と経験を象徴しており、賢者の属性を持つ。 レアリティ: 賢者の杖: おじいさんの杖は賢者が使うために作られた特別な杖。 使用者への影響: 知恵の加護: おじいさんの杖を使用することで、使用者の知恵と洞察力が向上する。 癒しの効果: 杖の魔法により、使用者自身も心身の癒しを感じる。 バックストーリー: おじいさんの杖は数々の冒険と経験を積んだ賢者が手に入れた特別な杖であり、桃太郎にとっては賢者の知識と癒しの魔法が必要な時に頼りになる装備となっている。",
            "DocumentURI": "https://hogefugapiyo-us-east-1.s3.amazonaws.com/momo-taro/%E6%A1%83%E5%A4%AA%E9%83%8E%E7%89%A9%E8%AA%9E_%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0_%E3%81%8A%E3%81%98%E3%81%84%E3%81%95%E3%82%93%E3%81%AE%E6%9D%96.txt",
            "DocumentAttributes": [
                {
                    "Key": "_source_uri",
                    "Value": {
                        "StringValue": "https://hogefugapiyo-us-east-1.s3.amazonaws.com/momo-taro/%E6%A1%83%E5%A4%AA%E9%83%8E%E7%89%A9%E8%AA%9E_%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0_%E3%81%8A%E3%81%98%E3%81%84%E3%81%95%E3%82%93%E3%81%AE%E6%9D%96.txt"
                    }
                },
                {
                    "Key": "s3_document_id",
                    "Value": {
                        "StringValue": "桃太 郎物語_アイテム_おじいさんの杖.txt"
                    }
                }
            ],
            "ScoreAttributes": {
                "ScoreConfidence": "NOT_AVAILABLE"
            }
        },
        ーーーー略ーーーー

今回はこれでおわり。
Amazon Bedrock, Amazon Kendraの実装検証ができてきたのでそろそろこの2つを組み合わせたRAG環境の実装検証に進みたいと思います。

Discussion