test_exam_prompt.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import asyncio
  2. from pydantic import BaseModel, Field
  3. class QuestionTypeItem(BaseModel):
  4. questionType: str = ""
  5. name: str = ""
  6. count: int = 0
  7. questionCount: int = 0
  8. scorePerQuestion: int = 0
  9. romanNumeral: str = ""
  10. class BuildPromptRequest(BaseModel):
  11. mode: str = ""
  12. client: str = ""
  13. projectType: str = ""
  14. examTitle: str = ""
  15. totalScore: int = 0
  16. questionTypes: list[QuestionTypeItem] = Field(default_factory=list)
  17. pptContent: str = ""
  18. data = BuildPromptRequest(**{
  19. "mode": "ai",
  20. "client": "pc",
  21. "projectType": "bridge",
  22. "examTitle": "桥梁工程施工技术考核",
  23. "totalScore": 100,
  24. "questionTypes": [
  25. {
  26. "name": "单选题",
  27. "romanNumeral": "一",
  28. "questionCount": 20,
  29. "scorePerQuestion": 2
  30. },
  31. {
  32. "name": "判断题",
  33. "romanNumeral": "二",
  34. "questionCount": 10,
  35. "scorePerQuestion": 3
  36. }
  37. ],
  38. "pptContent": ""
  39. })
  40. question_desc = []
  41. total_count = 0
  42. for item in data.questionTypes:
  43. count = item.count or item.questionCount or 0
  44. score = item.scorePerQuestion or 0
  45. qtype = item.questionType or item.name or "未命名题型"
  46. total_count += count
  47. question_desc.append(f"{qtype}{count}道,每道{score}分")
  48. question_text = ";".join(question_desc) if question_desc else "题型未提供"
  49. question_schema_lines = []
  50. for item in data.questionTypes:
  51. count = item.count or item.questionCount or 0
  52. score = item.scorePerQuestion or 0
  53. qtype = item.questionType or item.name or "未命名题型"
  54. if count <= 0:
  55. continue
  56. question_schema_lines.append(f"- {qtype}: {count}道,每道{score}分")
  57. question_schema = "\n".join(
  58. question_schema_lines) if question_schema_lines else "- 未提供有效题型"
  59. ppt_content = (data.pptContent or "").strip()
  60. basis_requirement = ""
  61. if ppt_content:
  62. basis_requirement = (
  63. "出题依据内容是本次试卷的核心来源,所有题目必须围绕该内容中的知识点、术语、流程、规范要求和场景展开。\n"
  64. "如果出题依据内容中出现了章节、条款、培训主题或专业术语,题目必须优先考查这些内容,不能偏离到无关知识。\n"
  65. "单选题、多选题、判断题和简答题的题干、选项、答案解析都要与出题依据内容直接相关,不能泛泛而谈。\n"
  66. "请结合出题依据内容、工程类型和题型要求,生成有具体内容、具体选项、具体答案、具体解析的试卷。\n"
  67. )
  68. else:
  69. basis_requirement = (
  70. "请结合工程类型、考试标题和题型要求,运用路桥隧轨施工安全等专业知识,生成有具体内容、具体选项、具体答案、具体解析的高质量试卷。\n"
  71. "所有题目必须与考试标题紧密相关,不能泛泛而谈。\n"
  72. )
  73. prompt = (
  74. "请根据以下要求直接生成一份完整试卷,并严格返回纯 JSON,不要输出 markdown 代码块、解释说明或额外文字。\n"
  75. f"生成模式:{data.mode or '未指定'}\n"
  76. f"客户端:{data.client or '未指定'}\n"
  77. f"项目类型:{data.projectType or '未指定'}\n"
  78. f"考试标题:{data.examTitle or '未命名考试'}\n"
  79. f"总分:{data.totalScore or 0}\n"
  80. f"总题量:{total_count}\n"
  81. f"题型要求:{question_text}\n"
  82. f"出题依据内容:{ppt_content or '无'}\n"
  83. f"{basis_requirement}"
  84. "禁止输出“选项A”“题目1”“桥梁工程相关单选题1”“题目内容”“解析内容”这类占位内容,所有题目必须是可直接展示和作答的真实内容。\n"
  85. "下面的 JSON 结构示例只用于说明字段格式,示例中的字符串不能原样照抄到最终结果中,最终返回的每个字符串都必须替换成结合出题依据生成的具体内容。\n"
  86. "JSON 输出结构必须符合以下格式:\n"
  87. "{\n"
  88. ' "title": "试卷标题",\n'
  89. ' "totalScore": 100,\n'
  90. ' "totalQuestions": 10,\n'
  91. ' "singleChoice": {"scorePerQuestion": 2, "totalScore": 20, "count": 10, "questions": [{"text": "<单选题题干>", "options": [{"key": "A", "text": "<选项A具体内容>"}, {"key": "B", "text": "<选项B具体内容>"}, {"key": "C", "text": "<选项C具体内容>"}, {"key": "D", "text": "<选项D具体内容>"}], "answer": "A", "analysis": "<解析内容>"}]},\n'
  92. ' "judge": {"scorePerQuestion": 2, "totalScore": 0, "count": 0, "questions": [{"text": "<判断题题干>", "answer": "正确", "analysis": "<解析内容>"}]},\n'
  93. ' "multiple": {"scorePerQuestion": 3, "totalScore": 0, "count": 0, "questions": [{"text": "<多选题题干>", "options": [{"key": "A", "text": "<选项A具体内容>"}, {"key": "B", "text": "<选项B具体内容>"}, {"key": "C", "text": "<选项C具体内容>"}, {"key": "D", "text": "<选项D具体内容>"}], "answers": ["A", "C"], "analysis": "<解析内容>"}]},\n'
  94. ' "short": {"scorePerQuestion": 10, "totalScore": 0, "count": 0, "questions": [{"text": "<简答题题干>", "outline": {"keyFactors": "<答题要点>", "measures": "<参考措施>"}}]}\n'
  95. "}\n"
  96. "请按下面的题型配置生成对应数量的题目,没有的题型 count 返回 0、questions 返回空数组:\n"
  97. f"{question_schema}"
  98. )
  99. print(prompt)