Amazon LexとAmazon Bedrockを使ってノーコードでチャットボットを作成するハンズオン


とあるイベントでAWSやシステム開発初心者向けに生成AIを使ったハンズオンを実施したので、その内容をブログとして残します。
（本当は[Qiita Advent CalendarのAWS Community Builders24日目](https://qiita.com/advent-calendar/2024/aws-community-builders)のブログ予定でしたが大分遅くなりすみません。)

## 概要
Amazon LexとAmazon Bedrockを使ってノーコードでチャットボットを作成します。
AWS初学者や未経験者にAWSコンソールの操作に慣れてもらう。AWSでもノーコードでモノを作れることを知ってもらうのが目的です。
データソースは何でもよいのですが、今回はAWS認定の試験ガイドを使うので「AWS認定QAチャットボット」ができあがります。

## アーキテクチャ図
ハンズオンで作るチャットボットの構成はこちらになります。Chat UIの部分はハンズオン対象外です。
![bedrock_handson.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/b0995e7b-bb81-5ab0-edab-f4535bfacf05.png)

Amazon Lexにリクエストされたチャットの回答を作成するために、Amazon Bedrockのナレッジベースのデータを検索して回答文章を作成してUserに返す流れになります。

### 特徴
チャットボットをノーコードで作るために今回AWS各サービスの下記機能を採用しています。
* Amazon LexのQnAIntent
Amazon LexからAmazon Bedrockのナレッジベースなどのナレッジストアへノーコードで接続してRAGを行えるようにする機能です。現時点ではナレッジストアとしてBedrockのナレッジベース、Amazon OpenSearch Service、Amazon Kendraが使えます。英語のボットしか今のところ対応していないのに注意です。
[AMAZON.QnAIntent](https://docs.aws.amazon.com/ja_jp/lexv2/latest/dg/built-in-intent-qna.html)

* Amazon Bedrockのナレッジベース
RAGを簡単に構築できるAmazon Bedrockの機能です。今回のハンズオンではデータソースにS3、ナレッジストアにAmazon OpenSearchを使っています。
[Amazon Bedrock のナレッジベース](https://aws.amazon.com/jp/bedrock/knowledge-bases/)

## 手順
データ準備、ナレッジベースの作成、ボットの作成の３手順でチャットボットを作成しています。
初めて触る人にでも作成できるように画像を多めにしていますが、執筆時点の画面になるため実際の画面とは差異がある可能性があります。

### データ準備
１．データのダウンロード
まずナレッジベースのインプットになるデータの準備を行います。
こちらから適当なAWS認定の試験ガイドをダウンロードしてください。
[AWS認定](https://aws.amazon.com/jp/certification/)

以降の手順では下記２つのガイドを使っています。
[AWS認定パス](https://d1.awsstatic.com/ja_JP/training-and-certification/docs/AWS_certification_paths.pdf)
[AWS Certified AI Practitioner (AIF-C01) 試験ガイド](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-ai-practitioner/AWS-Certified-AI-Practitioner_Exam-Guide.pdf)

２．S3バケットの作成
それではAWSで作業を進めます。コンソールからご自身のAWSアカウントにログインしてS3にアクセスしてください。

「バケットの作成」をクリックします。
![s31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/9faec5f3-8c58-67be-fd22-4746e626b51a.png)

「バケット名」に名前を入力して、「バケットを作成」をクリックしましょう。
![s3_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/3a5a0f3d-059f-4a37-af3f-47f4fb4ef2e5.png)

バケットが作成できたことを確認します。
![s3_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/ea81fd6c-6af6-6084-fe1c-148520ce078f.png)


３．データのアップロード
「１．データのダウンロード」でダウンロードした試験ガイドをS3にアップロードします。

「アップロード」をクリックします。
![s3_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/3df64b67-4e11-b9d8-3049-971fd3c71b2e.png)

指定の範囲にファイルをドラッグ&ドロップをするか、「ファイルを追加」をクリックします。
![s3_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/79d06daa-3206-8cc0-6f87-11e38f668dcc.png)

アップロードするファイルを確認できたら「アップロード」をクリックします。
![s3_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/e34fb655-00fe-5dc3-8f52-c67268b0ee79.png)

これでデータの準備を完了です。

### ナレッジベースの作成
Amazon Bedrockでナレッジベースを作成していきます。
コンソールでAmazon Bedrockにアクセスします。

４．モデルの有効化
まずハンズオンで使うモデルを有効化します。画像ではすでに有効化済みのモデルもありますが、ご自身の環境に合わせて当手順を実施してください。

メニューリストの下方にある「モデルアクセス」をクリックします。
![bedrock_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/a13cc8c1-65cc-4ef2-07ed-4e5dd06e3a9f.png)

「モデルアクセスを変更」をクリックします。赤枠で囲んでいるのが今回有効化するモデルです。既に有効であれば当手順は飛ばして、次のナレッジベースの作成に進んでください。
![bedrock_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/af370f73-5a73-be67-7c08-f6a724827b57.png)

有効化するモデルにチェックを付けます。有効化済みのモデルはあらかじめチェックが付いています。
![bedrock_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/7f4d0de0-8fa2-fbc9-187a-dc656a333af9.png)
確認画面でチェックしたモデルが表示されていることを確認したら「送信」をクリックします。
![bedrock_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/e452a4fb-7cd7-7f33-977a-2e7d04ae22eb.png)

モデルのステータスが「アクセスが付与されました」に変わっていることを確認します。
もし、ここでエラーなどで有効化されない場合は再度試していただくか、サポートに問い合わせたほうがよろしいと思います。
![bedrock_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/35d7eabb-f43e-4f3a-d36e-55b2e56d14f9.png)

５．ナレッジベースの作成
ナレッジベースを作成していきます。Amazon Bedrockのメニューリストにある「ナレッジベース」をクリックします。真ん中あたりにあります。
![bedrock_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/31edd686-4137-0f34-c347-88f28e12817b.png)

画面真ん中右端あたりにある「ナレッジベースを作成」をクリックします。
![bedrock_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/c1cd0407-ef39-08cf-dc5f-83958270f242.png)
クリックするとリストが表れますが「Knowledge Base with vector store」をクリックします。
![bedrock_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/0bce36c6-0305-12ab-a85a-19e24fa30360.png)

ナレッジベースの設定画面です。ナレッジベース名がデフォルトで入力されていますが、必要に応じて変更してください。IAM許可はデフォルトで大丈夫です。
![bedrock_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/4b8e0f78-d498-5d44-299a-b8ab8d433125.png)

データソースはAmazon S3を選んで、「次へ」をクリックします。
![bedrock_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/2a3bfe9e-6c61-be19-d576-505e45694c63.png)

データソースの設定で場所は「このAWSアカウント」をクリックして、「S3を参照」をクリックします。
![bedrock_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/8f913b09-8e3a-362c-b0d7-9283f8d1102b.png)

バケットは「２．S3バケットの作成」で作成したバケットを選択します。
![bedrock_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/4a16a151-2b31-4d4b-8f7c-773554061c11.png)

選択したら「選択」をクリック。
![bedrock_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/5815979c-fbef-d048-a14b-e9f9005efb40.png)

S3のURIに選択したバケットのURIが表示されていたら「次へ」をクリック。
![bedrock_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/efeb2406-c9ae-f305-8ae1-b0d416571173.png)

埋め込みモデルの選択です。データを埋め込みに変換するときのモデルを選びます。このハンズオンでは「Titan Embeddings G1 - Text v1.2」を選択してください。ベクトルデータベースはデフォルトのままにして、「次へ」をクリックします。
![bedrock_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/85131759-f8e4-6951-0356-44dccc31862a.png)

確認画面で選択した項目を確認して「ナレッジベースを作成」をクリックします。
ナレッジベースの作成が始まりますが、完成までに少し時間がかかります。
![bedrock_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/954cfe1f-51b0-040c-0b1d-fa6e718f8298.png)

ナレッジベースが完成すると、ナレッジベースの画面が自動で表示されます。
![bedrock_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/aeb161a8-99c8-f866-226b-1707defbec93.png)

６．データの同期
表示されたナレッジベースの画面でデータソース欄に表示されているデータソースにチェックを付けます。
「同期」が活性化するのでクリックします。
少し待ってもらうと、同期が完了します。
![bedrock_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/6f2f1b75-e84c-c896-8587-eefc63002f06.png)

７．テスト
それではナレッジベースが使えるかテストします。
画面右にチャットに似たテスト機能があるので「モデルを選択」をクリックします。
![bedrock_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/a1521f09-8766-90fa-1bd9-b77a46e77e33.png)

モデルは「Anthropic」→「Claude 3 Haiku」を選びます。
![bedrock_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/acf653d8-351e-f9e6-2fe2-4f648f0212e7.png)

それではテスト機能の下部にあるテキストボックスに何か入れて実行してみましょう。
結果が返ってくるのを確認してください。
![bedrock_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/a6c65f88-604b-94f8-d677-bc36e3dcacce.png)

### ボットの作成
Amazon Lexを使ってナレッジベースと連携するチャットボットを作っていきます。

７．botの作成
Amazon Lexのコンソールにアクセスしたら「Create Bot」をクリックします。
![lex_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/13b53681-93d4-56c0-822c-165c644d2320.png)

botの設定画面に入ります。
Creation methodは「Create a blank bot」をクリックします。
Bot configrationは「Bot name」に自由に名前を入力してください。
IAM permissionsでは「Create～」をクリックします。
![lex_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/e69a8f18-2bc0-b577-de29-363800f72d0e.png)

下にスクロールして「Children's ~」は「No」を選択します。「Next」をクリックします。
![lex_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/be69a94f-f620-1150-f350-f55ea27d51e5.png)

言語を設定する画面ではデフォルトの「English(US)」のままにして、「Done」をクリックします。
![lex_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/8b65f269-44c3-4017-2097-5e63c8f66fcc.png)

Bot完成後、Intent画面が表示されますが何も設定せず「< Back to ～」のリンクをクリックしてください。
![lex_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/8f392ddc-2c6e-1bfd-09d9-967791529a74.png)

クリック時に未保存で離れてもよいか？と質問されますが「Leave」をクリックしてください。
![lex_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/934418d6-e8d4-e3b6-266f-41d64bef0dd4.png)

８．Intentの作成
Botに具体的に何をしてもらうか設定するIntentの作成をしていきます。

「Add Intent」をクリックします。
![lex_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/59b7710e-7292-39b9-2874-bbb6e135819b.png)

リストが表示されるので「Use built-in intent」をクリックします。＊こちらを誤ると次の設定ができません。
![lex_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/48fd2265-1107-ba83-368f-5bf1a4958c77.png)

Intenの設定画面が表示されるのでUse built-in intentのリストから「AMAZON.QnAIntent」を選択します。
特徴で紹介したAmazon LexのQnAIntent機能はこちらになります。
![lex_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/d36774e1-7d32-436d-228a-0c2708f7e83d.png)

Intent nameを入力したら、「Add」をクリックしてください。
![lex_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/f8589755-d804-f91d-8812-9c8844f63ab5.png)

QnAの設定になります。モデルは「Antropic」「Claude3 Haiku」を選択します。
ナレッジストアは「Knowledge base for Amazon bedrock」を選択します。
「Knowledge base for Amazon Bedrock id」に入れる値は次の画像を参照してください。
![lex_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/58913214-1d34-8049-2d28-3ec06c08bb5e.png)
＊「Knowledge base for Amazon Bedrock id」項目に入力する値は、Amazon Bedrockナレッジベースのコンソール画面のナレッジベースIDになります。


![lex_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/6baccd55-989e-79e5-fe14-bbae98c48e98.png)

ここではサンプルのチャット文をなんでもよいので入力してください。
＊最低１つないとビルドに失敗します。
![lex_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/6ea80d12-b0fd-9598-7510-7876d094c255.png)

設定が終わったら「Save Intent」をクリックして保存します。
![lex_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/33c8109c-fd89-4753-d4a8-0e9fe4a60efe.png)

「Build」をクリックしてビルドを開始します。ビルドが終わるまで少し待ってください。
![lex_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/582a7f8d-4c4c-8f2d-c2b9-302f63e83197.png)

９．テスト
それではチャットボットのテストをしましょう。
「Build」の隣にある「Test」をクリックします。
![lex_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/d86df330-3809-a3ef-d569-f85b9243ff14.png)

テスト用のチャット画面が表示されるので質問を入れて送ってみてください。
＊質問内容はAWS認定のデータソースを使っているので、AWS認定に関する質問にしてください。無関係だと失敗する可能性があります。
![lex_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/3777780d-0ef9-e345-ed15-e1b4bc96d248.png)

### 後片付け（リソースの削除）
チャットボット作成が終わりました。
作ったリソースを残しておくと課金がかかりますので使わないのであれば削除しましょう。

１０．Amazon Lexのbotの削除
Amazon Lexは作成したbotを選択して、「Action」→「delete」と選択してください。
![delete_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/a2f90a1d-d631-780b-ca4b-0e616b85b913.png)

１１．Amazon OpenSearchのコレクションの削除
ナレッジベース作成時、OpenSearchに作成されたコレクションを削除します。

もしナレッジベースが他にも複数ある場合、削除するコレクションをまず確認します。
削除するAmazon BedrockナレッジベースにあるコレクションARMを確認、またはコピーしてメモしておいてください。
![delete_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/d3fba1eb-1545-6f77-af6b-9e4f447e11a5.png)
OpenSearchのコレクションにあるコレクションARMから先ほど確認したナレッジベースのコレクションARMと同じコレクションを探します。見つけたら「Delete collection」をクリックして削除してください。 
![delete_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/69b5297b-92d7-d3d2-b3c2-72741593551b.png)

１２．Amazon Bedrockナレッジベースの削除
最後にナレッジベースを削除します。

削除するナレッジベースの「編集」をクリックします。
![delete_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/e035cc89-ba52-71af-6bd2-aa958b83e83a.png)

編集画面が表示されるので「詳細設定 - オプション」をクリックして、追加表示される「データ削除ポリシー」を確認します。
![delete_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/0e449523-5cff-e034-5e15-3d6ffa73854e.png)

「削除」だったら「保持」をクリックしてください。そして「送信」をクリックして設定を保存します。
![delete_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/c5e17303-15b6-96ed-e9f8-0e6a4c3ad743.png)

「削除」をクリックして、ナレッジベースが削除されるのを待ちます。
![delete_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204961/0f9955fb-4014-61c8-2a8e-51dd14fa5179.png)

後片付けが終わりハンズオンは以上になります！お疲れ様でした！

# 最後に
ハンズオンを一通りやってくださりありがとうございました。
Amazon LexとAmazon Bedrockを使えばコードを書かずに一旦チャットボットを作成できることを実感できたかと思います。
今回対象外でしたChat UIも用意してもらえればインターネットに公開することも可能です。
この体験をもとに生成AIで何が作れるか創造するネタになってもらえたら嬉しいです。

ありがとうございました。