File size: 3,080 Bytes
eebc8c1
 
 
 
fbcebb2
eebc8c1
 
fbcebb2
 
 
 
eebc8c1
 
 
fbcebb2
eebc8c1
 
 
 
 
 
fbcebb2
eebc8c1
fbcebb2
eebc8c1
fbcebb2
 
eebc8c1
fbcebb2
 
eebc8c1
fbcebb2
 
 
 
 
 
 
 
 
e4c309c
fbcebb2
 
eebc8c1
e4c309c
eebc8c1
e4c309c
 
eebc8c1
e4c309c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
eebc8c1
fbcebb2
 
 
e4c309c
 
fbcebb2
e4c309c
 
 
 
 
 
 
fbcebb2
e4c309c
eebc8c1
 
 
 
 
 
 
 
 
 
 
 
fbcebb2
 
 
 
 
eebc8c1
 
 
 
fbcebb2
 
eebc8c1
 
 
 
fbcebb2
e4c309c
 
 
 
 
 
eebc8c1
 
 
 
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import gradio as gr
from transformers import pipeline

# ========================
# Load models (tối ưu cho HF Free + đa ngôn ngữ)
# ========================

summarizer = pipeline(
    "summarization",
    model="csebuetnlp/mT5_multilingual_XLSum"
)

quiz_generator = pipeline(
    "text2text-generation",
    model="google/mt5-small"
)

# ========================
# AI Functions
# ========================

def summarize_and_quiz(text, num_questions):

    num_questions = int(num_questions)

    if not text or len(text) < 100:
        return "Văn bản quá ngắn. Hãy nhập ít nhất 100 ký tự.", ""

    # Cắt bớt để tránh quá giới hạn model
    text = text[:3000]

    # --- TÓM TẮT ---
    try:
        summary = summarizer(
            text,
            max_length=200,
            min_length=80,
            do_sample=False
        )[0]['summary_text']
    except:
        summary = "❌ Có lỗi xảy ra trong quá trình tóm tắt."

    # --- TẠO QUIZ ---
    prompt = f"""
Dựa trên nội dung sau, hãy tạo {num_questions} câu hỏi trắc nghiệm.

NỘI DUNG:
{summary}

YÊU CẦU:
1. Mỗi câu hỏi nằm trên 1 dòng riêng
2. Có 4 đáp án A, B, C, D
3. Phải ghi đáp án đúng ở cuối câu
4. Không sử dụng ký hiệu như <extra_id_0> hoặc <extra_id_1>
5. Viết cùng ngôn ngữ với nội dung (Việt/Anh)

Ví dụ:
1. Câu hỏi ...?
A. ...
B. ...
C. ...
D. ...
Đáp án: B

BẮT ĐẦU TẠO CÂU HỎI:
"""

    try:
        quiz = quiz_generator(
            prompt,
            max_length=512,
            do_sample=False
        )[0]["generated_text"]

        # Xoá hoàn toàn rác của T5
        quiz = quiz.replace("<extra_id_0>", "").replace("<extra_id_1>", "").strip()

        if len(quiz) < 30:
            quiz = "❌ Không tạo được câu hỏi phù hợp. Hãy thử lại với nội dung dài hơn."

    except:
        quiz = "❌ Có lỗi xảy ra trong quá trình tạo câu hỏi."

    return summary, quiz


# ========================
# Gradio Interface
# ========================

interface = gr.Interface(
    fn=summarize_and_quiz,

    inputs=[
        gr.Textbox(
            label="📄 Nhập văn bản (Tiếng Việt hoặc Tiếng Anh)",
            placeholder="Dán nội dung bài học / tài liệu / văn bản cần tóm tắt vào đây...",
            lines=15
        ),
        gr.Slider(5, 10, value=5, step=1, label="Số câu hỏi (Quiz)")
    ],

    outputs=[
        gr.Textbox(label="📌 Nội dung tóm tắt", lines=8),
        gr.Textbox(label="📝 Câu hỏi ôn tập (Quiz)", lines=12)
    ],

    title="📚 AI TÓM TẮT & TẠO QUIZ CHO SINH VIÊN",
    description="""
    ✅ Hỗ trợ: Tiếng Việt + Tiếng Anh  
    ✅ Đã fix lỗi: <extra_id_0>  
    ✅ Tóm tắt không mất ý chính  
    ✅ Tạo 5–10 câu hỏi trắc nghiệm tự động  
    ✅ Tối ưu chạy trên HuggingFace Free  

    👉 Chỉ cần dán nội dung vào và nhấn Submit.
    """
)

interface.launch()