Cursus
Contextbewuste chatbots houden eerdere invoer van gebruikers bij en relateren die aan recente interacties. Zo kunnen ze op een natuurlijke manier met gebruikers communiceren en de gebruikerservaring verbeteren. Amazon Lex is een contextbewuste chatbot uit de Amazon Web Services (AWS)-suite. Het werd in 2017 uitgebracht en een verbeterde versie, Lex V2, verscheen in 2021.
In deze tutorial introduceer ik de basisconcepten van AWS Lex V2 en laat ik zien hoe je het gebruikt. Ik behandel hoe je Lex instelt en configureert, je eerste Lex-chatbot maakt en koppelt aan externe backends. Ook geef ik een overzicht van het integreren van Lex met platforms van derden zoals websites en messaging-apps.
Wat is Amazon Lex?
Amazon Lex is een op AI gebaseerde conversational engine die wordt aangeboden door AWS. Lex accepteert gebruikersinvoer in de vorm van spraak en tekst. De ontwikkelaar specificeert de gespreksflow. Op basis daarvan beheert Lex de dialoog door te reageren op de invoer van de gebruiker. De conversational interface kan vervolgens worden uitgerold als voicebot, webapp, chatplatform (zoals Slack of Facebook Messenger), enz. Lex wordt ook gebruikt om Amazon Alexa te bouwen.
Lex combineert twee basisfunctionaliteiten: natural language understanding (NLU) en automatische spraakherkenning (ASR). Het stelt ontwikkelaars zonder deep-learningexpertise in staat om conversational interfaces te bouwen voor chatbots, virtuele assistenten en vergelijkbare toepassingen.
Omdat het een Amazon-dienst is, integreert het met andere AWS-services zoals:
- Amazon Cognito (voor identitymanagement)
- Amazon CloudWatch (voor monitoring van de service)
- DynamoDB (voor de database-backend)
- Amazon Lambda (om te verbinden met externe gegevensbronnen zoals Salesforce en HubSpot), enz.
Dankzij deze integraties is het eenvoudiger om de conversational AI-service uit te rollen en op te schalen.
Amazon Lex instellen
In deze sectie laat ik zien hoe je Amazon Lex instelt.
Let op: de AWS-gebruikersinterface verandert regelmatig. De lay-out en tekst van verschillende secties en titels in de instructies en screenshots kunnen in de loop van de tijd of per regio wijzigen.
Stap 1: Meld je aan bij de AWS-console
Ik ga ervan uit dat je al een AWS-account hebt. Zo niet, volg dan de instructies op de AWS Signup-pagina en registreer een nieuw account.
In deze gids gebruiken we de AWS-console om Lex in te stellen en te gebruiken. Voer je AWS-inloggegevens in om je aan te melden bij de AWS Lex-console en op de startpagina van Lex te landen.
Stap 2: Maak een nieuwe bot
- Ga om een nieuwe bot te maken naar de Amazon Lex-console.
- Selecteer Get Started.
Hiermee kom je op de Bots-startpagina (hieronder getoond). Deze pagina toont de lijst met bots die je al hebt gemaakt.

Amazon Lex Bots-homepage.
- Selecteer op deze pagina Create Bot.
Je gaat dan naar de configuratiepagina voor een nieuwe bot. Je ziet daar twee methoden om bots te maken: Traditional en Generative AI.

