@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Chatbots & PHP
A Get Started Guide
Slide 2
Slide 2 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Hi, who is this?
Slide 3
Slide 3 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Hi, my name is Katy
● Developer, knitter, vegetable grower
● Works at Deeson & GreenShoot Labs
● @maccath on Twitter
● Not a bot
Slide 4
Slide 4 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
So, Chatbots…?
They’re a hot topic!
Slide 5
Slide 5 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Chatbot Popularity
● 4/6 most popular social platforms are messengers
● 30% increase in users globally in 1 year
● More messages are sent than emails
● Since allowing bots on FB Messenger in 2016,
business to user messaging has doubled
Slide 6
Slide 6 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
But why?
Well...
Slide 7
Slide 7 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Good for Consumers
● Avoids ‘app fatigue’.
● Can get straight to the point.
● Intuitive interface based on natural human
communication.
Slide 8
Slide 8 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Good for Businesses
● No need for physical availability.
● Can deal with multiple queries simultaneously.
● Maintain a presence within the most popular
applications.
Slide 9
Slide 9 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Good for Developers
● No more ‘apps’!
● Learn about and use Artificial Intelligence.
● ChatOps, Productivity, Laziness.
● Skynet.
Slide 10
Slide 10 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Chatbots are old news...
Quite!
Slide 11
Slide 11 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
The First ‘Chatterbots’
● ELIZA - developed in the 1960s
● ALICE - developed in the 1990s
● Smarterchild - developed in the 2000s
Slide 12
Slide 12 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Chatbots With Purpose
● ChatOps - Hubot (CoffeeScript), Lita (Ruby), Errbot
(Python)
● Personal assistants - Siri (Apple), Cortana
(Microsoft), Alexa (Amazon), Assistant (Google)
Slide 13
Slide 13 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
How do bots even work?
Allow me to show you...
Slide 14
Slide 14 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Messenger Window
Messaging
Application
Messaging Platform
Bot Logic
Platform drivers
Bot Application
Middleware
Messenger Window
Messaging
Application
Messaging Platform
Users
Domain Logic
Third Party APIs
Other Applications
AI/NLP APIs
Slide 15
Slide 15 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Push Communication
1. An event occurs on messenger platform
2. HTTP request containing details is composed by messenger app
3. HTTP request delivered to your bot application via a webhook
4. Bot application reacts and composes appropriate HTTP response
5. Response delivered to the messenger platform via a webhook
Slide 16
Slide 16 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Real-time Communication
1. Bot application requests websocket connection to messenger platform
2. Messenger platform accepts request for websocket connection
1. An event occurs on messenger platform
2. HTTP request immediately received by bot application via websocket
3. Bot application reacts and composes appropriate HTTP response
4. Response delivered to the messenger platform via websocket
Slide 17
Slide 17 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Ok, how do we build one?
Using BotMan!
Slide 18
Slide 18 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
What is BotMan?
● Framework for chatbot development
● Like BotKit… but for PHP!
● Open source
● Framework agnostic
● Clean code, easy to extend
Slide 19
Slide 19 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Slide 20
Slide 20 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Creating a New Bot
→ composer create-project --prefer-dist botman/studio food-bot
$ ~/
Slide 21
Slide 21 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Let’s run it!
→ php artisan botman:tinker
$ ~/food-bot/
Slide 22
Slide 22 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
How does it hear me?
Like this:
Slide 23
Slide 23 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Hearing messages
$botman->hears('Hi', function ($bot) {
$bot->reply('Hello!');
});
routes/botman.php
Slide 24
Slide 24 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
What about parameters?
$botman->hears("Hi, I’m {name}", function ($bot, $name) {
$bot->reply("Hello, $name!");
});
routes/botman.php
Slide 25
Slide 25 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
What about patterns?
$botman->hears(
'I want ([0-9]+) {item}!',
function ($bot, $num, $item) {
$bot->reply("Alright, $num $item it is!");
}
);
routes/botman.php
Slide 26
Slide 26 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Can it hold a conversation?
Of course…!
Slide 27
Slide 27 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
A wild request appears!
$botman->hears(
'I want to book a table!',
function ($bot) {
$bot->startConversation(new TableBookingConvo());
}
);
routes/botman.php
Slide 28
Slide 28 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Let’s talk about this.
class TableBookingConvo extends Conversation
{
public function run()
{
// This will be called immediately
$this->askWhen();
}
}
app/Conversations/TableBookingConvo.php
Slide 29
Slide 29 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Ok, so when?
public function askWhen()
{
$this->ask('For when?', function (Answer $answer) {
$this->date = new DateTime($answer->getText());
$this->say(
'Ok; ' . $this->date->format('l jS F Y \a\t g.ia')
);
$this->askHowMany();
});
}
app/Conversations/TableBookingConvo.php
Slide 30
Slide 30 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
And for how many people?
public function askHowMany()
{
$this->ask('How many people?', function (Answer $answer) {
$this->num = (int) $answer->getText();
$this->say($this->num . '? Cool!');
$this->book();
});
}
app/Conversations/TableBookingConvo.php
Slide 31
Slide 31 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Alright, let’s book it!
public function book()
{
// Implementation of booking process goes here
$this->say(sprintf(
'Alright, that’s booked for %d people on %s.',
$this->num,
$this->date->format('l jS F Y \a\t g.ia')
));
}
app/Conversations/TableBookingConvo.php
Slide 32
Slide 32 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
How can others use it?
Through different platforms.
Slide 33
Slide 33 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Are there any special
features?
Yeah, loads!
Slide 41
Slide 41 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Interactive messages
Need specific answers?
Multiple choice?
Use interactive messages to
guide your users!
Slide 42
Slide 42 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Composing questions
app/Conversations/TableBookingConvo.php
$whatTime = Question::create('What time would you like to book?')
->fallback('Unable to ask question')
->callbackId('booking_time')
->addButtons([
Button::create('6pm')->value('18:00'),
Button::create('7pm')->value('19:00'),
Button::create('8pm')->value('20:00'),
]);
Slide 43
Slide 43 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Handling the response
app/Conversations/TableBookingConvo.php
$this->ask($whatTime, function (Answer $answer) {
if ($answer->isInteractiveMessageReply()) {
$this->time = $answer->getValue();
$this->say('Cool, ' . $this->time);
} else {
// Handle a typed message reply
}
});
Slide 44
Slide 44 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Attachments
A picture says a thousand
words, so send attachments!:
● Images
● Audio
● Locations
● Web links
Slide 45
Slide 45 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Sending pictures
app/routes/botman.php
$botman->hears("I'm hungry", function ($bot) {
$message = Message::create('Have some food!')
// attach an image
->image('http://lorempixel.com/400/200/food/');
$bot->reply($message);
});
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Menus
Like buttons in Facebook, but
more options - you can even
use channels and users as
options!
Slide 52
Slide 52 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Creating menus
app/routes/botman.php
$botman->hears("Can I reserve a table?", function ($bot) {
$bot->reply(Menu::create("What time?")
->name("available_times")
->options([
['text' => '5pm', 'value' => '1700'],
['text' => '6pm', 'value' => '1800'],
]) //...
Slide 53
Slide 53 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Not very intelligent though.
Ok, we’ll investigate AI.
Slide 54
Slide 54 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Natural Language Processing
● Intent - yes, no, ok, hello, goodbye
● Tone - happy, sad, angry
● Entities - how, when, where
● Domain - bookings, information, idle chat
Slide 55
Slide 55 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Machine Learning
● Mis-spellings - “Do you like spagetty?”
● Entities - “Can I travel by sea?”
● Synonyms - “I hate eggplant.”
● Slang - “Amazing, that’s sick!”
Slide 56
Slide 56 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
How would we implement
all that?!
Let’s not reinvent the wheel!
Slide 57
Slide 57 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Slide 58
Slide 58 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Slide 59
Slide 59 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Slide 60
Slide 60 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Slide 61
Slide 61 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Using the API.AI Middleware
$apiAi = ApiAi::create('your-api-ai-token')->listenForAction();
$botman->middleware->received($apiAi);
// Hears an action, not a phrase!
$botman->hears("book_table", function ($bot) {
//...
})->middleware($apiAi);
routes/botman.php
Slide 62
Slide 62 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Slide 63
Slide 63 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Identifying entities
public function run()
{
// Before we move on, let’s figure out what we know...
$this->determineEntities();
$this->askWhen();
}
app/Conversations/TableBookingConvo.php
Slide 64
Slide 64 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Identifying entities
private function determineEntities()
{
$message = $this->bot->getMessage();
$entities = $message->getExtras('apiParameters');
if (!empty($entities['date-time'])) {
$this->date = new \DateTime($entities['date-time']);
}
if (!empty($entities['number-integer'])) {
$this->num = (int) $entities['number-integer'];
}
}
app/Conversations/TableBookingConvo.php
Slide 65
Slide 65 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Identifying entities
private function askWhen()
{
// Skip to next question, we already know the answer!
if ($this->date) {
$this->askHowMany();
return;
}
// Continue asking as normal...
}
app/Conversations/TableBookingConvo.php
Slide 66
Slide 66 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Identifying entities
private function askHowMany()
{
// Skip to booking, we already know the answer!
if ($this->num) {
$this->book();
return;
}
// Continue asking as normal...
}
app/Conversations/TableBookingConvo.php
Slide 67
Slide 67 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
Slide 68
Slide 68 text
@maccath | Katy Ereira
Chatbots and PHP | #phpnw17
How can I learn more?
Here are some resources: