3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Qiita100万記事感謝祭!記事投稿キャンペーン開催のお知らせ

Lex+Lambdaで、簡単なチャットボットを構築してみました

Last updated at Posted at 2025-01-16

やりたいこと

・Lex(サンプルボット)+Lambdaで、簡単なチャットボットを構築

①Lexボットを作る

Lex画面に遷移、「ボットを作成」をクリック
image.png

Lexが提供するサンプルボットを試したいので、「例から開始」を選択
Lexは三つの例があり、今回は「旅行予約」のサンプルボットを選ぶ
image.png

ボット名入力、IAMロールを新規で作成
image.png

子供を守るための設問に、「児童オンラインプライバシー保護法 (COPPA)」に「はい」
image.png

詳細設定せずに「次へ」
image.png

「言語」をJapaneseにし、好きな音声を一つ選ぶ(老若男女いろいろな声があるね)、「完了」を押す

image.png

すると、ボットが構築された!
image.png

②ボットの確認+カスタマイズ

作ったボットをクリックし、左メニューの「インテント」をクリックすると、「ホテル予約」と「レンタカー予約」のボットが並んでいる

image.png

「ホテル予約」をクリックしてみると、まず想定した会話フローが表示され、各質問の分岐および想定回答が確認できる
image.png

一ボットは複数の仕事を処理できるので、それを「インテント」と言う
image.png

「サンプル発話」は。ユーザーが入力すると予想される代表的なフレーズ。
もし「都市名」らしい言葉が出たら、Lexは自動で認識できて、Location変数に格納する。

image.png

「初期応答」は、ユーザーの最初のリクエストを確認するメッセージ。初期状態は未設定ですが、「それではお手伝いします」でカスタマイズする!

image.png

「スロット」はボットがインテントを履行するために必要な情報。
ホテルを予約するのに、必要最小限の情報を質問でユーザーから聞き出す。

image.png

初期状態は四つしかないが、「スロットを追加」をクリックし、「何名様でしょうか?」を追加した!
Lexのほうで、様々な学習済みの「スロットタイプ」があり、例えば「AMAZON.City」を選択すると、会話中から自動で都市名らしき言葉を認識できる!
image.png

「確認」は、スロットですべての必要な情報をユーザーから聞き出したあとの確認メッセージ。
このタイミングで、ユーザーの反応を分析する。「はい」のようなポジティブ反応や、「いいえ」のようにネガティブ反応、それぞれに応じて分岐を設定する。

image.png

「フルフィルメント」は「インテント」が完了時のメッセージを設定。
初期状態は空ですが、カスタマイズ内容を入れてみた!

image.png

「応答を閉じる」は、一連のやり取りが終わったタイミングの最後の挨拶メッセージ。
image.png

③Lambdaを作成する

Lambdaを開き、「関数の作成」をクリック
image.png

「一から作成」を選択し、ランタイムは「Python3.13」にし、「関数の作成」
image.png

関数を開き、コードを編集しデプロイ。
image.png

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」を選択
image.png

先ほどのLambda関数を設定する。
image.png

「BookHotelインテント」の設定画面に戻り、「フルフィルメント」の「詳細オプション」をクリック。
image.png

「フルフィルメントに Lambda 関数を使用」にチェックを入れる

image.png

ちなみに、もし会話の開始時や途中に随時Lambdaをトリガーしたい場合、画面一番下の「初期化と検証に Lambda 関数を使用」にチェックを入れる必要がある。今回は設定しない。
image.png

⑤ボットを再構築+テスト

すべての設定が終わったら、インテント画面右上の「構築」をクリックし、ボットを再構築する。
image.png

構築に成功したら、画面右上の「テスト」をクリックし、ボットをテストできる
そして、以下のようなボットが完成した!
image.png

フルフィルメントのLambda関数からのレスポンスの表示できている!
(今回はLambdaにハードコードした内容をそのまま返すが、Lambda経由でDynamoやほかのAI系サービスからの結果を返すのもできる!)
image.png

参考サイト

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?