Explore all courses in this category.
Explore all courses in this category.
Nguyễn Đình Cường
0 comment
09 Nov, 2026
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.
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 ý.
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!"],
},
]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.
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.
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.
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.
Nguyễn Đình Cường
0 comment