Tech Knowledge

October 10, 2023 · View on GitHub

特に日本のユーザー向けに Amazon Lex v2 と Amazon Kendra の Tech Knowledge を集約します。最新の情報とずれが生じる可能性があるため、必ず公式の AWS ドキュメントの情報と合わせてご覧ください。

Amazon Lex v2

音声入力について

このサンプルプロジェクトでは音声入力に Amazon Transcribe を利用しています。AWS SDK for JavaScript V3 でサポートされていないためです。AWS SDK for JavaScript V2 ではサポートされています。(サンプル実装) ただし、AWS SDK for JavaScript V2 は 2023 年中にメンテナンスモードに移行することが予定されているため、新規の利用の際には注意が必要です。

AMAZON.KendraSearchIntent について

Amazon Lex v2 では AMAZON.KendraSearchIntent を利用することで、Amazon Kendra による検索を組み込むことが可能です。ただし、現状 (2022/12) ではロケール=英語のみの対応なので、日本語では利用できません。そこで、このサンプルプロジェクトでは、FallbackIntent が呼び出された際に Amazon Kendra で検索するように実装しています。

Amazon Kendra

Identity Pool の Unauthenticated User に関して

前述した Amazon Lex v2 と Amazon Transcribe にアクセスする際には、Cognito の Identity Pool の Unauthenticated User (ゲストユーザー) で認証しています。一方、Amazon Kendra は Unauthenticated User ではアクセスできません。(Identity Pool の Unauthenticated User からアクセスできる AWS サービスに制限があるため) そこで、このサンプルプロジェクトでは Amazon API Gateway と AWS Lambda で API を作成しています。

この件について解説したブログ

AWS CDK (AWS CloudFormation) でデフォルト言語を指定できない件について

現状 (2023/10) は CloudFormation で FAQ を作成する際に、デフォルトの言語を指定することができません。日本人のユーザーにとっては、ほとんどの場合、言語を日本語に指定する必要があると思うので、このままではとても不便です。

そこで、simple-lex-kendra-jp では、Custom Resource を作成しています。(/cdk/custom-resources)

ドキュメントのアクセスコントロールについて

現状 (2023/05) 、アクセスコントロール機能は Amazon S3 の Data source connection に限り行うことができます。 ※ Amazon S3 以外でアクセスコントロールを実現したい場合は、Index を分けて IAM を使って制御する実装が一つの案として考えられます。

Amazon S3 ドキュメントのアクセスコントロールは、「メタデータ使う方法」と「設定ファイルを使う方法」の2つがあります。

  • メタデータを使う方法
    • Amazon S3 ドキュメントにはメタデータを設定することができますが、そのメタデータの一つとして AccessControlList があります。
    • AccessControlList にアクセス条件を設定することで、ファイルごとにアクセスコントロールを行うことができます。
    • 参考:Amazon S3 document metadata
  • 設定ファイルを使う方法
    • アクセスコントロール設定用の JSON ファイルを定義することで、一元的にアクセスコントロールを設定することが可能です。
    • フォルダ単位での指定も可能ですので、大量のドキュメントに対してアクセスコントロールを行う場合は、こちらの方法が管理しやすいと思います。
    • keyPrefixs3:// から始まるフルパスを指定する必要があるのでご注意ください。
    • 参考:Access control for Amazon S3 data sources

アクセスコントロールはユーザ単位とグループ単位で行うことができます。 ユーザとグループの属性は Index の TokenConfiguration で変更することが可能です。 当サンプルでは、ユーザは cognito:username 、グループは cognito:groups を指定しています。

Amazon Kendra の Query を実行する際に、Amazon Cognito が発行した JWT トークンを設定することにより、アクセスコントロールが実行されます。 ※ Cognito のアクセストークンと ID トークンのどちらも利用可能ですが、認証されたユーザの属性(アイデンティティ)を利用することが主な目的ですので、ID トークンを利用する方が適切です。 JWT トークンは、--user-contextToken に設定をしてください。 参考:AWS CLI Referense kendra qurey

アクセスコントロールについて詳細に解説したブログ

Amazon Kendra で日本語検索する際の Tips

2022/11/27 に Amazon Kendra のセマンティック検索が日本語をサポートしました。日本語で検索する場合は、分かち書きをすることで、より正確な答えが得られる場合があります。

  • 前: 「2022年のワールドカップ優勝国はどこですか」
  • 後: 「2022年 ワールドカップ 優勝国 どこ」

このサンプルプロジェクトでは、検索結果が見つからなかった際に、ヒントとして分かち書きを提案するようにしています。

開発中に集めた Tips

こちらのブログに開発中に集めた Tips をまとめています。