Viết chatbot luật từ khóa bằng Python: hiểu cách bot trả lời trước khi dùng AI

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Trước khi dùng các mô hình AI lớn, hãy thử tự viết một chatbot dựa trên luật từ khóa. Nó đơn giản, chạy ngay trên máy bạn, không cần mạng, và giúp bạn hiểu vòng lặp cốt lõi của mọi chatbot: nhận câu hỏi, hiểu ý định, trả lời.

Ý tưởng: ý định và câu trả lời

Một chatbot luật gồm danh sách các "ý định" (intent). Mỗi ý định có tập từ khóa hoặc mẫu câu để nhận diện, và một số câu trả lời để chọn ngẫu nhiên. Khi người dùng nhắn tin, bot kiểm tra từng ý định xem có khớp không, khớp cái nào thì trả lời cái đó, không khớp thì xin lỗi và gợi ý.

Bước 1: Khai báo dữ liệu

Ta dùng một danh sách các từ điển. Lưu ý các từ khóa viết thường và có thể viết có dấu hoặc không dấu để bắt được cả hai cách gõ.

import random
import re

INTENTS = [
    {
        "name": "chao_hoi",
        "keywords": ["xin chào", "chào", "hello", "hi", "alo"],
        "answers": ["Chào bạn!", "Xin chào, mình giúp gì được bạn?"],
    },
    {
        "name": "gio_mo_cua",
        "keywords": ["giờ mở cửa", "mấy giờ", "gio mo cua", "làm việc"],
        "answers": ["Cửa hàng mở từ 8h đến 21h mỗi ngày."],
    },
    {
        "name": "cam_on",
        "keywords": ["cảm ơn", "cam on", "thanks"],
        "answers": ["Không có gì ạ!", "Rất vui được giúp bạn."],
    },
    {
        "name": "tam_biet",
        "keywords": ["tạm biệt", "bye", "thoát"],
        "answers": ["Hẹn gặp lại bạn!"],
    },
]

Bước 2: Hàm chuẩn hóa và so khớp

Trước khi so khớp, ta đưa câu về chữ thường và bỏ dấu câu thừa. Để so khớp từ khóa, dùng ranh giới từ để "hi" không khớp nhầm vào chữ "chiều" hay "thích".

def normalize(text):
    text = text.lower().strip()
    text = re.sub(r"[^\w\s]", " ", text)
    return re.sub(r"\s+", " ", text)

def match_intent(message):
    msg = " " + normalize(message) + " "
    for intent in INTENTS:
        for kw in intent["keywords"]:
            if " " + kw + " " in msg:
                return intent
    return None

def reply(message):
    intent = match_intent(message)
    if intent is None:
        return "Mình chưa hiểu ý bạn. Bạn thử hỏi về giờ mở cửa nhé."
    return random.choice(intent["answers"])

Cách thêm khoảng trắng hai đầu giúp kiểm tra "nguyên từ" mà không cần regex phức tạp. Với tiếng Việt có dấu, hàm \w của Python 3 hiểu ký tự Unicode nên chữ có dấu không bị cắt nhầm.

Bước 3: Vòng lặp trò chuyện

def main():
    print("Bot: Xin chào! (gõ 'tạm biệt' để thoát)")
    while True:
        user = input("Bạn: ")
        answer = reply(user)
        print("Bot:", answer)
        intent = match_intent(user)
        if intent and intent["name"] == "tam_biet":
            break

if __name__ == "__main__":
    main()

Chạy python chatbot.py và thử nhiều cách nói. Bạn sẽ nhanh chóng thấy giới hạn của cách này: người dùng diễn đạt khác đi là bot không hiểu. Đó là lý do ta cần cải tiến.

Cải tiến cho thông minh hơn

  • Chấm điểm: thay vì dừng ở ý định khớp đầu tiên, đếm số từ khóa khớp ở mỗi ý định rồi chọn ý định có điểm cao nhất.
  • Bỏ dấu tiếng Việt: chuẩn hóa cả câu hỏi lẫn từ khóa về dạng không dấu để người dùng gõ kiểu nào cũng nhận.
  • Trích thông tin: dùng regex để lấy số điện thoại, ngày tháng hoặc số lượng từ câu nói.
  • Ghi nhớ ngữ cảnh: lưu tên người dùng hoặc chủ đề trước đó trong một biến.
  • Đưa ra các nút gợi ý: khi bot không hiểu, liệt kê các chủ đề nó trả lời được.

Khi nào nên chuyển sang AI

Chatbot luật rất tốt cho các tình huống hẹp, câu hỏi lặp lại và cần kiểm soát hoàn toàn nội dung, ví dụ trả lời giờ mở cửa hay hướng dẫn đặt hàng. Khi câu hỏi đa dạng và mở, bạn nên cân nhắc kết hợp với mô hình ngôn ngữ hoặc thư viện nhận diện ý định. Nhưng dù dùng công nghệ nào, tư duy "ý định, câu trả lời, trường hợp dự phòng" vẫn là xương sống.

Kết luận

Chatbot luật chỉ khoảng 50 dòng Python nhưng dạy bạn xử lý chuỗi, cấu trúc dữ liệu và thiết kế hội thoại. Hãy thử kết nối nó vào Telegram hay một trang web để biến bài tập thành sản phẩm dùng được.

Để nắm vững Python và các kỹ thuật xây dựng ứng dụng thực tế, bạn có thể tìm khóa học phù hợp tại codebem.com.

author_photo
Nguyễn Đình Cường

0 comment