Nieuwe bot maken.
We willen het proces van het instellen en configureren van bots leren. Kies daarom de Traditional methode en begin met een lege bot.
- Bot name: Geef de bot een naam en beschrijving. In dit artikel maken we een eenvoudige bot met de naam “CabBookBot” om een taxi te boeken.
- IAM permissions: Kies de juiste rol om autorisatie en authenticatie voor de bot te beheren.
- Als je al eerder bots hebt gemaakt, kies dan uit de vervolgkeuzelijst met bestaande rollen.
- Als dit je eerste bot is, kies dan “Create a role with basic Amazon Lex permissions.”
- COPPA: Als deze bot bedoeld is voor kinderen en minderjarigen, geef dan aan dat deze onder de Children’s Online Privacy Protection Act (COPPA) valt. Wij kiezen “No”.
- Idle session timeout: Bots moeten eerdere berichten van de gebruiker onthouden om “context” te behouden gedurende het gesprek. Als een gebruiker een tijdje niet heeft gereageerd, gaan we ervan uit dat deze de bot niet meer gebruikt en resetten we de context voor een nieuwe gebruiker. Laat dit op de standaardwaarde staan.
Je hoeft de optionele geavanceerde instellingen niet te wijzigen; ga gewoon naar de volgende sectie.
Je moet ook de taal/talen van de bot instellen, omdat Lex-bots zijn gebaseerd op natural language processing (NLP).
- In dit voorbeeld gebruiken we de standaardtaal English (US).
- Behoud de standaardinstellingen en selecteer Done.
Vervolgens kom je op de pagina Intents, die we in de volgende sectie configureren.
Nu we een basisbot hebben gemaakt, leg ik uit hoe je deze configureert voor onze gewenste usecase: een taxi boeken.
Stap 3: Intents configureren
Zoals de naam al suggereert, vertegenwoordigen intents de bedoeling van de gebruiker of het doel van het gesprek. Een gebruiker wil bijvoorbeeld een hotel of een vlucht boeken. Elke bot kan meerdere doelen bedienen.
Als je enkele voorbeeldteksten (zogeheten sample utterances) per intent aanlevert, gebruikt NLP om de invoer van de gebruiker te herkennen en te matchen met de juiste intent op basis van deze uitingen. Een taxiboekingsbot kan bijvoorbeeld sample utterances hebben als “I want to book a cab”, “book me a cab from X to Y on this date”, enz.
Na het selecteren van Done op de bot-creatiepagina in de vorige stap, kom je op de pagina waar je een nieuwe intent met de naam NewIntent kunt aanmaken.
Op de Intent-pagina:
- Zoek bovenaan de Conversation Flow. Deze illustreert de flow en voorbeeldberichten voor elke gespreksstap.
- Werk de naam van de intent bij naar iets betekenisvols, zoals “CabBookIntent”, en voeg een relevante beschrijving toe.
Stap 4: Voeg sample utterances toe
Lex heeft enkele sample utterances per intent nodig om te herkennen of de behoefte van de gebruiker overeenkomt met de huidige intent.
- Scroll op de Intent-pagina naar de sectie Sample utterances.
- Schakel het editorvenster naar Plain Text.
- Voeg enkele sample utterances toe, één per regel, bijvoorbeeld:
- I want to book a taxi
- Book me a cab
- I need to make a taxi reservation

Sample utterances.
- Voeg een Initial response toe, zoals “Oké, ik help je een taxi te boeken”, om het verzoek van de gebruiker te bevestigen.
Een gespreksflow maken
Lex-bots volgen een vooraf gedefinieerde gespreksstructuur. De gespreksflow schetst en specificeert de componenten van het gesprek. In deze sectie leg ik uit hoe je het gesprek ontwerpt om met de gebruiker te communiceren en de informatie te krijgen die nodig is om het verzoek af te handelen.
Stap 1: Voeg slots toe om gebruikersinvoer vast te leggen
De bot moet de gebruiker om relevante informatie vragen. Slots bevatten informatie die de bot nodig heeft om het verzoek van de gebruiker te vervullen. Zo ontvangt de taxiboekingsbot de vertrek- en aankomststad en de reisdatum als slotwaarden.

Slots toevoegen aan intents.
Voor elk slot moet je deze parameters opgeven:
- Slot name: De bot gebruikt deze naam als placeholder voor de slotwaarde. Je kunt bijvoorbeeld de botrespons configureren als “Je wilt reizen van {SourceCity}”, en hij vervangt automatisch de waarde van het door de gebruiker ingevoerde slot
SourceCity. - Slot type: Net als programmeervariabelen kunnen Lex-slots verschillende typen hebben. Er zijn veel vooraf gebouwde slottypen, zoals
AMAZON.City,AMAZON.Date, enz. Je kunt ook aangepaste slottypen toevoegen (later besproken). - Prompt: Geef een tekstsjabloon op die de bot kan gebruiken om de gebruiker te vragen (prompten) naar de waarde van elk slot.
- Selecteer Add Slot en voeg de volgende slots toe, gemarkeerd als verplicht:
|
Slot name |
Slot type |
Prompt |
|
SourceCity |
AMAZON.City |
From welke stad reis je? |
|
DestinationCity |
AMAZON.City |
Naar welke stad reis je? |
|
TravelDate |
AMAZON.Date |
Op welke datum reis je? |
- Voeg een paar extra uitingen toe die de slotwaarden direct vastleggen. Bijvoorbeeld:
- Book a cab on {TravelDate} from {SourceCity} to {DestinationCity}
- Book a cab from {SourceCity} to {DestinationCity} for {TravelDate}
Aangepaste slots
Ingebouwde slottypen zijn niet altijd voldoende voor alle usecases. Zo kan een taxiboekingsdienst een slottype hebben voor het type auto (compact, hatchback, sedan, SUV, enz.) dat de gebruiker wil.
Een aangepast slottype toevoegen:
- Ga naar Slot types via het menu in de linkerkolom:
- CabBookBot > Bot versions > Draft version > All languages > English (US) > Slot types).
- Voeg een naam (zoals
CabType) en een beschrijving toe voor het nieuwe slottype. - Kies een van de twee typen slotwaarden:
- Expand: Je geeft enkele voorbeeldwaarden op voor het slot, en Lex gebruikt deze als voorbeelden om nieuwe mogelijke waarden te leren. Gegeven een lijst met achternamen past Lex bijvoorbeeld het slottype aan om vergelijkbare achternamen te accepteren die je niet expliciet hebt opgesomd.
- Restrict: Het slot accepteert alleen waarden uit de lijst die je opgeeft. Het leert geen nieuwe waarden.
In dit geval hebben we enkele vooraf bepaalde taxi-types. We beperken onze slotwaarden dus tot deze types.
- Je kunt ook alternatieve waarden voor elke waarde opgeven. Voor het type taxi is
Limobijvoorbeeld een acceptabele waarde voorLimousine.

