Spaces:
Sleeping
Sleeping
| """ | |
| Quiz generation — tạo câu hỏi trắc nghiệm từ nội dung bài giảng. | |
| Gọi trực tiếp LLM, không qua Orchestrator hay LangGraph. | |
| """ | |
| from langchain_core.messages import HumanMessage, SystemMessage | |
| from src.llm import llm | |
| _SYSTEM = """\ | |
| 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. | |
| 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. | |
| """ | |
| _HUMAN = """\ | |
| [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: | |
| {context} | |
| YÊU CẦU: | |
| 1. Tạo đúng {k_question} câu hỏi, mỗi câu 4 đáp án (A, B, C, D) | |
| 2. Phân bổ độ khó: ~30% easy, ~50% medium, ~20% hard | |
| 3. Mỗi câu có giải thích ngắn cho đáp án đúng | |
| 4. Phân loại theo chủ đề trong bài giảng | |
| OUTPUT — chỉ JSON theo format: | |
| {{ | |
| "title": "Quiz - Tên bài giảng", | |
| "description": "Mô tả ngắn", | |
| "passing_score": 60, | |
| "questions": [ | |
| {{ | |
| "order": 1, | |
| "topic": "Chủ đề", | |
| "difficulty": "easy", | |
| "question_text": "Nội dung câu hỏi?", | |
| "options": [ | |
| {{"id": "a", "text": "Đáp án A"}}, | |
| {{"id": "b", "text": "Đáp án B"}}, | |
| {{"id": "c", "text": "Đáp án C"}}, | |
| {{"id": "d", "text": "Đáp án D"}} | |
| ], | |
| "correct_answer": "b", | |
| "explanation": "Giải thích ngắn" | |
| }} | |
| ] | |
| }} | |
| """ | |
| def generate_quiz(content: str, k_question: int = 10) -> str: | |
| """ | |
| Tạo quiz trắc nghiệm từ nội dung bài giảng. | |
| Trả về JSON string. Caller chịu trách nhiệm parse. | |
| """ | |
| messages = [ | |
| SystemMessage(content=_SYSTEM), | |
| HumanMessage(content=_HUMAN.format(k_question=k_question, context=content)), | |
| ] | |
| raw = llm.invoke(messages).content.strip() | |
| if raw.startswith("```"): | |
| raw = raw.split("\n", 1)[-1] | |
| raw = raw.rsplit("```", 1)[0] | |
| return raw.strip() | |