やりたいこと
・Lex(サンプルボット)+Lambdaで、簡単なチャットボットを構築
①Lexボットを作る
Lexが提供するサンプルボットを試したいので、「例から開始」を選択
Lexは三つの例があり、今回は「旅行予約」のサンプルボットを選ぶ
子供を守るための設問に、「児童オンラインプライバシー保護法 (COPPA)」に「はい」
「言語」をJapaneseにし、好きな音声を一つ選ぶ(老若男女いろいろな声があるね)、「完了」を押す
②ボットの確認+カスタマイズ
作ったボットをクリックし、左メニューの「インテント」をクリックすると、「ホテル予約」と「レンタカー予約」のボットが並んでいる
「ホテル予約」をクリックしてみると、まず想定した会話フローが表示され、各質問の分岐および想定回答が確認できる
一ボットは複数の仕事を処理できるので、それを「インテント」と言う
「サンプル発話」は。ユーザーが入力すると予想される代表的なフレーズ。
もし「都市名」らしい言葉が出たら、Lexは自動で認識できて、Location変数に格納する。
「初期応答」は、ユーザーの最初のリクエストを確認するメッセージ。初期状態は未設定ですが、「それではお手伝いします」でカスタマイズする!
「スロット」はボットがインテントを履行するために必要な情報。
ホテルを予約するのに、必要最小限の情報を質問でユーザーから聞き出す。
初期状態は四つしかないが、「スロットを追加」をクリックし、「何名様でしょうか?」を追加した!
Lexのほうで、様々な学習済みの「スロットタイプ」があり、例えば「AMAZON.City」を選択すると、会話中から自動で都市名らしき言葉を認識できる!
「確認」は、スロットですべての必要な情報をユーザーから聞き出したあとの確認メッセージ。
このタイミングで、ユーザーの反応を分析する。「はい」のようなポジティブ反応や、「いいえ」のようにネガティブ反応、それぞれに応じて分岐を設定する。
「フルフィルメント」は「インテント」が完了時のメッセージを設定。
初期状態は空ですが、カスタマイズ内容を入れてみた!
「応答を閉じる」は、一連のやり取りが終わったタイミングの最後の挨拶メッセージ。
③Lambdaを作成する
「一から作成」を選択し、ランタイムは「Python3.13」にし、「関数の作成」
Lambda経由でDynamoとデータの取得や挿入、ほかのAI系サービスとの連携(BedRockなどほかのナレッジによって回答)ができるが、今回はLex+Lambdaの連携だけ試したいので、ほかのサービスをいったん割愛する
今回は、「フルフィルメント」のタイミング(「インテント」完了時)でLambdaを発火させるのを想定し、レスポンスを以下のように設定した
import json
def lambda_handler(event, context):
# Lexからの入力イベントを確認
print("Event received from Lex:", json.dumps(event))
response = {
"messages": [
{
"contentType": "PlainText",
"content": "以下のホテルが取れます:東横INN浅草、東横INN上野、どちらにしますか?"
}
],
"sessionState": {
"dialogAction": {
"type": "Close"
},
"intent": {
"name": "BookHotel",
"state": "Fulfilled"
}
}
}
return response
「フルフィルメント」時ではなく、話す途中で随時Lambdaを発火し、より複雑な分岐もできるので、そのときは以下のAWS公式を参照しつつ、適切にレスポンスの書き方を変更してください!
④Lambdaと連携する
再び「Lex」に戻り、「ボット」>「ボット名」>「デプロイ」>「エイリアス」でクリックし、言語の「Japanese」を選択
「BookHotelインテント」の設定画面に戻り、「フルフィルメント」の「詳細オプション」をクリック。
「フルフィルメントに Lambda 関数を使用」にチェックを入れる
ちなみに、もし会話の開始時や途中に随時Lambdaをトリガーしたい場合、画面一番下の「初期化と検証に Lambda 関数を使用」にチェックを入れる必要がある。今回は設定しない。
⑤ボットを再構築+テスト
すべての設定が終わったら、インテント画面右上の「構築」をクリックし、ボットを再構築する。
構築に成功したら、画面右上の「テスト」をクリックし、ボットをテストできる
そして、以下のようなボットが完成した!
フルフィルメントのLambda関数からのレスポンスの表示できている!
(今回はLambdaにハードコードした内容をそのまま返すが、Lambda経由でDynamoやほかのAI系サービスからの結果を返すのもできる!)
参考サイト