Blog AWS Indonesia

Membuat Chatbot SMS dengan Amazon Pinpoint dan Lex

Salah satu keuntungan utama menggunakan Amazon Pinpoint untuk alur kerja interaksi dengan pelanggan adalah kemampuan integrasinya dengan layanan-layanan AWS lainnya. Integrasi ini memungkinkan kita melakukan interaksi percakapan yang lebih dalam dengan pelanggan, dibandingkan hanya mengirim pesan searah dengan pesan yang bersifat umum.

Dalam tutorial ini, kita akan melihat proses membuat chatbot berbasis SMS dengan Amazon Lex. Chatbot ini akan membantu pelanggan kita menjadwalkan appointment. Kita akan menggunakan Amazon Pinpoint untuk mengirimkan respon chatbot melalui kanal SMS, dan kita akan menggunakan AWS Lambda untuk menghubungkan kedua layanan tersebut. Gambar berikut menunjukan arsitektur yang akan kita buat dalam tutorial ini.

Langkah-langkah dalam post ini bertujuan memberikan panduan secara umum, bukan prosedur spesifik. Kalau anda sudah pernah menggunakan layanan AWS lainnya maka sebagian besar konsep disini tidak akan terasa asing. Bila belum pernah, tidak perlu kuatir – kami memberikan link dokumentasi yang dibutuhkan untuk memudahkan anda.

Langkah 1: Buat projek di Amazon Pinpoint

Untuk membuat projek SMS baru

  1. Sign in ke konsol Amazon Pinpoint di https://console.awas.amazon.com/pinpoint.
  2. Buat projek Pinpoint baru dan enable kanal SMS untuk projek. Untuk informasi lebih lanjut, lihat https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-sms-setup.html.
  3. Minta long code (nomor telepon khusus) untuk negaramu. Untuk informasi lebih lanjut, lihat https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-voice-manage.html#channels-voice-manage-request-phone-numbers.
  4. Aktifkan fitur SMS dua arah untuk long code yang baru anda beli. Dibawah Incomming message destination pilih Create a new SNS topic, dan beri nama LexPinpointIntegrationDemo Untuk informasi tentang setup SMS dua arah lihat https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-sms-two-way.html.

Langkah 2: Membuat chatbot dengan Lex

Sekarang tiba waktunya membuat bot anda. Untuk kebutuhan dalam contoh ini, kita akan menggunakan bot yang sudah dikonfigurasi sebelunya untuk melayani permintaan appointment. Sesudahnya anda dapat melakukan kustomisasi pada bot ini sesuai kebutuhan anda dengan menambahkan tujuan lain.

Proses pembuatan bot

  1. Sign in ke konsol Lex di https://console.aws.amazon.com/lex.
  2. Buat bot baru. Pada halaman Create your bot, pilih contoh ScheduleAppointment. Gunakan role IAM default. Untuk COPPA pilih No. Perhatikan bahwa nama yang anda berikan untuk bot – anda perlu menggunakan nama ini pada fungsi Lambda yang akan anda buat belakangan. Untuk informasi tentang membuat bot di Lex, lihat https://docs.aws.amazon.com/lex/latest/dg/gs-console.html.
  3. Setelah bot selesai dibangun, pilih Publish. Untuk Create an alias, masukan Latest. Pilih Publish.

Langkah 3: Setup backend Lambda

Setelah anda membuat Lex bot, anda harus membuat fungsi lambda supaya Lex bot anda dapat mengirim pesan melalui Amazon Pinpoint.

