Bỏ qua nội dung

Hướng dẫn cách train một mô hình Chatbot bằng Python

  • Như các bạn đã biết, Chatbot là một chương trình kết hợp với trí tuệ nhân tạo (AI) để tương tác với con người. Công cụ này có thể thay thế cho nhân viên tư vấn hoặc trả lời những thắc mắc của khách hàng.

    Nó không chỉ là công cụ trợ giúp bán hàng hoạt động 24/7. Mà Chatbot còn cập nhật liên tục, giúp bạn không bỏ sót đơn hàng nào của khách.

    Train mô hình chatbot bằng Machine Learning (Deep Learning) như thế nào?

    Việc huấn luyện một mô hình chatbot bằng Python có thể thực hiện bằng nhiều cách khác nhau, tùy thuộc vào độ phức tạp và dữ liệu mà bạn muốn sử dụng. Dưới đây là hướng dẫn từng bước của team FastCloud để các bạn có thể train một con chatbot từ cơ bản đến nâng cao.

    1. Chọn phương pháp huấn luyện

    Có 3 phương pháp chính để train một chatbot:

    Dựa trên rule-based (kịch bản có sẵn) – Dùng các câu trả lời cố định.

    Dựa trên machine learning truyền thống – Dùng mô hình NLP như TF-IDF hoặc seq2seq.

    Dựa trên deep learning – Dùng mô hình transformer như GPT hoặc LLaMA.

    2. Chuẩn bị môi trường và cài đặt thư viện

    Trước tiên, bạn cần cài đặt các thư viện quan trọng:

    NLTK: Xử lý ngôn ngữ tự nhiên.

    Transformers: Sử dụng mô hình ngôn ngữ mạnh như GPT.

    Quá trình thực hiện:

    1️⃣ Thu thập dữ liệu hội thoại

    Ví dụ file intents.json:

    {
        "intents": [
            {
                "tag": "chào hỏi",
                "patterns": ["Xin chào", "Chào bạn", "Hello"],
                "responses": ["Chào bạn!", "Xin chào, tôi có thể giúp gì?", "Hello!"]
            },
            {
                "tag": "tạm biệt",
                "patterns": ["Tạm biệt", "Bye", "Hẹn gặp lại"],
                "responses": ["Tạm biệt nhé!", "Hẹn gặp lại!", "Bye bye!"]
            }
        ]
    }
    

    2️⃣ Tiền xử lý dữ liệu

    Mục tiêu: Biến văn bản thành dạng có thể dùng để train mô hình (Bag of Words).

    📌 Các bước:

    ✅ Tokenize (tách từ)
    ✅ Lemmatize (chuẩn hóa từ)
    ✅ Chuyển đổi sang dạng vector

    Cài đặt thư viện:

    pip install numpy nltk tensorflow
    

    Code tiền xử lý dữ liệu:

    import json
    import random
    import numpy as np
    import nltk
    from nltk.stem import WordNetLemmatizer
    
    # Khởi tạo lemmatizer để chuẩn hóa từ
    lemmatizer = WordNetLemmatizer()
    
    # Load dữ liệu hội thoại từ JSON
    with open("intents.json", "r", encoding="utf-8") as file:
        intents = json.load(file)
    
    words = []
    classes = []
    documents = []
    ignore_words = ["?", "!", ".", ","]
    
    # Xử lý dữ liệu đầu vào
    for intent in intents["intents"]:
        for pattern in intent["patterns"]:
            word_list = nltk.word_tokenize(pattern)  # Tokenize
            words.extend(word_list)
            documents.append((word_list, intent["tag"]))
            if intent["tag"] not in classes:
                classes.append(intent["tag"])
    
    # Chuẩn hóa từ (lemmatization)
    words = [lemmatizer.lemmatize(w.lower()) for w in words if w not in ignore_words]
    words = sorted(list(set(words)))
    classes = sorted(list(set(classes)))
    
    print("Từ vựng:", words)
    print("Nhóm hội thoại:", classes)
    

    3️⃣ Chuyển đổi dữ liệu thành vector

    Chúng ta tạo Bag of Words (BOW) để biểu diễn câu bằng số.

    # Tạo dữ liệu huấn luyện
    training = []
    output_empty = [0] * len(classes)
    
    for doc in documents:
        bag = []
        word_patterns = doc[0]
        word_patterns = [lemmatizer.lemmatize(word.lower()) for word in word_patterns]
    
        for w in words:
            bag.append(1) if w in word_patterns else bag.append(0)
    
        output_row = list(output_empty)
        output_row[classes.index(doc[1])] = 1
        training.append([bag, output_row])
    
    # Chuyển đổi sang mảng NumPy
    random.shuffle(training)
    training = np.array(training, dtype=object)
    
    train_x = np.array(list(training[:, 0]))  # Input (BOW)
    train_y = np.array(list(training[:, 1]))  # Output (Nhóm hội thoại)
    
    print("Dữ liệu đầu vào:", train_x)
    print("Dữ liệu đầu ra:", train_y)
    

    4️⃣ Xây dựng mô hình Deep Learning

    Chúng ta sử dụng TensorFlow/Keras để xây dựng mạng Neural Network.

    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense, Dropout
    from tensorflow.keras.optimizers import SGD
    
    # Xây dựng mô hình Deep Learning
    model = Sequential()
    model.add(Dense(128, input_shape=(len(train_x[0]),), activation="relu"))
    model.add(Dropout(0.5))
    model.add(Dense(64, activation="relu"))
    model.add(Dropout(0.5))
    model.add(Dense(len(train_y[0]), activation="softmax"))
    
    # Biên dịch mô hình
    sgd = SGD(learning_rate=0.01, decay=1e-6, momentum=0.9, nesterov=True)
    model.compile(loss="categorical_crossentropy", optimizer=sgd, metrics=["accuracy"])
    
    # Train mô hình
    model.fit(train_x, train_y, epochs=200, batch_size=5, verbose=1)
    
    # Lưu mô hình đã train
    model.save("chatbot_model.h5")
    print("Mô hình đã được lưu!")
    

    5️⃣ Triển khai chatbot

    Sau khi train xong, chúng ta có thể sử dụng mô hình để phản hồi tin nhắn.

    import json
    import numpy as np
    import nltk
    import tensorflow as tf
    from nltk.stem import WordNetLemmatizer
    
    lemmatizer = WordNetLemmatizer()
    with open("intents.json", "r", encoding="utf-8") as file:
        intents = json.load(file)
    
    # Load mô hình đã train
    model = tf.keras.models.load_model("chatbot_model.h5")
    
    # Hàm xử lý đầu vào
    def clean_up_sentence(sentence):
        sentence_words = nltk.word_tokenize(sentence)
        sentence_words = [lemmatizer.lemmatize(word.lower()) for word in sentence_words]
        return sentence_words
    
    def bag_of_words(sentence, words):
        sentence_words = clean_up_sentence(sentence)
        bag = [0] * len(words)
        for s in sentence_words:
            for i, w in enumerate(words):
                if w == s:
                    bag[i] = 1
        return np.array(bag)
    
    def predict_class(sentence):
        bow = bag_of_words(sentence, words)
        res = model.predict(np.array([bow]))[0]
        ERROR_THRESHOLD = 0.25
        results = [[i, r] for i, r in enumerate(res) if r > ERROR_THRESHOLD]
        results.sort(key=lambda x: x[1], reverse=True)
        return classes[results[0][0]] if results else "unknown"
    
    def get_response(tag):
        for intent in intents["intents"]:
            if intent["tag"] == tag:
                return random.choice(intent["responses"])
        return "Xin lỗi, tôi không hiểu."
    
    # Chạy chatbot
    print("Chatbot đã sẵn sàng! Nhập 'quit' để thoát.")
    while True:
        message = input("Bạn: ")
        if message.lower() == "quit":
            break
        tag = predict_class(message)
        response = get_response(tag)
        print(f"Bot: {response}")
    

    🎯 Tổng kết

    ✅ Thu thập dữ liệu (intents.json)
    ✅ Tiền xử lý dữ liệu (Tokenize, Lemmatize, Bag of Words)
    ✅ Xây dựng mô hình Deep Learning (Neural Network với TensorFlow)
    ✅ Train mô hình
    ✅ Triển khai chatbot