Aangepaste slots.
- Selecteer Save Slot type. Het nieuwe slottype is beschikbaar wanneer je een slot aan de intent toevoegt.
Stap 2: Prompting en foutafhandeling configureren
Wanneer de gebruiker een ongeldige reactie geeft op een prompt voor een slotwaarde, herhaalt Lex de prompt. De sessie wordt beëindigd als de gebruiker herhaaldelijk geen geldige reactie geeft (zoals een geldige stadsnaam).
Stel Lex in om een foutmelding te geven (vóór het beëindigen van de sessie) als de gebruiker herhaaldelijk geen geldige slotwaarde opgeeft:
- Selecteer een individueel slot en kies Advanced options voor dat slot.
- Scroll in het venster met geavanceerde opties naar de sectie Slot capture: failure response.
- Geef een passende reactie voor ongeldige invoer. Als de gebruiker bijvoorbeeld herhaaldelijk een niet-herkende stad invoert, kan de bot reageren met “Sorry, we don't serve that city.”

Foutafhandeling en failure response.
Alle bots hebben een FallbackIntent, die wordt aangeroepen wanneer de invoer van de gebruiker niet overeenkomt met bestaande intents. Omdat deze intent als standaard wordt aangeroepen, kunnen de uitingen niet worden aangepast.
- Geef een betekenisvolle afsluitende reactie op met de
FallbackIntenten beëindig het gesprek.

Afsluitende reactie.
Stap 3: Bevestiging, fulfillment en afsluiten
Bevestig de intent van de gebruiker nadat je de juiste waarden voor de slots hebt gekregen en vóórdat je het verzoek vervult.
- Gebruik de sectie Confirmation om een bevestigingsprompt te geven.
- Let op dat er een kleine schakelaar is voor de Confirmation-dialoog. Schakel deze in.
Het is gebruikelijk om de slotwaarden in de bevestigingsprompt op te nemen. Bijvoorbeeld: “Bevestig (ja of nee) dat je een boeking wilt maken van {SourceCity} naar {DestinationCity} op {TravelDate}”.
- Geef een Decline response voor het geval de gebruiker negatief reageert op de bevestigingsprompt. Bijvoorbeeld: “Oké, we voeren deze boeking niet uit”.

Bevestigingsprompt.
De fulfillment-respons geeft aan de gebruiker aan dat de bot begint met het afhandelen van het verzoek (de taxi boeken).
- Geef in de sectie Fulfillment nog een bericht nadat het verzoek succesvol is afgehandeld. Bijvoorbeeld: “Oké, we hebben deze boeking gemaakt.”
De afsluitende reactie is het laatste bericht dat naar de gebruiker wordt gestuurd. Bijvoorbeeld: “Bedankt dat je met ons reist. Goede reis!”
- Werk de reacties bij en selecteer Save intent.

Fulfillment- en afsluitende reacties.
Je Amazon Lex-bot testen
Nu we de bot en de gespreksstructuur hebben gemaakt, kunnen we hem testen!
Stap 1: Testen in de Lex-console
- Zoek de knoppen Build en Test bovenaan de Intents-pagina.
- Build de bot. Je moet de bot na elke wijziging opnieuw bouwen.
- Selecteer Test om de bot in de Lex-console te testen.
- Voer relevante berichten in in het pop-up chatvenster en reageer op de prompts van de bot.

