Saladpuk.com
🏆 เนื้อหาหลัก
🏆 เนื้อหาหลัก
  • 💖สลัดผัก
  • 📰มีอะไรใหม่บ้าง
    • 2020
      • 2020-11
      • 2020-10
      • 2020-09
      • 2020-08
      • 2020-03
      • 2020-02
      • 2020-01
    • 2019
      • 2019-12
      • 2019-11
      • 2019-10
      • 2019-09
      • 2019-08
  • 🤔อ่านเรื่องไรดี ?
  • มือใหม่หัดเขียนโค้ด
    • 👶เขียนโค้ดด้วยภาษา C#
      • เกิดมาไม่เคยเขียนโค้ดมาก่อนเบย
      • 👶พื้นฐาน
        • 1.โปรแกรมที่ต้องลง
        • 2.โครงสร้างของโค้ด
        • 3.ชนิดของข้อมูล
        • 4.การสร้างตัวแปร
        • 5.คำสั่งพื้นฐาน
        • 6.การแปลงข้อมูล
        • 7.การเปรียบเทียบค่า
        • 8.การตัดสินใจด้วย IF statements
        • 9.การตัดสินใจด้วย Switch statements
        • 10.การทำงานซ้ำๆด้วย While
        • 11.การทำงานซ้ำๆด้วย Do While
        • 12.การทำงานซ้ำๆด้วย For
        • 13.การแก้โจทย์จากรูป
        • 14.มารู้จักกับ Array กัน
      • 🧑ระดับกลาง
        • 15.Value type vs Reference type
        • 16.ลดงานซ้ำๆด้วย Method
        • 17.มารู้จักกับ Class & Field กัน
        • 18.มารู้จักกับ Constructor กันบ้าง
        • 19.มาเขียน Method ใน Class กัน
        • 20.มารู้จักกับ Property กัน
        • 21.ลองใช้คลาสแบบจริงจังบ้าง
        • 22.การสืบทอด Inheritance
        • 23.Polymorphism
        • 24.Abstract Class
        • 25.Interface
        • 26.Namespace
        • 27.Enum
        • 28.Exception handler
        • 29.ลงลึกกับ string
        • 30.StringBuilder เพื่อนคู่ string
      • 👨⏳ระดับสูง
        • Generic
        • Delegates
        • Action & Func
        • Lambda expression
        • LINQ
        • พระคัมภีร์การใช้คำสั่ง LINQ
      • 💡Tips
        • 💡C# version 8.0
        • 💡Boxing & Unboxing
    • 👶Algorithm
      • 👾Algorithm Big-O
      • 👽Algorithm P & NP
    • 👦OOP
      • 💖Abstraction
      • 💖Encapsulation
      • 🏆Abstraction & Encapsulation
      • 💖Inheritance
      • 💖Polymorphism
      • 🏆Inheritance & Polymorphism
      • 📝ลองเขียน OOP ดูดิ๊
      • 👑OOP + Power of Design
      • 🥰เทคนิคในการออกแบบ
    • 👶บทสรุปฐานข้อมูล
      • เก็บรูปในฐานข้อมูล
      • Database indexing
      • การลบข้อมูล
    • 👦Communication Patterns
    • 👦Design Patterns
      • 🤰Creational Patterns
        • 🏭Factory Method
        • 🏭Abstract Factory
        • ☝️ Singleton Pattern
        • 🏗️ Builder Pattern
        • 🎎Prototype Pattern
      • 🧱Structural Patterns
        • 🔌Adapter Pattern
        • 📪Proxy Pattern
  • Puzzle
    • 🧠Challenges
      • 🐴Google ม้า 25 ตัว
      • 🌉Amazon เสา 2 ต้น
      • 🥇ทองเก๊
      • 💊ยาต้านโควิด
      • 🎩CP หมวก 5 ใบ
      • 🧓Einstein's Riddle 01
  • พื้นฐานที่ควรต้องรู้
    • 🐳Docker
      • 📦Docker Containers
      • 🃏Docker Exercise 01
      • 🛠️ Docker Tools
      • 🗃️ Docker Registry
      • 🖼️ Container Image
      • 📢Docker Push
      • 🔄WSL
    • 👶Clean Code
      • 🧓Uncle Bob - Clean Code
      • 🧓Uncle Bob - Comments
      • 🧓Uncle Bob - Naming
      • 🧓Uncle Bob - Mindset
      • 🧓Uncle Bob - TDD
    • 👶Code Smells
    • 👶สิ่งที่คนเขียนโค้ดมักเข้าใจผิด
    • 👶AI พื้นฐาน
    • 👶Git พื้นฐาน
      • Git branching strategy
    • 👶Cloud พื้นฐาน
    • 👶UML พื้นฐาน
      • Activity Diagram
      • Class Diagram
      • Sequence Diagram
      • Use case Diagram
      • บทสรุปการใช้ UML
    • 👶Data Scientist
      • การเลือก Algorithms ให้ AI (1/5)
      • การเตรียมข้อมูลให้ AI (2/5)
      • หลักการตั้งคำถามให้ AI (3/5)
      • แฉความลับของ AI Model (4/5)
      • หัดเขียน AI จาก AI ของคนอื่น (5/5)
    • 👶DevOps พื้นฐาน
    • 👶Docker ขั้นพื้นฐาน
      • Image and Container
      • แชร์ Docker Image ที่สร้างไว้
    • 👶Microservices พื้นฐาน
      • Microservices ที่ดีมีลักษณะยังไง
      • Microservices Tips
      • จาก Monolith สู่ Microservices
    • 👶ความรู้พื้นฐานในการทำเว็บ
    • 👦Bottlenecks of Software
      • หัวใจที่สำคัญที่สุดของฐานข้อมูล
    • 👦Agile Methodology
      • Agile in a Nutshell
      • Software Development Life Cycle
      • Code Review
    • 👦Security พื้นฐาน
      • การเก็บรหัสผ่านที่ถูกต้อง
      • Security in actions
        • Hash function
      • Security Principles
      • 😎The Matrix 1
      • 😎The Matrix 2
      • HTTPS in a nutshell
    • 👦SOLID Design Principles
      • มารู้จักกับ SOLID กันดีกว่า
      • Single-Responsibility Principle
      • Open/Closed Principle
      • Liskov Substitution Principle
      • Interface Segregation Principle
      • Dependency-Inversion Principle
  • Cloud Computing
    • 👶Microsoft Azure 101
      • สมัคร Microsoft Azure
      • รู้จักกับ Resource Groups
      • สร้างเว็บตัวแรกกัน
      • สร้าง Virtual Machine กัน
      • ประเภทของคลาว์เซอร์วิส
      • มาสร้าง Logic App กัน
      • มาสร้าง Function App กัน
      • คลาว์คิดเงินยังไง ?
      • Cloud Native
      • Guideline for Cloud scaling
      • Auto Scaling
    • 👶Azure App Services
    • 👶App Service Plan
    • 👶Azure Storage
      • Blob storage
        • ลองสร้างที่เก็บไฟล์กันเลย
        • เข้าใจ Blob storage ให้มากขึ้น
        • ลองเขียนโค้ดอัพโหลดไฟล์กันบ้าง
        • สร้างเว็บจากที่ฝากไฟล์บนคลาว์
    • 👶Azure Bot Service
      • Bot เข้าใจเราได้ยังไงกันนะ
    • 👶Azure Cognitive Services
      • การสร้าง Cognitive Services
      • การ Login ด้วยใบหน้า
      • อ่านลายมือจากรูปเป็นตัวอักษร (OCR)
      • เขียน AI แยกของต่างๆทำยังไง?
      • เขียนแอพ ทายอายุ บอกเพศ ง่ายจิ๊ดเดียว
      • เขียนแอพให้ AI อธิบายรูปเป็นภาษาคน
    • 👶Machine Learning Studio
      • มาสร้าง AI ของแท้ตัวแรกของเรากัน
      • สร้าง AI ตัดสินใจอนุมัติบัตรเครดิต 💳
      • ลองเรียกใช้ AI ของเรากัน
    • 👶Azure Service Fabric
      • สร้าง Service Fabric กัน
    • 👶Blockchain
      • Blockchain ทำงานยังไง ?
      • Consensus Algorithm คืออะไร ?
      • สร้าง Blockchain ใช้เองกัน !
      • หัดเขียน Smart Contract กัน
    • 👶Power BI
    • 👶Azure Web App
      • เซิฟเวอร์บนคลาว์ ราคา? ต่าง?
    • 👶Azure DevOps
      • เล่น Azure DevOps กัน
      • เล่นกับ Repository
      • ลองทำ Continuous Integration (CI)
      • ลองทำ Continuous Delivery (CD)
      • เล่น Kanban Board
    • 🤠Cloud Playground
      • การป้องกันความลับหลุดตอนที่ 1
      • การป้องกันความลับหลุดตอนที่ 2
      • การป้องกันความลับหลุดตอนที่ 3
      • การป้องกันความลับหลุดตอนจบ
  • Software Testing
    • 👦Test-First Design
    • 👦Test-Driven Development
      • 1.มารู้จักกับ TDD กันดีกว่า
      • 2.Test cases เขาเขียนกันยังไงนะ
      • 3.เครื่องมือในการทดสอบ
      • 4.การใช้ Theory และ InlineData
      • 5.โค้ดที่ทดสอบได้
      • 6.Mantra of TDD
      • 7.Functional & None-Functional testing
      • 8.Manual vs Automation testing
      • 9.Automation Frameworks in .NET
      • 10.Mock Framework
      • 11.มาเรียนการใช้ Moq กันเถอะ
      • 12.สรุป
  • Web
    • 👦Web API
      • 1.Web API คืออะไร
      • 2.ติดตั้ง .NET Core SDK
      • 3.สร้าง Web API ตัวแรกกัน
      • 4.Verbs
      • 5.Swagger เพื่อคู่ API
      • 6.การใช้ Model
      • 7.เรียก Web API ผ่าน Postman
      • 8.มาจัดกลุ่ม API กัน (1/2)
      • 9.มาจัดกลุ่ม API กัน (2/2)
  • Software Design
    • 🤴Design Patterns
      • 🦈Creational patterns
        • Abstract Factory
        • Builder
        • Factory Method
        • Prototype
        • Singleton
      • 🦈Structural patterns
        • Adapter
        • Bridge
        • Decorator
        • Facade
        • Proxy
      • 🦈Behavioral patterns
        • Chain of Responsibility
        • Command
        • Iterator
        • Mediator
        • Memento
        • Observer
        • State
        • Strategy
        • Template Method
        • Visitor
Powered by GitBook
On this page
  • 🤔 เบื้องหลัง Bot มันทำงานยังไง ?
  • 🤔 แล้วจะให้ Bot โต้ตอบกับผู้ใช้ หรือตัดสินใจยัง ?
  • 🎯 บทสรุป

Was this helpful?

Export as PDF
  1. Cloud Computing
  2. Azure Bot Service

Bot เข้าใจเราได้ยังไงกันนะ

มาดูเบื้องหลังการทำงานของ Chat Bot กับ LUIS กันดีกว่า

PreviousAzure Bot ServiceNextAzure Cognitive Services

Last updated 5 years ago

Was this helpful?

หลังจากที่เราได้เลองเขียน Chat Bot แบบง่ายๆไปแล้ว หลายๆคนก็น่าจะมีคำถามว่า บอทมันรู้ได้ไงว่าต้องตอบอะไรเรา? หรือ อยากให้มันฉลาดขึ้นต้องทำยังไง? ดังนั้นในบทนี้เราจะมาดูเบื้องหลังการทำงานของตัว Bot ของเรากันนะครับ

Azure Bot Service สำหรับใครที่ยังไม่ได้ดูวิธีการสร้าง Chat Bot ผมแนะนำให้ไปดูบทความด้านล่างนี้ก่อนนะครับ สอนการสร้าง Bot Service ตั้งแต่เริ่มต้นเลย

