feat(exam_pkg): 优化出题系统稳定性与推理模型适配

- core/llm_utils: MiMo模型自动注入thinking=disabled参数,全局生效
- config: 新增LLM_DISABLE_THINKING配置项(默认true)
- generator: 推理模型自适应max_tokens(1.5x)、429限流重试+指数退避、v2管线补题机制
- generator: analyze_document_for_exam新增max_total参数控制AI出题上限
- generator: validate_questions_schema兼容type和question_type字段
- grader: 主观题max_tokens从1000提升至2000、fuzzy_match增加编辑距离容错
- manager: results变量初始化防NameError、透传max_total参数
- api: /exam/generate-smart支持max_total请求参数
This commit is contained in:
lacerate551
2026-06-22 18:51:11 +08:00
parent b966be5417
commit a31ee4bba0
8 changed files with 475 additions and 75 deletions

View File

@@ -138,19 +138,22 @@
#### 4a. 去重
`_deduplicate_questions(questions, exclude_stems)`层去重:
`_deduplicate_questions(questions, exclude_stems)`层去重:
1. **题干前缀去重**:题干前 80 字相同 → 去掉。
2. **知识点+题型去重**:题干前 30 字 + 题型相同 → 去掉
3. **跨调用去重**`exclude_stems` 中已有题目的题干前 80 字预填入去重集合,新生成的题目如果与之冲突也会被过滤
2. **跨调用排除**`_matches_exclude``exclude_stems` 中已有题目的前缀≤30 字),新题干前 30 字如果以此为前缀 → 去掉。用 `startswith()` 匹配,解决排除题干短于 30 字时的长度不匹配问题
3. **知识点+题型去重**:题干前 30 字 + 题型相同 → 去掉
4. **跨调用题干去重**`exclude_stems` 中已有题目的题干前 80 字预填入去重集合,精确匹配过滤。
#### 4b. 题型平衡
`_balance_question_types(questions, target_types)` — 按题型分组,每种题型按目标数量截取(多了截断)。
#### 4c. 补题(仅 v1 结构化路径)
#### 4c. 补题
v1 的 `generate_questions_structured()` 有补题机制 `_makeup_questions()`:如果某题型数量不足,用前 5 个 chunks 重新出一轮补充。v2 路径依赖分配阶段的精确控制,不额外补题。
v1 的 `generate_questions_structured()` 有补题机制 `_makeup_questions()`:如果某题型数量不足,用前 5 个 chunks 重新出一轮补充。
v2 路径(`generate_questions_structured_v2`同样支持补题Phase 4.4 检查各题型是否达到目标数量,不足的题型调用 `_makeup_questions()` 补充,补题结果也经过去重处理。
---
@@ -272,7 +275,7 @@ v1 的 `generate_questions_structured()` 有补题机制 `_makeup_questions()`
| `safe_parse_questions` | generator.py | JSON 安全解析 |
| `validate_questions_schema` | generator.py | 题目 Schema 校验 |
| `_enrich_with_source_trace` | generator.py | 补充溯源信息 |
| `_deduplicate_questions` | generator.py | 层去重 |
| `_deduplicate_questions` | generator.py | 层去重 |
| `_balance_question_types` | generator.py | 题型数量平衡 |
| `_generate_questions_fallback` | generator.py | 降级路径(无知识点时) |
| `_makeup_questions` | generator.py | v1 补题机制 |