Hướng Dẫn Lập Trình Chatbot Với Python

Hướng Dẫn Lập Trình Chatbot Với Python

Ngày nay, hơn 30% công việc sử dụng công nghệ Chatbot. Các công ty ngày càng sử dụng nhiều hơn những con bot này vào các công việc như tư vấn khách hàng, tạo nguồn thông tin,... Đơn cử, ta có ngay 2 con trợ lý ảo Siri và Alexa đã làm thay đổi hoàn toàn xu hướng công nghệ hiện tại.

Sau đây, chúng ta sẽ tạo một con Chatbot đơn giản bằng Python sử dụng thư viện chatterbotflask.

Chatbot là gì?

Chatbot hay còn gọi là bot, chatterbot, artificial agent,... là một phần mềm đươc viết dựa trên nền tảng là trí tuệ nhân tạo phục vụ việc giao tiếp giữa người với máy sử dụng các đoạn văn bản (text). SiriAlexa hiện là 2 trợ lý ảo xịn nhất hiện nay.

Các Chatbot được tạo ra với mục đích độc lập chẳng hạn như giao dịch với khách hàng, trao đổi biểu mẫu thông tin hay đơn giản chỉ là trò chuyện với bạn. Công nghệ Chatbot đã trải qua một quãng đường dài phát triển. Hãy điểm qua từng giai đoạn làm Chatbot nhé.

Sự phát triển của Chatbot

Vào năm 1966, Joseph Weizenbaum làm con chatbot đầu tiên phục vụ việc giao tiếp giữa người với máy tính bằng những đoạn văn bản có sẵn. Với những đột phá về công nghệ thời gian qua, chatbot ngày nay đã thông minh hơn nhiều.

Bot truyền thống

Bot hiện tại

Bot tương lai

Hệ thống điều khiển

Có thể giao tiếp qua lại

Giao tiếp ở nhiều mức độ, lĩnh vực

Tự động hóa

Tự động hóa theo nhiệm vụ cụ thể

Tự động hóa theo nhu cầu

Tối ưu các hàm giao tiếp

Duy trì bối cảnh khi giao tiếp

Biến đổi nội dung giao tiếp theo nhiệm vụ, ngữ cảnh và con người

Chỉ thực hiện theo ngữ cảnh giao tiếp hệ thống lập trình sẵn

Có khả năng giao tiếp tốt theo từng nhiệm vụ cụ thể

Có bot chủ và hệ thống bot điều khiển

Hạn chế của chatbot

  • Nền tảng: Trí tuệ nhân tạo là cái nhân của con chatbot, tuy nhiên để tạo ra được chatbot có thể nói chuyện như người thật thì thực sự vẫn còn khá xa.
  • Nội tâm: Khả năng vấn đáp của chatbot còn hạn chế, các lỗi xuất hiện có tính hệ thống.

Chúng ta hy vọng với những tiến bộ của ngành trí tuệ nhân tạo hiện nay có thể tạo ra được một con robot giao tiếp tốt như con người.

Nguyên lý làm việc

Chúng ta chia chatbot làm 2 hướng:

  • Rule-Based Approach: Với phương pháp này, bot được lập trình theo những nguyên tắc có sắc. Bot có thể trả lời những truy vấn đơn giản nhưng với truy vấn phức tạp thì không.
  • Self-Learning Approach: Bot được huấn luyện dựa trên các thuật toán học mày machine learning. Chúng ta tiếp tục chia làm 2 loại:
    • Retrieval-Based Models: Với phương pháp này, bot chọn ra câu trả lời tốt nhất trong danh sách các câu trả lời theo truy vấn của người dùng.
    • Generative Models: Những mô hình này sẽ tự đưa ra câu trả lời thay vì chọn câu trả lời trong một bộ câu trả lời điều này làm bot ngày càng trở nên thông minh.

Thư viện ChatterBot trong Python

ChatterBot là một công cụ tạo ra một chatbot tự động dựa trên cơ sở học máy machine learning bằng ngôn ngữ Python. ChatterBot chính là một freamwork cho ChatAI (Chatbot AI) để tạo ra những con bot thông minh để bạn có thể tích hợp vào những công cụ chat như Facebook, Skype hoặc chính là là những nền tảng chat do các bạn tự tạo ra. ChatterBot được thiết kế dựa trên Python là một ngôn ngữ xử lý ngôn ngữ hàng đầu cho phép ChatterBot có để đào tạo bất kỳ ngôn ngữ nào. Kể cả ngôn ngữ Tiếng Việt.
Đặc biệt do ChatterBot là dự án mã nguồn mở nên bạn hoàn toàn của thể nghiên cứu phát triển và kiểm soát được toàn bộ mã nguồn cũng như cơ sở dữ liệu. Điều này làm bảo mật toàn bộ thông tin con bot mà bạn phát triển không phải phụ thuộc vào bất kỳ nền tảng do một bên thứ 3 nào như Wit.AI….

