Quickstart guide for building a serverless chatbot with Amazon Lex

Amazon announced “Amazon Lex” in December 2016 and since then we’ve been using it to build bots for our customers. Lex is effectively the technology used by Alexa, Amazon’s voice-activated virtual assistant which lets people control things with voice commands such as playing music, setting alarm, ordering groceries, etc. It provides deep learning-powered natural-language understanding along with automatic speech recognition. Amazon now provides it as a service that allows developers to take advantage of the same features used by Amazon Alexa. So, now there is no need to spend time in setting up and managing the infrastructure for your bots.

Now, developers just need to design conversations according to their requirements in Lex console. The phrases provided by the developer are used to build the natural language model. After publishing the bot, Lex will process the text or voice conversations and execute the code to send responses.

I’ve put together this quick-start tutorial using which you can start building Lex chat-bots. To understand the terms correctly, let’s consider an e-commerce bot that supports conversations involving the purchase of books.

LEX-RELATED TERMINOLOGIES

Bot: It consists of all the components related to a conversation, which includes:

  • Intent: Intent represents a goal, needed to be achieved by the bot’s user. In our case, our goal is to purchase books.

  • Utterances: An utterance is a text phrase that invokes intent. If we have more than one intent, we need to provide different utterances for them. Amazon Lex builds a language model based on utterance phrases provided by us, which then invoke the required intent. For our demo example, we need a single intent “OrderBook”. Some sample utterances would be:

    • I want to order some books

    • Can you please order a book for me

  • Slots: Each slot is a piece of data that the user must supply in order to fulfill the intent. For instance, purchasing a book requires bookType and bookName as slots for intent “OrderBook” (I am considering these two factors for making the example simpler, otherwise there are so many other factors based on which one will purchase/select a book.). 
    Slots are an input, a string, date, city, location, boolean, number etc. that are needed to reach the goal of the intent. Each slot has a name, slot type, a prompt, and is it required. The slot types are the valid values a user can respond with, which can be either custom defined or one of the Amazon pre-built types.

  • Prompt: A prompt is a question that Lex uses to ask the user to supply some correct data (for a slot) that is needed to fulfill an intent e.g. Lex will ask  “what type of book you want to buy?” to fill the slot bookType.

  • Fulfillment: Fulfillment provides the business logic that is executed after getting all required slot values, need to achieve the goal. Amazon Lex supports the use of Lambda functions for fulfillment of business logic and for validations.


LET'S IMPLEMENT THIS BOT!

Now that we are aware of the basic terminology used in Amazon Lex, let's start building our chat-bot.

Creating Lex Bot:

  • Go to Amazon Lex console, which is available only in US, East (N. Virginia) region and click on create button.

  • Create a custom bot by providing following information:

  1. Bot Name: PurchaseBook

  2. Output voice: None, this is only a test based application

  3. Set Session Timeout: 5 min

  4. Add Amazon Lex basic role to Bot app: Amazon will create it automatically.  Find out more about Lex roles & permissions here.

  5. Click on Create button, which will redirect you to the editor page.

1_customBotSettings.png


ARCHITECTING BOT CONVERSATIONS

 

Create Slots: We are creating two slots named bookType and bookName. Slot type values can be chosen from 275 pre-built types provided by Amazon or we can create our own customized slot types.

Create custom slot type for bookType as shown here and consider predefined type named Amazon.Book for bookName.


Create Intent: Our bot requires single custom intent named OrderBook.

Configuring the Intents

  • Utterances: Provide some utterances to invoke the intent. An utterance can consist only of Unicode characters, spaces, and valid punctuation marks. Valid punctuation marks are periods for abbreviations, underscores, apostrophes, and hyphens. If there is a slot placeholder in your utterance ensure, that it's in the {slotName} format and has spaces at both ends.

Slots: Map slots with their types and provide prompt questions that need to be asked to get valid value for the slot. Note the sequence, Lex-bot will ask the questions according to priority.

Confirmation prompt: This is optional. If required you can provide a confirmation message e.g. Are you sure you want to purchase book named {bookName}?, where bookName is a slot placeholder.

confirmation_prompt.png

Fulfillment: Now we have all necessary data gathered from the chatbot, it can just be passed over in lambda function, or the parameters can be returned to the client application that then calls a REST endpoint.

CREATING AMAZON LAMBDA FUNCTIONS

Amazon Lex supports Lambda function to provide code hooks to the bot. These functions can serve multiple purposes such as improving the user interaction with the bot by using prior knowledge, validating the input data that bot received from the user and fulfilling the intent.

  • Go to AWS Lambda console and choose to Create a Lambda function.     
  • Select blueprint as blank function and click next.     
  • To configure your Lambda function, provide its name, runtime and code needs to be executed when the function is invoked. The code can also be uploaded in a zip folder instead of providing it as inline code. We are considering Nodejs4.3 as runtime.
  • Click next and choose Create Function.

We can configure our bot to invoke these lambda functions at two places. We need to do this while configuring the intent as shown below:-

where, botCodeHook and fulfillment are name of lambda functions we created.
 

Lambda initialization and validation           

Lambda function provided here i.e. botCodeHook will be invoked on each user input whose intent is understood by Amazon Lex. It will validate the bookName with predefined list of books.

Fulfillment code hook

This lambda function is invoked after receiving all slot data required to fulfill the intent.

Error Handling: We can customize the error message for our bot users. Click on error handling and replace default values with the required ones. Since the number of retries given is two, we can also provide different message for every retry.

YOUR BOT IS NOW READY TO CHAT

Click on Build to build the chat-bot. Congratulations! Your Lex chat-bot is ready to test. We can test it in the overlay which appears in the Amazon Lex console.

Sample conversations:

8_coversation1.png

I hope you have understood the basic terminologies of Amazon Lex along with how to create a simple chat-bot using serverless (Amazon Lambda). This is a really powerful platform to build mature and intelligent chatbots.


priyanka.jpg

Priyanka is an experienced software engineer with expertise in machine learning and data analysis. In the past, she worked on image classification & recognition software across domains like fingerprint analysis & geospatial analytics. Currently, she is developing intelligent chatbots with voice and text interfaces and is excited about the prospects of intelligent interfaces for B2B ISVs.