exam-generator
# 中国中小学试卷生成器
专业试卷生成工具,支持中国中小学各学科,遵循官方课程标准,确保试题准确性。
## Features
- 📚 **全学科支持**: 语文、数学、英语、物理、化学、生物、历史、地理、政治
- 📊 **多种题型**: 选择题、填空题、判断题、简答题、计算题、作文题
- 🎯 **精准出题**: 根据知识点和难度要求生成
- 🌐 **联网验证**: 使用web search获取最新知识和标准答案
- 📐 **专业排版**: 标准试卷格式,可直接打印
- ✅ **答案准确**: 交叉验证确保答案正确
## 支持的学科
| 学科 | 年级 | 题型 |
|------|------|------|
| 语文 | 小学/初中 | 选择、填空、阅读、作文 |
| 数学 | 小学/初中 | 选择、填空、计算、应用 |
| 英语 | 小学/初中 | 选择、填空、阅读、写作 |
| 物理 | 初中 | 选择、填空、实验、计算 |
| 化学 | 初中 | 选择、填空、实验、计算 |
| 生物 | 初中 | 选择、填空、简答 |
| 历史 | 初中 | 选择、填空、简答 |
| 地理 | 初中 | 选择、填空、读图 |
| 政治 | 初中 | 选择、填空、简答 |
## Trigger Conditions
- "生成一份试卷" / "Create an exam"
- "出一套数学题" / "Generate math problems"
- "帮我出英语试卷" / "Create English test"
- "根据知识点出题" / "Generate questions for topics"
- "exam-generator"
---
## Step 1: 理解用户需求
```
请提供以下信息:
学科:语文/数学/英语/物理/化学...
年级:小学X年级/初中X年级
知识点:具体要考察的知识点
题型:选择题/填空题/简答题...
题量:各题型数量
难度:简单/中等/困难
时间:考试时长(分钟)
```
---
## Step 2: 获取最新知识(联网验证)
使用web-search skill获取准确的知识点和标准答案:
```
Agent自动调用web-search skill搜索:
- 学科知识点
- 标准答案
- 官方课程标准
```
### 知识验证流程
```
生成试题
↓
搜索标准答案
↓
交叉验证
↓
标记置信度
↓
输出试题
```
---
## Step 3: 生成试卷
### Python代码示例
```python
import os
from datetime import datetime
class ExamGenerator:
def __init__(self, subject, grade, title='考试试卷'):
self.subject = subject
self.grade = grade
self.title = title
self.questions = []
self.answers = []
def add_choice_question(self, question, options, answer, score=2):
"""添加选择题"""
self.questions.append({
'type': 'choice',
'question': question,
'options': options,
'score': score
})
self.answers.append({
'type': 'choice',
'answer': answer,
'score': score
})
def add_fill_blank(self, question, answer, score=2):
"""添加填空题"""
self.questions.append({
'type': 'fill',
'question': question,
'score': score
})
self.answers.append({
'type': 'fill',
'answer': answer,
'score': score
})
def add_true_false(self, question, answer, score=1):
"""添加判断题"""
self.questions.append({
'type': 'true_false',
'question': question,
'score': score
})
self.answers.append({
'type': 'true_false',
'answer': answer,
'score': score
})
def add_short_answer(self, question, answer, score=10):
"""添加简答题"""
self.questions.append({
'type': 'short_answer',
'question': question,
'score': score
})
self.answers.append({
'type': 'short_answer',
'answer': answer,
'score': score
})
def add_calculation(self, question, answer, score=15):
"""添加计算题"""
self.questions.append({
'type': 'calculation',
'question': question,
'score': score
})
self.answers.append({
'type': 'calculation',
'answer': answer,
'score': score
})
def add_essay(self, question, requirements, score=30):
"""添加作文题"""
self.questions.append({
'type': 'essay',
'question': question,
'requirements': requirements,
'score': score
})
self.answers.append({
'type': 'essay',
'answer': '见评分标准',
'score': score
})
def generate_exam(self, lang='zh'):
"""生成试卷"""
total_score = sum(q['score'] for q in self.questions)
if lang == 'zh':
return self._generate_chinese(total_score)
else:
return self._generate_english(total_score)
def _generate_chinese(self, total_score):
"""生成中文试卷"""
output = []
output.append(f'┌{"─"*60}┐')
output.append(f'│ {self.title}')
output.append(f'│ {self.subject} · {self.grade}')
output.append(f'│ 考试时间:90分钟 · 满分:{total_score}分')
output.append(f'└{"─"*60}┘')
output.append('')
output.append('姓名:__________ 班级:__________ 学号:__________')
output.append('')
choice_num = 1
fill_num = 1
tf_num = 1
other_num = 1
for q in self.questions:
if q['type'] == 'choice':
output.append(f'一、选择题(每题{q["score"]}分)')
output.append('')
output.append(f'{choice_num}. {q["question"]}')
for i, opt in enumerate(q['options']):
output.append(f' {chr(65+i)}. {opt}')
output.append('')
choice_num += 1
elif q['type'] == 'fill':
output.append(f'二、填空题(每空{q["score"]}分)')
output.append('')
output.append(f'{fill_num}. {q["question"]}')
output.append(' 答案:__________')
output.append('')
fill_num += 1
elif q['type'] == 'true_false':
output.append(f'三、判断题(每题{q["score"]}分)')
output.append('')
output.append(f'{tf_num}. {q["question"]} ( )')
output.append('')
tf_num += 1
elif q['type'] == 'short_answer':
output.append(f'四、简答题(每题{q["score"]}分)')
output.append('')
output.append(f'{other_num}. {q["question"]}')
output.append('')
output.append('')
output.append('')
other_num += 1
elif q['type'] == 'calculation':
output.append(f'五、计算题(每题{q["score"]}分)')
output.append('')
output.append(f'{other_num}. {q["question"]}')
output.append('')
output.append('')
output.append('')
other_num += 1
elif q['type'] == 'essay':
output.append(f'六、作文({q["score"]}分)')
output.append('')
output.append(f'{q["question"]}')
output.append(f'要求:{q.get("requirements", "")}')
output.append('')
output.append('')
output.append('')
return '\n'.join(output)
def generate_answer_sheet(self, lang='zh'):
"""生成答案"""
output = []
output.append(f'{"="*60}')
output.append(f'{self.title} - 参考答案')
output.append(f'{"="*60}')
output.append('')
for i, a in enumerate(self.answers, 1):
output.append(f'{i}. {a["answer"]} ({a["score"]}分)')
return '\n'.join(output)
def save(self, output_dir):
"""保存试卷和答案(Word格式)"""
from docx import Document
from docx.shared import Pt, Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
os.makedirs(output_dir, exist_ok=True)
# 生成试卷Word文档
doc = Document()
# 设置页面
section = doc.sections[0]
section.top_margin = Cm(2.54)
section.bottom_margin = Cm(2.54)
section.left_margin = Cm(2.54)
section.right_margin = Cm(2.54)
# 生成内容
exam_text = self.generate_exam()
for line in exam_text.split('\n'):
if line.strip():
if '═' in line or '─' in line:
doc.add_paragraph(line)
elif line.startswith('一、') or line.startswith('二、') or line.startswith('三、'):
doc.add_heading(line, level=2)
elif line.startswith('1.') or line.startswith('2.') or line.startswith('3.'):
doc.add_paragraph(line)
else:
doc.add_paragraph(line)
exam_path = os.path.join(output_dir, 'exam.docx')
doc.save(exam_path)
# 生成答案Word文档
doc_answer = Document()
answer_text = self.generate_answer_sheet()
for line in answer_text.split('\n'):
if line.strip():
doc_answer.add_paragraph(line)
answer_path = os.path.join(output_dir, 'answer.docx')
doc_answer.save(answer_path)
return exam_path, answer_path
# 使用示例
exam = ExamGenerator('数学', '初中一年级', '2026年春季期中考试')
exam.add_choice_question('下列哪个是质数?', ['4', '6', '7', '9'], 'C', 2)
exam.add_fill_blank('12的平方根是____', '±2√3', 2)
exam.add_true_false('0是最小的自然数', '×', 1)
exam.add_calculation('计算:2x + 5 = 13,求x的值', 'x = 4', 10)
exam.save('/path/to/output')
```
---
## 试卷格式标准
### 试卷结构
```
┌─────────────────────────────────────────────────────────┐
│ 2026年春季期中考试 │
│ 数学 · 初中一年级 │
│ 考试时间:90分钟 · 满分:100分 │
└─────────────────────────────────────────────────────────┘
姓名:__________ 班级:__________ 学号:__________
一、选择题(每题2分,共20分)
1. 下列哪个是质数?
A. 4 B. 6 C. 7 D. 9
二、填空题(每题2分,共20分)
1. 12的平方根是__________
三、计算题(共60分)
1. 解方程:2x + 5 = 13(10分)
```
---
## 使用示例
### 生成数学试卷
```
User: "帮我出一套初中一年级数学试卷,5道选择题,5道填空题,2道计算题"
Agent:
1. 搜索初中数学知识点
2. 生成试题
3. 验证答案
4. 排版输出
```
### 生成语文试卷
```
User: "生成一份小学三年级语文试卷,包含阅读理解"
Agent:
1. 搜索小学语文课程标准
2. 选择合适的阅读材料
3. 生成题目
4. 输出试卷
```
---
## 试题准确性保证
### 验证流程
```
生成试题
↓
搜索标准答案
↓
多源交叉验证
↓
标记置信度
↓
输出试题+答案
```
### 置信度标记
- ✅ 高置信度:多源验证一致
- ⚠️ 中置信度:单源验证
- ❌ 低置信度:需要人工确认
---
## Notes
- 使用web search获取最新知识
- 答案经过交叉验证
- 支持中英文输出
- 可直接打印
标签
skill
ai