🤔 เบื้องหลัง Bot มันทำงานยังไง ?

การที่จะรู้ว่าตัว Bot มันทำงานจริงๆยังไงได้ เราก็ต้องไปไล่ดู Source code ของเรากัน เพื่อจะได้เข้าใจมันได้อย่างถ่องแท้ก่อน ดังนั้นเปิดตัวโปรเจคขึ้นมาได้เลยครับ

สำหรับคนที่ข้ามมาอ่านบทนี้แล้วอยากรู้เรื่องสามารถดาวโหลด source code ด้านล่างได้เลยนะ

วิธีเปิดโปรเจค ในตัวอย่างนี้ผมจะใช้ Visual Studio Code เปิดโปรเจคนะครับ หากใครยังไม่มีให้ไปดาวโหลดได้จากลิงค์ด้านล่างนี้ และมันต้องใช้ .NET Core SDK ด้วย ดังนั้นติดตั้งให้เรียบร้อยเลยครับ

หลังจากที่เปิดตัวโปรเจคมาแล้วให้เปิดไฟล์ FlightBookingRecognizer.cs ขึ้นมาเลยครับ ซึ่งเจ้าตัวไฟล์นี้แหละคือจุดที่ Bot จะทำความเข้าใจว่าผู้ใช้ต้องการจะสื่ออะไร แล้วจะตอบโต้กลับยังไง

ซึ่งเจ้าโค้ดตัวนั้นมันเขียนไว้ตามด้านล่างนี้

