quiz_generator.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. # specialist/quiz_generator.py
  2. """测验生成器 - 根据学习计划生成测验题"""
  3. import json
  4. from typing import List, Union
  5. from hello_agents import HelloAgentsLLM
  6. class QuizGeneratorAgent:
  7. """
  8. 测验生成 Agent
  9. 功能:
  10. - 基于学习计划生成问题
  11. - 支持不同难度级别(easy/medium/hard 或 0.0-1.0)
  12. - 生成单个或多个问题
  13. """
  14. def __init__(self, llm: HelloAgentsLLM):
  15. """
  16. 初始化 QuizGeneratorAgent
  17. Args:
  18. llm: HelloAgentsLLM 实例
  19. """
  20. self.llm = llm
  21. def generate_question(
  22. self, plan: str, difficulty: Union[str, float] = "medium"
  23. ) -> str:
  24. """
  25. 生成单个问题
  26. Args:
  27. plan: 学习计划内容
  28. difficulty: 难度级别
  29. - str: "easy", "medium", "hard"
  30. - float: 0.0-1.0(0.0=最简单,1.0=最难)
  31. Returns:
  32. 生成的问题文本
  33. """
  34. # 转换难度级别
  35. difficulty_level = self._normalize_difficulty(difficulty)
  36. # 构建提示词
  37. user_prompt = f"""请基于以下学习计划,生成一个{difficulty_level}难度的问题:
  38. 【学习计划】
  39. {plan[:2000]}
  40. 要求:
  41. 1. 问题应该清晰、具体
  42. 2. 难度符合 {difficulty_level} 级别
  43. 3. 直接返回问题,不需要额外说明
  44. """
  45. messages = [
  46. {
  47. "role": "system",
  48. "content": "你是一个教育专家,擅长根据学习内容生成合适的测验问题。",
  49. },
  50. {"role": "user", "content": user_prompt},
  51. ]
  52. try:
  53. response = self.llm.invoke(messages)
  54. return response.strip()
  55. except Exception as e:
  56. # 降级:返回默认问题
  57. return f"请简要描述你从学习计划中学到的核心内容(难度:{difficulty_level})"
  58. def generate_questions(
  59. self,
  60. plan: str,
  61. count: int = 3,
  62. difficulty: Union[str, float] = "medium",
  63. ) -> List[str]:
  64. """
  65. 生成多个问题
  66. Args:
  67. plan: 学习计划内容
  68. count: 问题数量
  69. difficulty: 难度级别
  70. Returns:
  71. 问题列表
  72. """
  73. questions = []
  74. for i in range(count):
  75. # 稍微调整每个问题的难度,增加多样性
  76. if isinstance(difficulty, float):
  77. # 在基础难度上浮动 ±0.1
  78. adjusted_difficulty = max(0.0, min(1.0, difficulty + (i - 1) * 0.1))
  79. else:
  80. adjusted_difficulty = difficulty
  81. question = self.generate_question(plan, adjusted_difficulty)
  82. questions.append(question)
  83. return questions
  84. def _normalize_difficulty(self, difficulty: Union[str, float]) -> str:
  85. """
  86. 标准化难度级别
  87. Args:
  88. difficulty: 难度(str 或 float)
  89. Returns:
  90. 标准化的难度描述
  91. """
  92. if isinstance(difficulty, float):
  93. if difficulty < 0.3:
  94. return "简单"
  95. elif difficulty < 0.7:
  96. return "中等"
  97. else:
  98. return "困难"
  99. else:
  100. # 映射字符串到中文
  101. mapping = {
  102. "easy": "简单",
  103. "medium": "中等",
  104. "hard": "困难",
  105. }
  106. return mapping.get(difficulty.lower(), "中等")