anhkhoiphan commited on
Commit
caedafc
·
1 Parent(s): c34b712

Thêm logic và prompt luồng tạo quiz

Browse files
Files changed (1) hide show
  1. quiz.py +64 -0
quiz.py ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Quiz generation — tạo câu hỏi trắc nghiệm từ nội dung bài giảng.
3
+ Gọi trực tiếp LLM, không qua Orchestrator hay LangGraph.
4
+ """
5
+
6
+ from langchain_core.messages import HumanMessage, SystemMessage
7
+
8
+ from src.llm import llm
9
+
10
+ _SYSTEM = """\
11
+ Bạn là chuyên gia tạo câu hỏi trắc nghiệm và quiz dựa trên bài giảng.
12
+ Chỉ trả về JSON hợp lệ. Tuyệt đối không thêm markdown, giải thích, hay bất kỳ text nào khác.
13
+ """
14
+
15
+ _HUMAN = """\
16
+ [NHIỆM VỤ] Tạo {k_question} câu hỏi trắc nghiệm ôn tập dựa trên bài giảng sau:
17
+
18
+ {context}
19
+
20
+ YÊU CẦU:
21
+ 1. Tạo đúng {k_question} câu hỏi, mỗi câu 4 đáp án (A, B, C, D)
22
+ 2. Phân bổ độ khó: ~30% easy, ~50% medium, ~20% hard
23
+ 3. Mỗi câu có giải thích ngắn cho đáp án đúng
24
+ 4. Phân loại theo chủ đề trong bài giảng
25
+
26
+ OUTPUT — chỉ JSON theo format:
27
+ {{
28
+ "title": "Quiz - Tên bài giảng",
29
+ "description": "Mô tả ngắn",
30
+ "passing_score": 60,
31
+ "questions": [
32
+ {{
33
+ "order": 1,
34
+ "topic": "Chủ đề",
35
+ "difficulty": "easy",
36
+ "question_text": "Nội dung câu hỏi?",
37
+ "options": [
38
+ {{"id": "a", "text": "Đáp án A"}},
39
+ {{"id": "b", "text": "Đáp án B"}},
40
+ {{"id": "c", "text": "Đáp án C"}},
41
+ {{"id": "d", "text": "Đáp án D"}}
42
+ ],
43
+ "correct_answer": "b",
44
+ "explanation": "Giải thích ngắn"
45
+ }}
46
+ ]
47
+ }}
48
+ """
49
+
50
+
51
+ def generate_quiz(content: str, k_question: int = 10) -> str:
52
+ """
53
+ Tạo quiz trắc nghiệm từ nội dung bài giảng.
54
+ Trả về JSON string. Caller chịu trách nhiệm parse.
55
+ """
56
+ messages = [
57
+ SystemMessage(content=_SYSTEM),
58
+ HumanMessage(content=_HUMAN.format(k_question=k_question, context=content)),
59
+ ]
60
+ raw = llm.invoke(messages).content.strip()
61
+ if raw.startswith("```"):
62
+ raw = raw.split("\n", 1)[-1]
63
+ raw = raw.rsplit("```", 1)[0]
64
+ return raw.strip()