SlideShare a Scribd company logo
1 of 80
Download to read offline
Serverless Solution
- Kitti Tuyman –
2018-11-11
หัวข้อ
1.Serverless solution
2.เทคนิคต่าง ๆ ในการทําแชทบอท
 การทําแชทบอทหาโรงพยาบาลที่ใกล้ที่สุด บอกระยะทาง แผนที่ ค่ารถ taxi พร้อม
สมการการคํานวณหาระยะทางจากค่าละจิจูด ลองจิจูด พร้อมสูตรคํานวณค่า taxi
 การทําแชทบอททายภาพ ว่าสถานที่นี้คืออะไร พร้อมบอก location ,ทายภาพ
บุคคลดัง , แกะข้อความบนภาพมาตอบ
 เทคนิคการแกะ message json ของ dialogflow
 การทําแชทบอทแปลภาษา สามารถ detect ว่าพิมพ์ภาษาอะไรแล้วแปลตรงข้าม
 การทํา webhook line beacon แบบง่าย ๆ
ปัญหาที่มักจะพบเมื่อเริ่มทํา chatbot
ปัญหาสําหรับคนเริ่มต้น –>เขียนโปรแกรมไม่เป็น /ไม่มี server
เขียนโปรแกรมไม่เป็นและไม่มี server
“มีเครื่องมือสร้างแชทบอทหลาย
แพลตฟอร์มมาก ที่สามารถใช้งานได้ฟรี
แต่วันนี้ที่จะแนะนํามีอยู่ 2 ตัว คือ
Dialogflow และ Abdul”
Dialogflow (by google)
ข้อดี
O ทําครั้งเดียว สามารถใช้ได้หลายแพลตฟอร์ม Line ,messenger
,webchat และ google assistant(พูดคุยด้วยเสียง)
O สามารถทํา Pattern การพูดได้ เช่น ถามไปแล้วรอคําตอบให้ได้ครบก่อน
ค่อยประมวลผล เช่น ถามชื่อ รอตอบเมื่อตอบแล้ว ถามนามสกุล
O Hybrid (Rule-based and ML)
O เร็ว ฟรี ไม่ต้องมี server เป็นของตัวเองก็ทําแชทบอทได้
O ฯลฯ
Dialogflow
ข้อจํากัด
O การเก็บ log ค่อนข้างยาก
O การใช้งาน external api ที่ไม่ใช่ของ google มีค่าใช้จ่าย
O การเขียน webhook ค่อนข้างยาก สําหรับคนเริ่มต้น
Abdul ( by Nectec)
ข้อดี
O ภาษาไทย ใช้งานง่าย เร็ว ฟรี มีฟังก์ชั่นค่อนข้างครบถ้วน
O Function 1-1
O Log , Push message , Multicast
O รองรับ JSON,RSS,PHP,IMAGE
O รองรับ Line Beacon
O สามารถดึง variable บางตัวมาใช้งานได้
O ฯลฯ
Abdul
ข้อจํากัด
O ยังไม่สามารถทํา Pattern การพูดคุยแบบตรงๆ เหมือน
Dialogflow ได้
O ยังไม่สามารถรองรับการทําหลายแพลตฟอร์มเท่ากับ Dialogflow
“ ในเมื่อมีข้อดีไม่เหมือนกัน จับมารวมกัน
เลยได้ไหม จะได้ข้อดีหลายๆอย่าง คําตอบ
คือ ได้ จึงเป็นที่มาของ
Serverless Solution ”
Dialogflow + Abdul
สิ่งที่จะได้
O Log ( line user id, message )
O Function 1-1 ,Push , multicast
O แชทบอทหลายแพลตฟอร์ม
O รองรับการเขียนโปรแกรมเพิ่มเติมในอนาคต ผ่าน Abdul
O ความสะดวก สามารถเพิ่มข้อมูลที่ dialogflow หรือ abdul ก็ได้
แบ่งงานกันทําได้
O ฯลฯ
วิธีการเชื่อมระหว่าง Dialogflow+ abdul
O เข้าไปที่ https://developers.line.me/
วิธีการเชื่อมระหว่าง Dialogflow+ abdul
วิธีการเชื่อมระหว่าง Dialogflow+ abdul
เข้าไปที่ https://abdul.in.th/abdul
Create bot
Line token
วิธีการเชื่อมระหว่าง Dialogflow+ abdul
วิธีการเชื่อมระหว่าง Dialogflow+ abdul
เข้าไปที่ https://dialogflow.com
วิธีการเชื่อมระหว่าง Dialogflow+ abdul
วิธีการเชื่อมระหว่าง Dialogflow+ abdul
วิธีการเชื่อมระหว่าง Dialogflow+ abdul
วิธีการเชื่อมระหว่าง Dialogflow+ abdul
วิธีการเชื่อมระหว่าง Dialogflow+ abdul
วิธีการเชื่อมระหว่าง Dialogflow+ abdul
วิธีการเชื่อมระหว่าง Dialogflow+ abdul
วิธีการเชื่อมระหว่าง Dialogflow+ abdul
วิธีการเชื่อมระหว่าง Dialogflow+ abdul
วิธีการเชื่อมระหว่าง Dialogflow+ abdul
วิธีการเชื่อมระหว่าง Dialogflow+ abdul
วิธีการเชื่อมระหว่าง Dialogflow+ abdul
วิธีการเชื่อมระหว่าง Dialogflow+ abdul
วิธีการเชื่อมระหว่าง Dialogflow+ abdul
วิธีการเชื่อมระหว่าง Dialogflow+ abdul
วิธีการเชื่อมระหว่าง Dialogflow+ abdul
วิธีการเชื่อมระหว่าง Dialogflow+ abdul
บทความต่างๆ
เทคนิคต่างๆ
จากเทคนิคข้างบน เราสามารถนํามาใช้ได้หลายแบบ
Dialogflow + Abdul
Dialogflow + webhook + Abdul
Dialogflow + webhook
Line message api + Abdul
การรับส่งข้อมูลจาก dialogflow
ผ่าน webhook
เป็นข้อมูลแบบ JSON
การแกะ Package Json
<?php
header('Content-Type: application/json');
$json = file_get_contents('php://input');
$request = json_decode($json, true);
$myfile = fopen("log_json.txt", "w") or die("Unable to
open file!");
fwrite($myfile, $json);
fclose($myfile);
?>
$queryText = $request["queryResult"]["queryText"];
//message ที่ user พิมพ์มา
$action = $request["queryResult"]["action"]; //intent
$userId =
$request['originalDetectIntentRequest']['payload']['d
ata']['source']['userId']; // line user id
แชทบอท SOS หาโรงพยาบาลที่ใกล้ที่สุด
• รายชื่อรพ.ใกล้ที่สุด
5 อันดับ
• ที่อยู่ ระยะห่าง แผน
ที่ เบอร์โทร ค่ารถ
taxi
Line message
api + Abdul
แชทบอท Map หาสถานที่ทั่วไป
- แสดงแผนที่
- แสดงค่า taxi(ใน กทม.)
- แสดงระยะทาง
- แสดงข้อมูลสถานที่(ถ้ามี)
Abdul + API +wiki
แชทบอท SOS หาโรงพยาบาลที่ใกล้ที่สุด
ขั้นตอนการพัฒนาแชทบอท
O สร้างฐานข้อมูลโรงพยาบาลที่ประกอบไปด้วย ชื่อ ที่อยู่ เบอร์โทรศัทพ์ พิกัด
(ละติจูด ลองจิจูด)
O สร้าง function คํานวณค่า taxi
O สร้างแชทบอทที่เมื่อรับ event location แล้วนําพิกัดที่ได้มาคํานวณ
เปรียบเทียบกับฐานข้อมูลโรงพยาบาล โดยใช้สมการคํานวณ แล้วจึงนํารายชื่อ
โรงพยาบาลที่ใกล้ที่สุด 5 อันดับมาแสดง พร้อมคํานวณค่า taxi มาด้วย(แสดง
เฉพาะกรุงเทพและปริมณฑล)
สมการคํานวณระยะทาง กฏของ Spherical law of cosines:
R = earth’s radius (mean radius = 6,371km)
Δlat = lat2− lat1
Δlong = long2− long1
a = sin²(Δlat/2) +
cos(lat1).cos(lat2).sin²(Δlong/2)
c = 2.atan2(√a, √(1−a))
d = R.c
Lat1, Lon1 คือค่า latitude และ longtitud ของจุดแรก
Lat2, Lon2 คือค่า latitude และ longtitud ของจุดที่สอง
และ d คือระยะทางที่ได้มีหน่วยเป็นกิโลเมตร
SELECT id, (
6371 *
ACOS(COS(RADIANS($locationLatitude)) *
COS(RADIANS(lat)) *
COS(RADIANS(lng) -
RADIANS($locationLongitude)) +
SIN(RADIANS($locationLatitude)) *
SIN(RADIANS(lat )))
) AS distance ,
name,phone,lat,lng,name_e
FROM hospital
ORDER BY distance LIMIT 0, 5
สูตรคํานวณค่า taxi
$Minute = 10 ;
if($distance<= 1){
$Price = 35;
}else if($distance<=10){
$Price = 35 + ($distance-1)*5.5;
}else if($distance<=20){
$Price = 84.5 + ($distance-10)*6.5;
}else if($distance<=40){
$Price = 149.5 + ($distance-20)*7.5;
}else if($distance<=60){
$Price = 299.5 + ($distance-40)*8;
}else if($distance<=80){
$Price = 459.5 + ($distance-60)*9;
}else{
$Price = 639.5 + ($distance-80)*10.5;
}
$Charge = $Minute*2;
$Price1 = $Price + ceil(($Minute*2));
$taxi = " ค่าแท็กซี่ประมาณ ".ceil($Price)."-".ceil($Price1)." บาท";
Chatbot ทายภาพ
Chatbot ทายภาพ
หลักการทํางาน
เราจะใช้ Google cloud vision โดยจะส่ง URL ของภาพที่
ผู้ใช้งานส่งเข้ามาในแชทบอทของเรา เข้าไปใน Google cloud
vision แล้วเราจะได้ข้อมูลตอบกลับมาเป็น JSON เราก็แกะข้อมูล
JSON ส่งกลับมาให้ user โดย Google cloud vision
สามารถทายภาพสถานที่ว่าเป็นที่ไหน พร้อม Location ทายภาพ
บุคคล ถอด text ป้ายทะเบียนรถ หรือตัวหนังสือออกมาได้ โดยเรา
สามารถนํา text ที่ถอดได้มาใช้ google translate แปลง
กลับมาเป็นภาษาไทยได้
$strUrl = "https://vision.googleapis.com/v1/images:annotate?key=cloudvision_key";
$arrHeader = array();
$arrHeader[] = "Content-Type: application/json";
$objImgData = file_get_contents("https://example.com/image.jpg"); // image ที่จะส่ง
$objImgBase64 = base64_encode($objImgData);
$arrPostData = array();
$arrPostData['requests'][0]['image']['content'] = $objImgBase64;
$arrPostData['requests'][0]['features'][0]['type'] = "LABEL_DETECTION";
$arrPostData['requests'][0]['features'][0]['maxResults'] = "5";
$arrPostData['requests'][0]['features'][1]['type'] = "FACE_DETECTION";
$arrPostData['requests'][0]['features'][1]['maxResults'] = "5";
$arrPostData['requests'][0]['features'][2]['type'] = "TEXT_DETECTION";
$arrPostData['requests'][0]['features'][2]['maxResults'] = "5";
$arrPostData['requests'][0]['features'][3]['type'] = "LANDMARK_DETECTION";
$arrPostData['requests'][0]['features'][3]['maxResults'] = "5";
$arrPostData['requests'][0]['features'][4]['type'] = "LOGO_DETECTION";
$arrPostData['requests'][0]['features'][4]['maxResults'] = "5";
$arrPostData['requests'][0]['features'][5]['type'] = "IMAGE_PROPERTIES";
$arrPostData['requests'][0]['features'][5]['maxResults'] = "5";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$strUrl);
curl_setopt($ch, CURLOPT_HTTPHEADER, $arrHeader);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($arrPostData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
curl_close ($ch);
$request = json_decode($result, true);
$place = $request['responses'][0]['landmarkAnnotations'][0]['description'];
print $result;
"responses": [
{
"landmarkAnnotations": [
{
"mid": "/m/024tvh",
"description": "Wat Yai Chai Mongkhon",
"score": 0.69403875,
,
"locations": [
{
"latLng": {
"latitude": 14.397438,
"longitude": 100.524902
}
],
"logoAnnotations": [
{
"description": "President
Kennedy",
words": [
{
"property": {
"detectedLanguages": [
{
"languageCode": "ja“
],
"text": "風林火山n"
}
แชทบอทแปลภาษา
พิมพ์ภาษาไหนมาก็จะรู้ เช่น พิมพ์ภาษาไทยมาว่า ฉันกําลังเดิน แชบอท
ก็จะแปลเป็นภาษาอังกฤษ ว่า I’m walking หรือพิมพ์ภาษาอังกฤษ
มาว่า I’m walking แชทบอทก็จะแปลเป็นภาษาไทยว่า ฉันกําลังเดิน
หลักการ ก็คือ ตรวจจับคําที่พิมพ์ ว่ามีอักษรภาษาใดอยู่ เช่น มีตัวอักษร
ภาษาไทย ก-ฮ หรือมีสระ วรรณยุกต์ ก็แสดงว่าเป็นภาษาไทย หรือมี
A-Z แสดงว่าเป็นภาษาอังกฤษ จากนั้นก็ใช้ library ของ
google translate ช่วยแปลให้
แชทบอทแปลภาษา
require_once "GoogleTranslate.php";
$word = $_REQUEST['word'];
$GT = NEW GoogleTranslate();
$word1 =preg_replace('/[[:space:]]+/', '', trim($word));
if(preg_match('/^[a-z]+$/i',$word1)){
$response = $GT->translate('en','th',$word1);
echo $response;
}else if(preg_replace("/[^ก-๙]+$/i",'',$word1)){
$response = $GT->translate('th','en',$word1);
echo $response;
}else {
$response = $GT->translate('ja','th',$word1);
echo $response;
}
Webhook Line Beacon
<?php
header('Content-Type: application/json');
$json = file_get_contents('php://input');
$request = json_decode($json, true);
$userId = $request['events'][0]['source']['userId'];
$Type = $request['events'][0]['beacon']['type'];
// type ของ beacon มี 2 type คือ enter และ leave
Webhook Line Beacon
if ($Type = 'enter') {
// เมื่อพบ user จะให้ทําอะไร
// push message
}else{
// เมื่อ use ออกจากพื้นที่ จะให้ทําอะไร
// push message
}
ตัวอย่าง LINE CHATBOT
BMI(BODY MASS INDEX)
หรือดัชนีมวลกาย
พัฒนาจาก Dialogflow + webhook php
Dialog flow BMI
Dialog flow BMI
INTENT BMI
Dialog flow BMI
INTENT BMI-CUSTOM
Dialog flow BMI
Dialogflow BMI
INTENT BMI-CUSTOM-YES
Dialog flow BMI
Dialogflow BMI
Fulfillment webhook
Json
Dialogflow
Json
Dialogflow
Dialogflow BMI
Webhook
Json Dialogflow Webhook
$json = file_get_contents('php://input');
$request = json_decode($json, true);
$queryText = $request["queryResult"]["queryText"];
$action = $request["queryResult"]["action"];
$userId =
$request['originalDetectIntentRequest']['payload']['data']['source']['userId'];
switch ($action) {
case "BMI.BMI-custom.BMI-custom-yes":
$h = $request["queryResult"]["parameters"]["height"];
$w = $request["queryResult"]["parameters"]["weight"];
$height=$h/100;
$bmi= round($w/($height*$height),2);
Json Dialogflow Webhook
if($bmi<=18.50){
$bmi= "ดัชนีมวลกายของคุณ คือ ".$bmi." คุณอยู่ในเกณฑ์ นํ้าหนักน้อย / ผอม โดยค่ามาตราฐานอยู่ที่ 18.5-22.9
ควรรับประทานอาหารให้มากขึ้น ทานให้ครบ 5 หมู่ และหมั่นออกกําลังกาย";
}else if($bmi>18.50 && $bmi<22.90){
$bmi= "ดัชนีมวลกายของคุณคือ ".$bmi." คุณอยู่ในเกณฑ์ปกติ (สุขภาพดี) โดยค่ามาตราฐานอยู่ที่ 18.5-22.9 ดีใจ
ด้วยครับสุขภาพคุณดีมากเลยครับ ";
}else if($bmi>23 && $bmi<24.90){
$bmi ="ดัชนีมวลกายของคุณคือ ".$bmi." คุณอยู่ในเกณฑ์ท้วม / โรคอ้วนระดับ 1 โดยค่ามาตรฐานอยู่ที่ 18.5-22.9 คุณ
ควรออกกําลังกายให้สมํ่าเสมอนะครับ เลือกทานอาหารที่มีไขมันน้อยๆ ";
}else if($bmi>25 && $bmi<29.90){
$bmi="ดัชนีมวลกายของคุณคือ ".$bmi." คุณอยู่ในเกณฑ์อ้วน / โรคอ้วนระดับ 2 โดยค่ามาตรฐานอยู่ที่ 18.5-22.9
คําแนะนํา 1. ควรควบคุมอาหารโดยลดปริมาณอาหาร 2.เคลื่อนไหวและออกกําลังกายอย่างสมํ่าเสมอ 3.ปรึกษาแพทย์ ";
}else if($bmi>30){
$bmi="ดัชนีมวลกายของคุณคือ ".$bmi." คุณอยู่ในเกณฑ์อ้วนมาก / โรคอ้วนระดับ 3 โดยค่ามาตรฐานอยู่ที่ 18.5-22.9
คุณควรพบแพทย์เพื่อขอคําปรึกษาเรื่องสุขภาพด่วนนะครับ ช่วงนี้ควรจํากัดอาหาร และออกกําลังกายให้มากๆ นะครับ";
}
Json Dialogflow Webhook
$curl = curl_init();
curl_setopt_array($curl, array( CURLOPT_URL =>
"https://api.line.me/v2/bot/message/push", CURLOPT_SSL_VERIFYPEER =>
false, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS =>
"{rnrn "to": "$userId",rnrn "messages": [{rnrn "type":
"text",rnrn "text": "$bmi "rnrn }]rnrn}",
CURLOPT_HTTPHEADER => array( "authorization: Bearer line_token=",
"cache-control: no-cache",
"content-type: application/json",
"postman-token: 7f766920-b207-53c4-6059-6d20ceec77ea" ),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
หน้าจอ line chatbot BMI
Dialogflow + webhook
- จบแล้วครับ ขอบคุณครับ-

More Related Content

Similar to Serverless solution

สร้าง Style ด้วย css 3
สร้าง Style ด้วย css 3สร้าง Style ด้วย css 3
สร้าง Style ด้วย css 3Samart Phetdee
 
แนะนำ HTML5 แบบอ่านจบต้องรู้บ้างแหละ
แนะนำ HTML5 แบบอ่านจบต้องรู้บ้างแหละแนะนำ HTML5 แบบอ่านจบต้องรู้บ้างแหละ
แนะนำ HTML5 แบบอ่านจบต้องรู้บ้างแหละWithoon Wangsa-Nguankit
 
การพัฒนาเอกสารออนไลน์ขั้นสูง Lect 05
การพัฒนาเอกสารออนไลน์ขั้นสูง Lect 05การพัฒนาเอกสารออนไลน์ขั้นสูง Lect 05
การพัฒนาเอกสารออนไลน์ขั้นสูง Lect 05Jenchoke Tachagomain
 
บทที่6 คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
บทที่6 คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้นบทที่6 คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
บทที่6 คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้นPat Sirikan Bungkaew
 
คลาสและโปรแกรม
คลาสและโปรแกรมคลาสและโปรแกรม
คลาสและโปรแกรมN'Name Phuthiphong
 

Similar to Serverless solution (10)

สร้าง Style ด้วย css 3
สร้าง Style ด้วย css 3สร้าง Style ด้วย css 3
สร้าง Style ด้วย css 3
 
แนะนำ HTML5 แบบอ่านจบต้องรู้บ้างแหละ
แนะนำ HTML5 แบบอ่านจบต้องรู้บ้างแหละแนะนำ HTML5 แบบอ่านจบต้องรู้บ้างแหละ
แนะนำ HTML5 แบบอ่านจบต้องรู้บ้างแหละ
 
การพัฒนาเอกสารออนไลน์ขั้นสูง Lect 05
การพัฒนาเอกสารออนไลน์ขั้นสูง Lect 05การพัฒนาเอกสารออนไลน์ขั้นสูง Lect 05
การพัฒนาเอกสารออนไลน์ขั้นสูง Lect 05
 
บทที่6 คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
บทที่6 คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้นบทที่6 คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
บทที่6 คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
 
20110303 joomla-appserv-server2go
20110303 joomla-appserv-server2go20110303 joomla-appserv-server2go
20110303 joomla-appserv-server2go
 
คลาสและโปรแกรม
คลาสและโปรแกรมคลาสและโปรแกรม
คลาสและโปรแกรม
 
Dw ch05 basic_php
Dw ch05 basic_phpDw ch05 basic_php
Dw ch05 basic_php
 
Pbl2
Pbl2Pbl2
Pbl2
 
Python Programming for Lecturer_RUS_Nonthaburi 17may2019
Python Programming for Lecturer_RUS_Nonthaburi 17may2019Python Programming for Lecturer_RUS_Nonthaburi 17may2019
Python Programming for Lecturer_RUS_Nonthaburi 17may2019
 
Web Development
Web DevelopmentWeb Development
Web Development
 

Serverless solution