De Amazon Lex-bot testen.
Veelvoorkomende configuratiefouten
Sommige secties, zoals Confirmation, Fulfillment en Closing response, zijn in principe optioneel. Schakel de schakelaar in om een sectie te activeren.
In sommige gevallen wordt bij het inschakelen van een sectie of reactie automatisch een Lambda-functie voor die sectie ingeschakeld. Als een specifieke sectie de Lambda-functieschakelaar op “aan” heeft staan maar er geen bijbehorende Lambda-functie is, krijg je een fout zoals hieronder:
Cannot call FulfillmentCodeHook for Intent CabBookIntent. BotAlias/LocaleId TestBotAlias/en_US doesn't have an associated Lambda Function.
Bovenstaande fout komt uit de sectie Fulfillment. Ga naar advanced settings in de betreffende sectie en vink de optie om een Lambda-functie te gebruiken uit om dit op te lossen.
Een vergelijkbare fout treedt op wanneer de flow verkeerd is geconfigureerd. Neem bijvoorbeeld dit foutbericht tijdens de buildfase:
'ElicitSlot' next step at 'InitialResponse:CodeHook:Success' in intent 'CabBookIntent' contains invalid slotToElicit setting. slotToElicit must be a required Slot within the intent. Change the slot name in slotToElicit and try your request again.
Ga om deze fout op te lossen naar de Advanced options voor de Initial response. Let op dat de Dialog Code hook-schakelaar actief is. Op dit moment hebben we echter nog geen Lamba-functies ingeschakeld of geconfigureerd om het gesprek te initialiseren. Deactiveer de code hook en werk de bot bij; de build zou normaal moeten verlopen.

Geavanceerde opties voor initial response.
Stap 2: Testen met spraak (optioneel)
Lex-bots werken standaard met zowel tekst als spraak.
- Druk op het microfoonpictogram in het chatvenster om met spraak te communiceren.
- De placeholdertekst in het invoerveld verandert in “Listening…”.
- Spreek je intent uit, bijvoorbeeld “I want to book a taxi.”
- Druk op het vinkje rechts van het tekstinvoerveld.
- Lex transcribeert de spraakinvoer kort en reageert met audio.
Amazon Polly zet tekst om in natuurlijke spraak. Het wordt gebruikt in spraakgebaseerde applicaties, zoals nieuwslezers, games, bots, enz., om mensachtige spraak uit tekst te genereren. Sinds 2021 ondersteunt Amazon Lex Amazon Polly Neural Text-to-Speech (NTTS). Zo kan de Lex-bot direct natuurlijk klinkende stemreacties genereren.
Zo configureer je de stem van de bot:
- Selecteer op de startpagina van de bot View languages.
- Kies de juiste taal.
- Je kunt de relevante taal ook selecteren onder de optie All languages in het linkermenu.
- Selecteer in de sectie Language details Edit.
- Dit brengt je naar de pagina Language.
- Onder de sectie Voice kun je verschillende stemvoorbeelden beluisteren en de gewenste text-to-speech-stem selecteren.
Een fulfillment definiëren met AWS Lambda
In de praktijk moet een bot communiceren met andere backendservices. Een taxiboekingsbot moet bijvoorbeeld de reisinformatie naar een API-endpoint sturen en een succesvolle respons ontvangen. Lambda-functies helpen hierbij.
AWS Lambda-functies zijn een manier om server-side logica te schrijven en uit te voeren zonder expliciet een VPS of compute-instances te huren.
Aan de slag met Lambda-functies:
- Ga naar de AWS Lambda-startpagina.
- Selecteer Create function.
- Kies voor dit voorbeeld de optie om een functie from scratch te maken.
- Kies
Python 3.x(3.13 ten tijde van schrijven) als taal enx86_64als processor om de functie uit te voeren. - Als dit je eerste Lambda-functie is, maak dan een nieuwe rol aan. Je kunt ook een van de bestaande rollen gebruiken als je weet dat deze de juiste rechten heeft.
- Selecteer Create function.
- Voer de code van de functie in op het tabblad Code op de webpagina van de specifieke Lambda-functie.
Hieronder laten we een korte Lambda-functie zien die een succesbericht verstuurt in de sectie Fulfillment:
import json
import urllib.request
def lambda_handler(event, context):
slots = event['sessionState']['intent']['slots']
intent = event['sessionState']['intent']['name']
if event['invocationSource'] == 'FulfillmentCodeHook':
message = "Lambda has placed your reservation"
response = {
"sessionState": {
"dialogAction": {
"type": "Close"
},
"intent": {
'name':intent,
'slots': slots,
'state':'Fulfilled'
}
},
"messages": [
{
"contentType": "PlainText",
"content": message
}
]
}
return response
Configureer de bot om deze Lambda-functie aan te roepen:
- Ga naar de startpagina van de bot. Selecteer in het linkermenu de optie Aliases (Deployment > Aliases).
- Standaard is er al een alias met de naam TestBotAlias.
- Selecteer de alias.
- Zoek op de aliaspagina onder languages de taal van de bot. Dit voorbeeld is in English(US).
- Selecteer de taal.
- Zoek op de taalpagina de sectie Lambda-functie.
- Selecteer onder source de naam van je Lambda-functie.
- De standaardkeuze voor de versie is
$LATEST. Laat dit ongewijzigd. - Sla de wijzigingen op.
In dit voorbeeld willen we de Lambda-functie gebruiken in de fulfillment-fase:
- Ga op de Intent-pagina naar Advanced options onder de sectie Fulfillment .
- Vink onder de sectie Fulfillment Lambda code hook het selectievakje met het label Use a Lambda function for fulfillment aan.
- Sla de wijzigingen op (selecteer Update options) in de Fulfillment-opties.
- Sla de intent op.
- Ga naar de Intent-pagina van de bot, bouw hem en test hem.
Nu komt de reactie van de Lambda-functie:

