File size: 3,695 Bytes
0c16fc9
b8e326d
0c16fc9
 
8829c2d
0c16fc9
 
8829c2d
0c16fc9
 
8829c2d
 
 
0c16fc9
 
 
 
 
 
 
 
 
 
8829c2d
 
0c16fc9
 
845a94d
b8e326d
8829c2d
 
 
0c16fc9
8829c2d
0c16fc9
 
 
8829c2d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0c16fc9
8829c2d
 
0c16fc9
 
8829c2d
 
 
 
0c16fc9
 
8829c2d
0c16fc9
 
 
 
 
 
 
 
 
b4aaddd
8829c2d
845a94d
8829c2d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# file: app.py
import gradio as gr
import time

# Đảm bảo import đúng các hàm cần thiết từ rag_pipeline
from rag_pipeline import initialize_components, generate_response

# --- KHỞI TẠO CÁC THÀNH PHẦN (CHỈ CHẠY 1 LẦN KHI ỨNG DỤNG START) ---
start_time = time.time()
print("Bắt đầu khởi tạo ứng dụng Chatbot Luật Giao thông...")
# Đường dẫn đến file dữ liệu của bạn
DATA_PATH = "data/luat_chi_tiet_output_openai_sdk_final_cleaned.json" 
# Hàm này sẽ tải models, dữ liệu, và tạo index.
COMPONENTS = initialize_components(DATA_PATH)
end_time = time.time()
print(f"✅ Ứng dụng đã sẵn sàng! Thời gian khởi tạo: {end_time - start_time:.2f} giây.")
# ----------------------------------------------------


# --- GIAO DIỆN GRADIO ---
with gr.Blocks(theme=gr.themes.Soft(), title="Chatbot Luật Giao thông Việt Nam") as demo:
    gr.Markdown(
        """
        # ⚖️ Chatbot Luật Giao thông Việt Nam (Multi-turn)
        Hỏi đáp về các quy định, mức phạt trong luật giao thông đường bộ. Chatbot có thể hiểu các câu hỏi nối tiếp.
        *Lưu ý: Đây là một sản phẩm demo. Thông tin chỉ mang tính chất tham khảo.*
        """
    )
    
    # Sử dụng gr.Chatbot để quản lý và hiển thị lịch sử trò chuyện
    chatbot = gr.Chatbot(label="Cuộc trò chuyện", height=500)
    # Textbox để người dùng nhập câu hỏi
    msg = gr.Textbox(label="Nhập câu hỏi của bạn", placeholder="Ví dụ: Vượt đèn đỏ bị phạt bao nhiêu tiền?")
    # Nút để xóa cuộc trò chuyện
    clear = gr.ClearButton([msg, chatbot])

    def respond(message, chat_history):
        """
        Hàm xử lý logic cho mỗi lượt chat.
        'message' là tin nhắn mới nhất của người dùng.
        'chat_history' là danh sách các cặp [tin nhắn cũ, trả lời cũ] do Gradio quản lý.
        """
        print(f"Nhận được câu hỏi: '{message}'")
        print(f"Lịch sử trò chuyện hiện tại: {chat_history}")
        
        # Gọi thẳng hàm generate_response với các tham số cần thiết:
        # 1. message: câu hỏi mới
        # 2. chat_history: lịch sử trò chuyện
        # 3. COMPONENTS: dictionary chứa các model và dữ liệu đã được khởi tạo
        bot_message = generate_response(message, chat_history, COMPONENTS)
        
        # Cập nhật lịch sử để hiển thị trên giao diện
        chat_history.append((message, bot_message))
        
        # Trả về chuỗi rỗng để xóa nội dung trong textbox và lịch sử đã được cập nhật
        return "", chat_history

    # Thiết lập sự kiện: khi người dùng 'submit' (nhấn Enter) trong textbox 'msg',
    # hàm 'respond' sẽ được gọi.
    # - Inputs: nội dung từ 'msg' và 'chatbot' (lịch sử).
    # - Outputs: cập nhật lại nội dung cho 'msg' (thành rỗng) và 'chatbot' (lịch sử mới).
    msg.submit(respond, [msg, chatbot], [msg, chatbot])

    # Thêm một vài ví dụ để người dùng dễ bắt đầu
    gr.Examples(
        examples=[
            "Phương tiện giao thông đường bộ gồm những loại nào?",
            "Vượt đèn đỏ phạt bao nhiêu tiền đối với xe máy?",
            "Nồng độ cồn cho phép khi lái xe ô tô là bao nhiêu?",
            "Đi sai làn đường bị trừ mấy điểm bằng lái?",
        ],
        inputs=msg
    )

# Chạy ứng dụng
if __name__ == "__main__":
    demo.launch()