FlightBookingRecognizer.cs
public class FlightBookingRecognizer : IRecognizer
{
    private readonly LuisRecognizer _recognizer;

    public FlightBookingRecognizer(IConfiguration configuration)
    {
        var luisIsConfigured = !string.IsNullOrEmpty(configuration["LuisAppId"]) 
                && !string.IsNullOrEmpty(configuration["LuisAPIKey"]) 
                && !string.IsNullOrEmpty(configuration["LuisAPIHostName"]);
        if (luisIsConfigured)
        {
            var luisApplication = new LuisApplication(
                configuration["LuisAppId"],
                configuration["LuisAPIKey"],
                "https://" + configuration["LuisAPIHostName"]);
            _recognizer = new LuisRecognizer(luisApplication);
        }
    }

    // Returns true if luis is configured in the appsettings.json and initialized.
    public virtual bool IsConfigured => _recognizer != null;

    public virtual async Task<RecognizerResult> RecognizeAsync(ITurnContext turnContext, CancellationToken cancellationToken)
        => await _recognizer.RecognizeAsync(turnContext, cancellationToken);

    public virtual async Task<T> RecognizeAsync<T>(ITurnContext turnContext, CancellationToken cancellationToken)
        where T : IRecognizerConvert, new()
        => await _recognizer.RecognizeAsync<T>(turnContext, cancellationToken);
}

โดยสรุปหลักการทำงานคือ เมื่อผู้ใช้ทำการป้อนข้อมูลเข้ามาแล้วตัว Bot จะทำการวิเคราะห์ความหมายว่าผู้ใช้จะสื่อว่าอะไร โดยใช้ตัววิเคราะห์ที่ชื่อว่า LUIS นั่นเอง (จำได้ไหมตอนสร้างมันจะให้เราสร้าง LUIS ด้วยไง) โดยผลลัพท์ที่ LUIS วิเคราะห์เสร็จจะส่งกลับมาจาก method RecognizeAsync นั่นเอง

โดยสรุปว่า Bot มันเข้าใจความหมายที่ผู้ใช้ส่งเข้ามาได้ยังไงก็คือ การส่งต่อให้ LUIS ไปตีความหมายแล้วส่งผลลัพท์กลับมา เพื่อให้ Bot เลือกตัดสินใจต่อว่าจะทำอะไรต่อดีนั่นเอง

🤔 แล้วจะให้ Bot โต้ตอบกับผู้ใช้ หรือตัดสินใจยัง ?

ในส่วนของการโต้ตอบหรือตัดสินใจต่างๆของ Bot นั้นสามารถดูตัวอย่างได้จากไฟล์ Dialogs/MainDialog.cs ครับ ซึ่งตัวโค้ดจุดแรก (Constructor) เขาเขียนไว้แบบนี้

public MainDialog(FlightBookingRecognizer luisRecognizer, BookingDialog bookingDialog, ILogger<MainDialog> logger)
    : base(nameof(MainDialog))
{
    _luisRecognizer = luisRecognizer;
    Logger = logger;

    AddDialog(new TextPrompt(nameof(TextPrompt)));
    AddDialog(bookingDialog);
    AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[]
    {
        IntroStepAsync,
        ActStepAsync,
        FinalStepAsync,
    }));

    // The initial child Dialog to run.
    InitialDialogId = nameof(WaterfallDialog);
}

อธิบายโค้ดด้านบน จะเห็นว่าใน บรรทัดที่ 1 ตัว Bot จะถูกส่งคลาส FlightBookingRecognizer เข้ามานั่นหมายความว่าตัว Bot ก็จะสามารถใช้ LUIS ได้เมื่อต้องการ ถัดมาบรรทัดที่ 9~14 เป็นการกำหนดขั้นตอนการทำงานแต่ละ step ของ Bot เช่น เริ่มต้นมาก็จะเรียกขั้นตอน IntroStepAsync ต่อมาก็จะเรียก ActStepAsync และสุดท้ายก็ FinalStepAsync ตามลำดับ

คราวนี้เราลองไปดูตัวอย่าง IntroStepAsync กัน เราก็จะเห็นโค้ดประมาณนี้

MainDialog.cs
private async Task<DialogTurnResult> IntroStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    ...

    // Use the text provided in FinalStepAsync or the default if it is the first time.
    var messageText = stepContext.Options?.ToString() ?? "What can I help you with today?\nSay something like \"Book a flight from Paris to Berlin on March 22, 2020\"";
    var promptMessage = MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput);
    return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = promptMessage }, cancellationToken);
}

