Spaces:
Sleeping
Sleeping
Commit ·
caedafc
1
Parent(s): c34b712
Thêm logic và prompt luồng tạo quiz
Browse files
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()
|