Bạn có thể tham khảo dự án tại Github: https://github.com/gunthercox/ChatterBot
Tài liệu cho ChatterBot: https://chatterbot.readthedocs.io/en/stable/index.html

Quy trình hoạt động chatterbot

Các Chatbot hoạt động bằng cách sử dụng phương pháp phát hiện trùng khớp các mẫu câu Pattern matchers để tìm kiếm các mẫu câu có trong câu hỏi của người dùng và xem có khớp với các câu hỏi đã được "huấn luyện" lưu trữ  trong hệ thống để đưa ra các câu trở lời phù hợp nhất. Ban đầu câu hỏi người dùng được đưa vào tiếp theo đó chúng ta sử dụng các pattern đã định nghĩa từ trước để chia nhỏ câu hỏi thành từng pattern con. Tiếp theo ta sử dụng các thuật toán học máy để xác định câu hỏi khớp nhất trong các câu hỏi đã được định nghĩa từ trước. Sau đó với câu hỏi ta chọn được khớp nhất ta sẽ chọn câu trả lời từ tập câu trả lời được định nghĩa trước bởi câu hỏi đó. Cuối cùng, trả lời cho người dùng câu trả lời ta tìm được.

Nào bắt đầu làm chatbot thôi!

Chuẩn bị

  • Chatterbot: là cái nhân của chatbot. Đây là thư viện phục vụ việc nhận tin nhắn của người dùng rồi học cách để trả lời cho tin nhắn đó.
  • Flask: Tạo giao diện browser tương tác thực với người dùng.

Mình tải và cài đặt Visual Studio Code trên máy tính để chạy code Python.

Thư viện chatterbot

Cài đặt thư viện

Bạn có thể cài đặt thư viện vào hệ thống sử dụng pip:

pip install chatterbot

Sau đó ta sẽ thử làm chatbot với vài dòng lệnh đầu tiên. Một con chatbot sẽ được hoàn thiện trong 3 phần

Phần 1: Tạo chatbot

Từ thư viện chatterbot import đối tượng ChatBot với mục đích khởi tạo một con chatbot. Sau đó ta tạo một chatbot tên Ron Obvious rồi gán vào biến chatbot.

from chatterbot import ChatBot
chatbot = ChatBot("Ron Obvious")

Phần 2: Huấn luyện ChatBot

Sau khi tạo một con ChatterBot. Việc tiếp theo là ta phải huấn luyện con bot để nó học được những kiến thức ban đầu với những câu trả lời cụ thể. Phương pháp đào tạo mà thư viện cho phép là cho một đoạn hội thoại ngắn đại diện là một list các câu hội thoại của bot và mình. Bot sẽ tự động trả lời theo ngữ cảnh mà mình cài đặt trước.

from chatterbot.trainers import ListTrainer

conversation = [
    "Hello",
    "Hi there!",
    "How are you doing?",
    "I'm doing great.",
    "That is good to hear",
    "Thank you.",
    "You're welcome."
]

trainer = ListTrainer(chatbot)

trainer.train(conversation)

Phần 3: Chọn câu trả lời

Con bot sẽ nhận một tin nhắn sau đó từ những kiến thức nó học được, nó sẽ trả lời theo ngữ cảnh nó được học từ trước và ngữ cảnh mình vừa huấn luyện cho bot.

response = chatbot.get_response("Good morning!")
print(response)

 Sau đây, kết hợp với thư viện Flask, chúng ta sẽ tạo Flask ChatterBot App chạy trên nền tảng web.

Use Case – Flask ChatterBot

Ta chia thành 3 phần:

  • Phần 1: Main chatbot. Thư viện chatterbot đảm nhiệm nhiệm vụ này. Các câu trả lời sẽ được đưa ra khi nhập tin nhắn người dùng vào.
  • Phần 2: GUI. Thư viện Flask là thư viện tạo ra với mục đích viết app nền tảng web bằng Python. Ta sẽ giao diện hóa những gì Chatterbot làm được.
  • Phần 3: Dữ liệu. Các file SQLite và file Pickle sẽ được tạo thêm với nhiệm vụ lưu dữ liệu mà chatbot huấn luyện được.

File App.py

from flask import Flask, render_template, request
from chatterbot import ChatBot
from chatterbot.trainers import ChatterBotCorpusTrainer

app = Flask(__name__)

english_bot = ChatBot("Chatterbot", storage_adapter="chatterbot.storage.SQLStorageAdapter")
trainer = ChatterBotCorpusTrainer(english_bot)
trainer.train("chatterbot.corpus.english")