Cafe buổi sáng
1 1 303 1

Bài liên quan


  • Khung cảnh thiên nhiên kỳ vĩ của Thung lũng các vị Thần (Valley of the Gods) tại tiểu bang Utah, Mỹ vừa được ghi lại trọn vẹn trong một đoạn video ngắn, thu hút sự chú ý lớn từ công chúng. Điểm nhấn ấn tượng của thước phim là khoảnh khắc góc máy từ trên cao bay lướt qua những ngọn núi sa thạch đỏ rực, hướng thẳng về phía một cầu vồng đôi tuyệt đẹp xuất hiện hiếm hoi giữa sa mạc.

    Theo thông tin từ National Geographic Travel, đây là một phần hình ảnh thuộc loạt phim tài liệu thiên nhiên "Earth Moods", hiện đang được phát sóng trên nền tảng Disney+. Khu vực Thung lũng các vị Thần vốn nổi tiếng với địa hình hoang sơ, đặc trưng bởi những cột đá sa thạch khổng lồ mang hình thù độc đáo do quá trình kiến tạo địa chất và xói mòn tạo nên qua hàng triệu năm.

    Sự xuất hiện của cầu vồng đôi trong một không gian vốn khô cằn tạo ra hiệu ứng thị giác tương phản mạnh mẽ. Hình ảnh này không chỉ mang đến trải nghiệm mãn nhãn cho người xem, mà còn gửi gắm thông điệp sâu sắc về vẻ đẹp tráng lệ của Trái Đất, qua đó khơi dậy ý thức trân trọng và bảo vệ thiên nhiên.

    1 Phản hồi 0 Yêu thích 1 Đã xem
  • Quả video này làm bằng Capcut, AI clone giọng đọc.

    1 Phản hồi 0 Yêu thích 2 Đã xem
  • AYANEO đã chính thức deploy sản phẩm mới, Pocket Play, một chiếc điện thoại chơi game lấy cảm hứng từ Xperia Play, với thiết kế trông không khác gì một “viên gạch” lớn. Teaser mới nhất của công ty trên X (trước đây là Twitter) đã phô diễn rõ ràng AYANEO Pocket Play với hình dáng khối chữ nhật chắc chắn và bộ điều khiển trượt ngang đặc trưng.

    Screenshot 2026-02-07 at 14.33.13.png

    Về mặt kiến trúc phần cứng, AYANEO đã xác nhận sử dụng MediaTek Dimensity 9300 làm bộ não xử lý trung tâm. Đây là một SoC di động cao cấp tương đối mới, tập trung mạnh vào hiệu suất GPU và hiệu quả tiêu thụ điện, đưa Pocket Play vào phân khúc hiệu năng flagship. Trong thực tế, điều này hàm ý rằng thiết bị sẽ có đủ “headroom” (khoảng trống hiệu năng) để chạy mượt mà các trình giả lập cao cấp, dịch vụ stream game đám mây, và các tựa game Android native. Tuy nhiên, bài toán kỹ thuật quan trọng ở đây là AYANEO sẽ quản lý nhiệt độ và duy trì hiệu suất ổn định như thế nào trong cái khung máy nhỏ gọn nhưng “đặc” này. Đây sẽ là một chỉ số hiệu năng (performance metric) quan trọng cần theo dõi khi thiết bị ra mắt.

    Thiết Kế Màn Hình Và Giao Diện Điều Khiển Vật Lý

    Về mặt giao diện người dùng bên ngoài, Pocket Play được xây dựng xung quanh màn hình OLED 6.8 inch với độ phân giải 2400×1080 và tần số quét 165 Hz. Thao tác trượt màn hình có hình dáng viên gạch này lên sẽ hé lộ một bộ điều khiển đầy đủ, cộng thêm các nút vai (shoulder buttons) quen thuộc được bố trí dọc theo cạnh trên. Đây là một cách tiếp cận UI/UX vật lý khá độc đáo trong thị trường hiện tại.

    Pocket Play dự kiến không đến tay người dùng cho đến khoảng năm 2026 (theo các thông tin rò rỉ), và AYANEO đã nhanh chóng khởi tạo một trang gây quỹ Kickstarter. Trang chiến dịch này vẫn đang ở trạng thái “Sắp ra mắt,” nhưng nó phản ánh các chi tiết cốt lõi từ các bài đăng và trailer giới thiệu của AYANEO.

    Nếu có điều gì đó, thì Pocket Play chính là AYANEO vẫn là AYANEO: thay vì chỉ tập trung vào việc bán một thiết bị cầm tay Android thông thường, họ lại chọn con đường “nghiên cứu và phát triển” một hình khối chữ nhật “đặc ruột” và nhồi nhét một chiếc điện thoại vào đó. Liệu “dao đa năng Thụy Sĩ” (Swiss Army Play) hình chữ nhật này có thực sự “land” thành công hay không, có lẽ sẽ phụ thuộc vào ba biến số chính: giá thành (cost), hiệu năng nhiệt (thermals), và cảm giác “ergonomic feedback” từ bộ điều khiển khi người dùng thực sự trải nghiệm nó ngoài đời thực.

    1 Phản hồi 0 Yêu thích 13 Đã xem
Bản quyền 2026 © Type