1. はじめに
- 前回の記事「Amazon Lex を使ってみる (星座占いVoiceBotの作成)」で、Lexの基本的な使い方を学習した。
- 今回は、ユーザの入力に応じて、LexからLamdba経由でBedrockのLLMを呼んで、動的な回答を作成するボットを作成する。
- また、自分としては初めて、AWSのAI付きIDE「Kiro」を使ってVibe Coding的な感じで作業した。生成されたコードの精査ができておらず(そのため掲載は自粛)、この記事では、アーキテクチャの概要と、Kiroを使った開発の雰囲気に関してをまとめたい。
2. やったこと
-
旅行プランを作ってくれるボットを作成する。
- ユーザに対して、行き先、人数、期間、交通手段をヒアリングする。
- 入力内容に応じた旅行プランを提示する。
-
Kiroに一通り設定ファイルやコードを作ってもらい、それを内容確認しながらデプロイする。
-
以下は成果物の動作イメージ(Lexで行き先などをヒアリングして、その内容をもとにBedrockで旅行プランを作成する流れ)
3. 構成図
- WEBフロントエンド(CloudFrontとS3)は前回構築したものを流用するため、今回はLex BotとLambdaを作成する。
4. 構築手順
4.1 事前準備
- KiroはPC(Windows)にインストールして初期設定済。
- 全部自動でやってもらうのはまだなんとなく心配なため、Kiroから直接AWSリソースの操作ができるようにはしていない(Kiroが生成したawsコマンドやシェルを自分で手動で実行する)。
4.2 Kiroへの要件入力、コード生成
やりたいことの入力
- Vibeモード(とりあえず動くものを作るモード)を選択し、やりたいことを簡潔にKiroに指示すると、アーキテクチャや進め方を提示してくれる。
- 作成するリソースの一覧を出してもらう。今回は、Lex Bot(JSON定義)、Lexから呼ばれるLambda、Bedrockを呼ぶLambdaの3つがメインで、あとは付随するIAMロールなどとなる。
Lambdaの作成
- まず、Lambdaの作成を指示すると、関数本体およびREADMEが作成される。
- 内容は問題なさそうな雰囲気だったので、生成されたコードをコピペして、手動でマネコンで2つのLambda関数を作成した。
- 呼び出されるLLMはClaude 3 Haikuになっていたが、速度重視なのでそれでOKとした。またHaikuとはいえ応答時間はかかるため、タイムアウト値は大きくした。
Lex Botの作成
- 次にLex Bot の定義の作成を指示する。
- Lex Bot の作成や設定追加を行うシェルスクリプト(Lexを設定するAWSコマンドを大量に含む)が生成されたため、それをそのまま実行したが、こちらは生成内容の精度があまりよくなかった(シェルスクリプトを実行してもたびたびエラー発生)
- 原因としては、Lexには v1とv2があり、v2になった際にAWSコマンドのパラメータ指定がかなり変更されているが、それがうまく学習できていないのかなという印象。(Lex v2ときちんと指示すればよかったのかもだが、、)
- パラメータ指定だけでなく、内容の過不足も見られた。本来、スロット(ユーザから入力された値の保存先。行き先、人数、期間、交通手段の4つが必要)の定義が必要だが、スロットタイプ(スロットが取りうる値。交通手段であれば飛行機、新幹線、車)の定義しか生成されていなかった。
- エラーがなくならないため、Lex Botについては生成されたシェルスクリプトの中身を見ながらマネコンで自分で設定した。主な設定内容は以下。
- インテント「PlanTravelIntent」を作成
- 2つのカスタムスロットタイプ
- DestinationType: 東京、大阪、京都
- TransportationType: 飛行機、新幹線、車
- 4つのスロット
- Destination: カスタムスロットタイプ(DestinationType)
- GroupSize: Number
- TravelPeriod: Number
- Transportation: カスタムスロットタイプ(TransportationType)
- 4つのスロットの情報取得完了(Fulfillment)した際に呼び出すLambda関数: travel-bot-fullfilment
- 2つのカスタムスロットタイプ
- 今回の設計だと目的地が東京、大阪、京都からしか選べないが、いったんこれでよしとする。
- インテント「PlanTravelIntent」を作成
動作テスト
- Lex Bot のテストを行い、Fulfillment完了時に2つのLambdaが順に呼び出され、旅行プランが提示されることを確認した。Lambdaのコードは全く修正の必要がなく、一発で旅行プランの提示までが成功した。
- ただ何も問題がなかったわけではなく、例えばスロットの入力値をバリデーションするような処理を行うコードは存在しているが、それがうまく呼び出されるようにはなっていないなどの課題があった。コードとしては要修正のところがあったが、今回の私のゴール(LexからBedrockを呼べること)としては必須ではなかったため修正は見送った。
5. 動作確認
CloudFrontのWEB画面から、文字入力もしくは音声入力で、旅行プランを作成してもらえることを確認する。
- 一応、条件に合わせた内容をBedrockが提案してくれている。
- プランができるまでの待ち時間が5秒くらいなので、音声チャットだとしてもなんとか許容範囲。
6. 所感
- とりあえず今回のゴールは、LexからBedrockを呼べることだったので、それは達成できてよかった。
- 今回、かなり適当にやってみてしまったため、Kiroの機能を全然使いこなせていない。チュートリアルを実施するなど、Kiroの使い方を体系的に学習するようにしたい。
- Kiroがコードを作ってくれるとはいえ、当然ながらレビューができるレベルの理解は必要なため、コードの中身の理解とKiroの使い方の理解の両方を頑張れるようにしたい。