@app.route("/")
def home():
    return render_template("index.html")

@app.route("/get")
def get_bot_response():
    userText = request.args.get('msg')
    return str(english_bot.get_response(userText))


if __name__ == "__main__":
    app.run()

File index.html

<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet" type="text/css" href="/static/style.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
  </head>
  <body>
    <h1>Flask Chatterbot Example</h1>
    <h3>A web implementation of <a href="https://github.com/gunthercox/ChatterBot">ChatterBot</a> using Flask.</h3>
    <div>
      <div id="chatbox">
        <p class="botText"><span>Hi! I'm Chatterbot.</span></p>
      </div>
      <div id="userInput">
        <input id="textInput" type="text" name="msg" placeholder="Message">
        <input id="buttonInput" type="submit" value="Send">
      </div>
      <script>
        function getBotResponse() {
          var rawText = $("#textInput").val();
          var userHtml = '<p class="userText"><span>' + rawText + '</span></p>';
          $("#textInput").val("");
          $("#chatbox").append(userHtml);
          document.getElementById('userInput').scrollIntoView({block: 'start', behavior: 'smooth'});
          $.get("/get", { msg: rawText }).done(function(data) {
            var botHtml = '<p class="botText"><span>' + data + '</span></p>';
            $("#chatbox").append(botHtml);
            document.getElementById('userInput').scrollIntoView({block: 'start', behavior: 'smooth'});
          });
        }
        $("#textInput").keypress(function(e) {
            if(e.which == 13) {
                getBotResponse();
            }
        });
        $("#buttonInput").click(function() {
          getBotResponse();
        })
      </script>
    </div>
  </body>
</html>

 

File Style.css

body {
    font-family: Garamond;
}

h1 {
    color: black;
    margin-bottom: 0;
    margin-top: 0;
    text-align: center;
    font-size: 40px;
}

h3 {
    color: black;
    font-size: 20px;
    margin-top: 3px;
    text-align: center;
}

#chatbox {
    margin-left: auto;
    margin-right: auto;
    width: 40%;
    margin-top: 60px;
}

#userInput {
    margin-left: auto;
    margin-right: auto;
    width: 40%;
    margin-top: 60px;
}

#textInput {
    width: 87%;
    border: none;
    border-bottom: 3px solid #009688;
    font-family: monospace;
    font-size: 17px;
}

#buttonInput {
    padding: 3px;
    font-family: monospace;
    font-size: 17px;
}

.userText {
    color: white;
    font-family: monospace;
    font-size: 17px;
    text-align: right;
    line-height: 30px;
}

.userText span {
    background-color: #009688;
    padding: 10px;
    border-radius: 2px;
}

.botText {
    color: white;
    font-family: monospace;
    font-size: 17px;
    text-align: left;
    line-height: 30px;
}

.botText span {
    background-color: #EF5350;
    padding: 10px;
    border-radius: 2px;
}

#tidbit {
    position:absolute;
    bottom:0;
    right:0;
    width: 300px;
}

Sau khi chạy file app.py chatbot sẽ huấn luyện dữ liệu từ kho dữ liệu chatterbot.corpus.english có sẵn của chatterbot. Trong kho dữ liệu gồm rất nhiều lĩnh vực. Mỗi lĩnh vực sẽ được lưu trữ dữ liệu dưới dạng file yml. Trong file sẽ gồm 2 phần categories biểu thị chủ đề còn conversations biểu thị cặp câu hỏi và trả lời tương ứng. Chatbot sẽ học những dữ liệu này để phản hồi lại tin nhắn của mình.

Danh sách các chủ đề trong chatterbot.corpus.english

Dữ liệu được lưu trong file ai.yml

Quá trình chatbot huấn luyện dữ liệu. Tất cả chủ đề đều được huấn luyện. Như trên mình chỉ biểu thị chủ đề về AI.

Sau khi chạy file app.py, ta sẽ kết nối với đang web mà thư viện Flask vừa tạo qua đường link http://127.0.0.1:5000/

Kết luận

Bài viết hướng dẫn cơ bản về 2 thư viện Chatterbot và Flask để làm một con chatbot đơn giản.

Tuy nhiên, để nâng cao hiệu quả chatbot mình phải có tập huấn luyện đa dạng, đủ tốt để bot học được nhiều kiến thức hơn.

Một con chatbot đơn giản giúp chúng ta hiểu hơn về quy trình xử lý ngôn ngữ tự nhiên NLP, cách một chatbot hoạt động hơn nữa đây là nền tảng để chúng ta làm một con trợ lý ảo có thể giao tiếp trực tiếp bằng giọng nói với mình.

Cảm ơn các bạn đã quan tâm và đọc bài viết. Có ý kiến góp ý xin hãy thêm vào cmt giúp mình.