Proses pembuatan fungsi Lambda

  1. Masuk ke konsol Lambda di https://console.aws.amazon.com/lambda.
  2. Buat sebuah fungsi Node.js 10.x dari awal. Buat IAM role baru dengan default permission. Untuk informasi lebih lanjut tentang membuat fungsi, lihat https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html.
  3. Di bagian Designer, pilih Add trigger. Tambahkan trigger SNS baru, kemudian pilih topik LexPinPointIntegrationDemo yang sudah anda buat sebelumnya.
  4. Dalam editor kode Lambda, paste kode berikut:
    "use strict";
    
    const AWS = require('aws-sdk');
    AWS.config.update({
        region: process.env.Region
    });
    const pinpoint = new AWS.Pinpoint();
    const lex = new AWS.LexRuntime();
    
    var AppId = process.env.PinpointApplicationId;
    var BotName = process.env.BotName;
    var BotAlias = process.env.BotAlias;
    
    exports.handler = (event, context)  => {
        /*
        * Event info is sent via the SNS subscription: https://console.aws.amazon.com/sns/home
        * 
        * - PinpointApplicationId is your Pinpoint Project ID.
        * - BotName is your Lex Bot name.
        * - BotAlias is your Lex Bot alias (aka Lex function/flow).
        */
        console.log('Received event: ' + event.Records[0].Sns.Message);
        var message = JSON.parse(event.Records[0].Sns.Message);
        var customerPhoneNumber = message.originationNumber;
        var chatbotPhoneNumber = message.destinationNumber;
        var response = message.messageBody.toLowerCase();
        var userId = customerPhoneNumber.replace("+1", "");
    
        var params = {
            botName: BotName,
            botAlias: BotAlias,
            inputText: response,
            userId: userId
        };
        response = lex.postText(params, function (err, data) {
            if (err) {
                console.log(err, err.stack);
                //return null;
            }
            else if (data != null && data.message != null) {
                console.log("Lex response: " + data.message);
                sendResponse(customerPhoneNumber, chatbotPhoneNumber, response.response.data.message);
            }
            else {
                console.log("Lex did not send a message back!");
            }
        });
    }
    
    function sendResponse(custPhone, botPhone, response) {
        var paramsSMS = {
            ApplicationId: AppId,
            MessageRequest: {
                Addresses: {
                    [custPhone]: {
                        ChannelType: 'SMS'
                    }
                },
                MessageConfiguration: {
                    SMSMessage: {
                        Body: response,
                        MessageType: "TRANSACTIONAL",
                        OriginationNumber: botPhone
                    }
                }
            }
        };
        pinpoint.sendMessages(paramsSMS, function (err, data) {
            if (err) {
                console.log("An error occurred.\n");
                console.log(err, err.stack);
            }
            else if (data['MessageResponse']['Result'][custPhone]['DeliveryStatus'] != "SUCCESSFUL") {
                console.log("Failed to send SMS response:");
                console.log(data['MessageResponse']['Result']);
            }
            else {
                console.log("Successfully sent response via SMS from " + botPhone + " to " + custPhone);
            }
        });
    }
  5. Pada bagian Environment variables, tambahkan variable-variable berikut:
    Kunci (Key) Nilai (Value)
    PinpointApplicationId Nama projek Pinpoint yang anda buat sebelumnya
    Botname Nama Lex bot yang anda buat sebelumnya
    BotAlias Latest
    Region Region AWS yang anda gunakan untuk projek Pinpoint dan Lex bot
  6. Di bawah Execution role, pilih View the LexPinpointIntegrationDemoLambda role.
  7. Di konsol IAM, tambahkan inline policy. Tempel teks berikut kedalam policy editor.
    Dalam kode diatas lakukan perubahan berikut:

    • Ganti <REGION> dengan nama region AWS yang anda gunakan untuk membuat projek Amazon Pinpoint dan Lex bot (misalnya us-east-1)
    • Ganti <ACCOUNTID> dengan ID akun AWS anda
    • Ganti <BOTNAME> dengan nama Lex bot anda.
  8. Setelah selesai, simpan policy diatas dengan nama PinpointLexFunctionRole.

Langkah 4: Uji chatbot anda

Chatbot SMS anda sekarang sudah siap digunakan. Anda dapat mencobanya dengan mengirimkan SMS misalnya “Schedule an appointment”) ke nomor yang telah anda dapatkan sebelumnya. Chatbot akan menjawab, menanyakan tipe appointment yang ingin anda minta dan waktunya.

Kesimpulan

Setelah Anda membuat chatbot, Anda bisa mulai melakukan menyesuaikan chatbot tersebut sesuai pemakaian spesifik yang anda inginkan. Misalnya anda dapat meningkatkan kemampuan percakapan chatbot dengan menambahkan intent (maksud/tujuan), atau Anda dapat memperluas fungsi Lambda untuk mengintegrasikannya dengan aplikasi penjadwalan pihak ketiga.

Untuk belajar lebih jauh tentang konfigurasi Amazon Lex, lihat Amazon Lex Developer Guide.

Akhirnya anda bisa melihat update terbaru dari kode yang berkaitan dengan tutorial ini di amazon-pinpoint-lex-bot repository di Github.


Tulisan ini berasal dari artikel Create an SMS Chatbot with Amazon Pinpoint and Lex yang ditulis oleh Ilya Pupko dan Gopinath Srinivasan serta diterjemahkan oleh Adrianus Kurnadi.

Petra Barus

Petra Barus

Petra Novandi Barus is Developer Advocate at Amazon Web Services based in Jakarta. He is passionate in helping startups and developers in Indonesia to reinvent on behalf their customers. Prior to AWS, Petra co-founded UrbanIndo.com as CTO. The startup became the largest real-estate portal in Indonesia and then was acquired by 99.co. During that time Petra had been a happy AWS customer for 8 years. Petra is also very active in local tech communities