092_agent_api / quiz.py
anhkhoiphan's picture
Thêm logic và prompt luồng tạo quiz
caedafc
Raw
History Blame Contribute Delete
1.98 kB
"""
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()