De Lambda-functie testen die met de Lex-bot is geïntegreerd.
Je Amazon Lex-bot uitrollen
Na het maken en testen van de Lex-bot zijn we klaar om hem uit te rollen. Deployment is een complex onderwerp waarvan de details afhangen van de individuele usecase. In deze sectie geef ik een overzicht van verschillende gangbare deploymentmethoden.
Stap 1: Uitrollen op een web- of mobiele applicatie
Lex kan in webapps en mobiele apps worden geïntegreerd met de API, de SDK of kant-en-klare libraries:
- CloudFormation: AWS CloudFormation is een Infrastructure as Code-oplossing. Hiermee kun je YAML-bestanden gebruiken om verschillende AWS-resources te bundelen, in te richten, uit te rollen en te beheren als één compleet product. CloudFormation heeft templates om verschillende AWS-producten te integreren, zoals S3-buckets, Lambda-functies, Lex-bots en meer. Gebruik het Lex YAML-templatebestand om de Lex-bot als onderdeel van een CloudFormation-project te configureren.
- Website-integratie: AWS heeft een set Javascript-loaderbestanden en de AWS SDK beschikbaar gesteld om een bot in een website te laden. Deze omvatten de kant-en-klare Lex UI-bestanden en een loaderlibrary om de Lex-bot te laden. De bot kan in een website worden geïntegreerd als een zelfstandige webpagina of een iframe.
- Mobiele native apps: AWS Amplify bevat tools om te integreren met diverse mobiele en webfrontends, zoals ReactJS / React Native, NextJS, Angular, Android, iOS, en meer. De Amplify-documentatie legt uit hoe je een Lex-bot configureert om met deze SDK’s te werken.
- Lex API: Wil je volledige controle over de interacties en interface, dan kun je de Lex API gebruiken. Met de API kun je de berichten van de gebruiker en de bot (naar elkaar) doorgeven terwijl je de gebruikerservaring via je app in de hand houdt. Lex biedt twee API’s:
- De Runtime API wordt gebruikt voor gebruikersinteractie, zoals hierboven uitgelegd.
- De Build API wordt gebruikt om de Lex-bot programmatisch te bouwen en te configureren in plaats van via de GUI.
De onderstaande stappen schetsen hoe je de chatbot als webpagina uitrolt:
- Gebruik de Lex Web UI Loader-library. Deze library maakt een object
ChatBotUiLoader, met de constructorsFullPageLoader()enIframeLoader. Deload()-functie van deze constructors laadt de bot respectievelijk in de pagina of iFrame. - Specificeer voor het laden van de bot op de webpagina de chatbotconfiguratie:
- De Cognito pool ID. Let op: je hebt een AWS Cognito identity pool nodig om verbinding te maken met de bot. Je kunt een identity pool maken via de AWS Cognito-console. Je moet de Cognito identity pool koppelen aan de Lex-bot.
- De naam en details van de Lex-bot.
- Laad de bot met de functie
.load().
Het onderstaande fragment laat de opzet zien van een JavaScript-functie die een Lex-bot op een webpagina uitrolt:
<!-- LexWebUi loader -->
<script src="./lex-web-ui-loader.js"></script>
<script>
// instantiate the loader
var lexWebUiLoader = new ChatBotUiLoader.FullPageLoader();
var chatbotUiconfig = {
cognito: {
poolId:
},
lex: {
initialText: 'How can I help you?',
botName: 'CabBookBot'
},
ui: {
toolbarTitle: 'Cab Booking Lex Bot',
toolbarLogo: ''
},
};
lexWebUiLoader.load(chatbotUiConfig)
.then(function () {
console.log('chatbot UI loaded');
})
.catch(function (error) {
console.error('chatbot UI failed to load', error);
});
</script>
Stap 2: Integreren met messagingplatforms
Je kunt de Lex-bot integreren met messagingservices van derden zoals Facebook Messenger, Slack en Twilio SMS.
In deze sectie bespreken we hoe je Lex integreert met Facebook Messenger. Voor je begint, heb je nodig:
- Een Facebook-ontwikkelaarsaccount
- Een bedrijfspagina op Facebook. Let op: de Facebook-app heeft toestemming nodig om de Messaging API met Lex te gebruiken. Alleen apps die door Facebook zijn beoordeeld en goedgekeurd als geverifieerde zakelijke apps krijgen deze rechten.
Hieronder schets ik de stappen om de Lex-bot te integreren met Facebook Messenger, zodat gebruikers die je Facebook-pagina berichten, reacties van de bot kunnen ontvangen.
- Maak een nieuwe Business-app als je die nog niet hebt.
- Kies onder de app use cases Other.
- Selecteer Business als apptype.
- Je kunt verschillende Facebook-producten aan elke app toevoegen, zoals Messenger, Instagram, enz. Voeg Messenger toe aan de app en kies Set up.
- In de sectie Messenger API Setup:
- Koppel je zakelijke Facebook-pagina aan deze app.
- Genereer een nieuw token (met de knop Generate ) voor deze app. Kopieer dit token in een teksteditor.
- Let op het bericht “To send and receive messages, request pages_messaging permission.” Selecteer Request Permission om de vereiste rechten aan te vragen.
- Als je app nog niet door Facebook is beoordeeld en goedgekeurd, dien deze dan in voor beoordeling.
- Kies vanuit App Settings in de menuopties links voor Basic.
- Selecteer Show onder App Secret en kopieer de geheime code in een tekstbestand.
Ga nu naar de Lex-console en kies de bot die je met Messenger wilt integreren.
- Zoek in de linkermenustructuur Channel integrations onder Deployment.
- Selecteer Add Channel onder Create Channel:
- Kies Facebook onder Platform.
- Kies KMS Key onder Identity policies.
- Onder Integration configuration:
- Geef de integratie een naam
- Kies een alias (van de Lex-bot) die je met Messenger wilt integreren
- Kies de taal.
- Onder Additional configuration:
- Voer onder Alias een tekenreeks in om de app die Lex aanroept te identificeren. Je hebt deze tekenreeks later nodig.
- Voer onder Page access token het toegangstoken in dat je op Facebook hebt gekopieerd.
- Voer onder App secret key de geheime sleutel in die je op Facebook hebt gekopieerd.
- Gebruik de knop Add om het nieuwe kanaal te maken.
- Ga terug naar de pagina Channel Integrations en selecteer het kanaal dat je hebt gemaakt.
- Kopieer de URL onder Endpoint in de sectie Callback URL.
Ga terug naar de Facebook-ontwikkelaarsconsole en open de app die je eerder hebt gemaakt.
- Kies in het linkermenu onder Messenger voor Messenger API Settings.
- Voer onder Callback URL de callback-URL in die je in de Lex-console hebt gekopieerd.
- Voer onder Verify token de alias-tekenreeks in die je in de Lex-console hebt ingevoerd.
- Verify and save de wijzigingen.
- Kies onder Webhooks voor Add subscriptions. Selecteer messages in het pop-upvenster en vervolgens Save.
Je kunt nu de Facebook-pagina berichten met de sample utterances van de Lex-bot en relevante reacties ontvangen.
Stap 3: Lex koppelen met AWS Lambda voor betere interactiviteit
We schreven in de vorige sectie een eenvoudige Lambda-functie voor de fulfillment-sectie. Die gaf alleen een tekstbericht terug: “Lambda has placed your reservation.” In de praktijk stuur je het succesbericht pas na het daadwerkelijk afhandelen van het verzoek.
De Lambda-functie stuurt bijvoorbeeld een verzoek met de reserveringsgegevens van de gebruiker naar de backend-API, die de boeking uitvoert en vervolgens de gebruiker antwoordt op basis van de API-respons.
Zo ga je te werk:
- Het JSON-object
slotsin de Lambda-functie bevat de slotwaarden. Bestudeer de structuur met een code beautifier om de juiste waarden te extraheren. - Het onderstaande codefragment laat zien hoe je de slotwaarde voor
SourceCityophaalt en deze waarde doorgeeft aan een backend-API die de reserveringen afhandelt. Voeg deze code toe binnen de functielambda_handler():
slots = event['sessionState']['intent']['slots']
print("slots - ", slots)
source_city = slots['SourceCity']['value']['interpretedValue']
print("source city - ", source_city)
Ik laat nu zien hoe je API-verzoeken vanuit de Lambda-functie doet. Voor dit voorbeeld gebruiken we het dummy API-endpoint bij ASDFast. Met deze service kun je HTTP(S)-verzoeken naar een API-endpoint sturen en een realistische respons ontvangen.
- Met de onderstaande code sturen we een
GET-verzoek naar dit endpoint. We passen vervolgens het bericht dat de bot naar de gebruiker stuurt aan, afhankelijk van de statuscode van hetGET-verzoek:
res = urllib.request.urlopen(urllib.request.Request(
url='http://asdfast.beobit.net/api/',
headers={'Accept': 'application/json'},
method='GET'),
timeout=5)
message_success = "Lambda has placed your reservation"
message_failure = "Lambda could not place your reservation. Please retry."
message = message_success if res.status == 200 else message_failure
De volledige Lambda-functie staat hieronder:
import json
import urllib.request
def lambda_handler(event, context):
print("event - ", event)
slots = event['sessionState']['intent']['slots']
intent = event['sessionState']['intent']['name']
print("slots - ", slots)
source_city = slots['SourceCity']['value']['interpretedValue']
print("source city - ", source_city)
print("intent - ", intent)
if event['invocationSource'] == 'FulfillmentCodeHook':
print("FulfillmentCodeHook")
res = urllib.request.urlopen(urllib.request.Request(
url='http://asdfast.beobit.net/api/',
headers={'Accept': 'application/json'},
method='GET'),
timeout=5)
message_success = "Lambda has placed your reservation"
message_failure = "Lambda could not place your reservation. Please retry."
message = message_success if res.status == 200 else message_failure
#message = "Lambda has placed your reservation"
response = {
"sessionState": {
"dialogAction": {
"type": "Close"
},
"intent": {
'name':intent,
'slots': slots,
'state':'Fulfilled'
}
},
"messages": [
{
"contentType": "PlainText",
"content": message
}
]
}
return responseBest practices voor het bouwen van Amazon Lex-bots
Na het bespreken van de basisprincipes van Lex-bots en hun praktische toepassingen, presenteer ik in deze sectie enkele best practices voor het ontwerpen van bots.
Ontwerp duidelijke en beknopte gesprekken
Zorg dat je gespreksflows en slots precies zijn:
- Elke intent moet zich richten op één taak, en elk slot moet de waarde vastleggen die bij één variabele hoort.
- Maak de promptteksten niet te omslachtig of langdradig. Houd de dialogen kort en ga snel naar het gewenste resultaat.
Deze aanpak voorkomt verwarring bij de gebruiker en mogelijke misverstanden door Lex.
Benut slottypen en validatie
De bot en de bijbehorende backendservices hebben nauwkeurige informatie over de gebruikersvereisten nodig. Het gebruik van de juiste slottypen zorgt hiervoor.
- In het algemeen raad ik aan de ingebouwde slots te gebruiken voor veelvoorkomende datatypen, zoals
AMAZON.Datevoor datums,AMAZON.Cityvoor steden, enzovoort. Deze slottypen zijn uitgebreid getest en staan bekend als compatibel met verschillende toepassingen. - Je kunt in uitzonderlijke gevallen aangepaste slottypen ontwerpen. Zorg ervoor dat ze correct geconfigureerd en getest zijn.
- Valideer naast het gebruik van de juiste slottypen ook dat de gebruiker de informatie heeft gegeven die hoort bij alle verplichte slots. Zo kan de backend-API het verzoek van de gebruiker afhandelen en is de gebruikerservaring soepel.
Schakel multi-turn conversaties in
Gebruikers kunnen het overweldigend vinden om alle benodigde informatie in één bericht in te voeren, zoals “Book a trip for N people on Z date/time from X to Y in cab type T.”
- Gebruik multi-turn conversaties voor een betere gebruikerservaring. Net als veel moderne tools op basis van language models kan Lex context behouden gedurende een multi-turn gesprek. Hierdoor kan hij eerdere prompts en reacties relateren aan recente interacties.
- Het opdelen van een complexe prompt in een reeks korte vragen verbetert de gespreksflow.
Monitor en optimaliseer performance
Voor een bot in productie is het cruciaal om de performance te monitoren aan de hand van verschillende metrics zoals:
- Totaal aantal conversaties.
- Gemiddelde conversatieduur.
- Gemiddeld aantal turns per conversatie.
- Aantal (en verhouding) gedetecteerde en gemiste uitingen.
- Lambda-fouten, enzovoort.
Gebruik deze metrics om de gebruikersinteracties en de performance van de bot te beoordelen:
- Selecteer in het linkermenu op de pagina Bot de optie Analytics.
- Open het Conversation dashboard, het Performance dashboard en de CloudWatch metrics om de performance van de bot te bestuderen.
AWS CloudWatch is een monitoringtool voor AWS-services. Het bundelt uiteenlopende performancemetrics realtime op één pagina. Gebruik deze metrics om de performance van de bot te verbeteren en te verfijnen.
Conclusie
In dit artikel verkenden we Amazon Lex V2, de contextbewuste chatbotservice van AWS. We doorliepen het proces van het bouwen van een basisbot, het configureren voor interactie met gebruikers en de integratie met een backend-API met behulp van AWS Lambda. Daarnaast bespraken we best practices en deploymentopties, waaronder het inbedden van de bot op een website of een Facebook-pagina.
Als je verder wilt leren over AWS-services, overweeg dan om je kennis uit te breiden met deze cursussen:
- Krijg een solide basis in AWS-cloudservices met de cursus AWS Cloud Technology and Services.
- Leer hoe je AWS-beveiliging en -kosten effectief beheert in de cursus AWS Security and Cost Management.
- Ontdek programmatische AWS-interacties met Boto3, de AWS SDK voor Python, in de cursus Introduction to AWS Boto in Python.
Met deze resources ben je goed uitgerust om AWS-gebaseerde applicaties te bouwen, te beveiligen en te optimaliseren, inclusief chatbots die worden aangedreven door Amazon Lex!
FAQs
Integreert Lex met andere AWS-services?
Ja, Lex integreert met services zoals Lambda, S3, CloudWatch en meer. Zo kun je de functionaliteit van de bot uitbreiden, hem integreren met andere producten en de performance monitoren.
Verwerkt Lex zowel spraak als tekst?
Ja, Lex kan standaard zowel spraak- als tekstinvoer verwerken. Lex ondersteunt verschillende stemmen voor gesproken interacties. Je kunt ook AWS Polly gebruiken om spraak te synthetiseren en het audiobestand naar Lex te sturen.
Kan ik een aangepaste gebruikersinterface gebruiken voor een Lex-bot?
Ja, Lex wordt geleverd met een runtime-API die de gebruikersinvoer naar de bot kan sturen en de reacties (van de bot) kan ontvangen. Zo fungeert de Lex-bot als backend voor de custom UI.
Kan ik Lex gebruiken zonder Lambda-functies?
In principe wel. Je kunt het gesprek volledig binnen Lex ontwerpen. In de praktijk moet een bot echter interfacen met andere backend-API-services die het verzoek van de gebruiker afhandelen (zoals het boeken van een ticket). Je hebt AWS Lambda nodig om met externe services te interfacen.
Is het mogelijk om AWS Lex te trainen?
Tot op zekere hoogte wel. De NLU-engine van Lex kan gebruikersinvoer herkennen die lijkt op de sample utterances. Hij kan ook geldige waarden van een slottype uitbreiden op basis van enkele voorbeelden. Verwacht echter niet hetzelfde niveau van trainbaarheid als bij een LLM. Lex is ontworpen voor beperkte, taakgerichte interacties en niet voor langdurige gesprekken.