อธิบายโค้ดด้านบน จะเห็นว่าพอเราเข้าไปคุยกับ Bot ปุ๊ป คำพูดแรกที่คุยกับเราคือตามบรรทัดที่ 6 ใช่ไหมครับWhat can I help you with today? Say something like "Book a flight from Paris to Berlin on March 22, 2020" ซึ่งนี่แหละคือสิ่งที่ Bot ทำใน IntroStepAsync นั่นเอง

หลังจากผ่าน IntroStepAsync ไปแล้วมันก็จะเข้ามาทำงานที่ method ActStepAsync ต่อซึ่งเขาก็เขียนไว้ประมาณนี้

MainDialog.cs
private async Task<DialogTurnResult> ActStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    ...

    var luisResult = await _luisRecognizer.RecognizeAsync<FlightBooking>(stepContext.Context, cancellationToken);
    switch (luisResult.TopIntent().intent)
    {
        case FlightBooking.Intent.BookFlight:
            ...

        case FlightBooking.Intent.GetWeather:
            ...

        default:
            var didntUnderstandMessageText = $"Sorry, I didn't get that. Please try asking in a different way (intent was {luisResult.TopIntent().intent})";
            ...
    }

    return await stepContext.NextAsync(null, cancellationToken);
}

อธิบายโค้ดด้านบน ในขั้นตอนนี้ตัว Bot จะให้ LUIS วิเคราะห์สิ่งที่ผู้ใช้พิมพ์เข้ามา ในบรรทัดที่ 5 แล้ว Bot ก็จะดูว่าผู้ใช้อยากจะทำอะไร ที่เขียนไว้ใน switch case ของบรรทัดที่ 6~17 เช่น ขอจองเที่ยวบิน หรือ เช็คสภาพอากาศ และสุดท้ายถ้าไม่ใช่ทั้ง 2 กรณีก็จะบอกว่าไม่เข้าใจสิ่งที่พูด

จากตัวอย่างนี้เราก็พอจะเห็นแล้วนะครับว่า การสร้างบทโต้ตอบของ Bot กับผู้ใช้สามารถลองแก้ไขหรือเพิ่มลดได้ที่พวก Dialog ต่างๆ ซึ่งถ้าดูดีๆในตัว MainDialog ก็จะมีการเรียกใช้ BookingDialog ด้วยเหมือนกันตอนที่จะจองเที่ยวบินจริงๆครับ

🎯 บทสรุป

จากทั้งหมดที่ไล่มาจริงๆตัว Bot นั้นก็มีหน้าที่แค่ สร้างชุดคำถามคำตอบให้ผู้ใช้หลายๆแบบนั่นเอง ส่วนขั้นตอนวิเคราะห์ว่าผู้ใช้ป้อนเข้ามานั่นจะสื่อถึงเรื่องไหนก็ใช้ตัว AI ที่ชื่อว่า LUIS เป็นตัวช่วยเพื่อจับคู่การทำงานของ กลุ่มคำถามคำตอบที่ตัวเองมี หรือ ใช้ในการตัดสินใจต่างๆต่อนั่นเอง

สุดท้ายตัว Bot จะเก่งขึ้นเรื่องได้ โดยเราจะต้องใช้ Bot ไปเชื่อมต่อกับ Services อื่นๆ เช่น Google Calendar เพื่อลงบันทึก event หรือ Line เพื่อช่วยโต้ตอบลูกค้าเวลาที่มีปัญหา และที่ขาดไม่ได้คือการเชื่อมเข้ากับตัว AI ต่างๆเช่น Speech services หรือ Vision service เพื่อให้ Bot สามารถพูดออกมา หรือ มองเห็นสิ่งของต่างๆได้นั่นเองครับ

LUIS - Language Understanding คือ AI ที่คอยวิเคราะห์ภาษาว่า input ที่รับเข้ามานั้นเขาต้องการจะสื่อว่าอะไร เช่น แพงจัง อาจจะหมายความว่าขอลดราคาอะไรแบบนี้ ซึ่งอีกซักหน่อยเราจะได้ไปลองเล่นเจ้า LUIS กัน ติดตามอ่านได้จาก side menu หรือถ้าขี้เกียจรอก็กระโดดไปอ่าน document หลักของ Microsoft ได้เลยครับ

👶
Microsoft Language Understanding (LUIS) Document
บทความสร้าง Bot Service จิ้มลงมาเบย
Visual Studio Code
.NET Core SDK
73KB
saladpuk-demo-src.zip
archive
Download: Chat Bot source code