共计 2881 个字符,预计需要花费 8 分钟才能阅读完成。
背景痛点
在线认证考试系统通常面临几个核心挑战:

- 动态题库需求 :传统静态题库容易被破解,需要根据考生信息实时生成差异化试题
- 实时评分压力 :人工阅卷在规模化考试中效率低下,需要 AI 快速评估主观题答案
- 防作弊机制 :需要识别代考、答案雷同等异常行为,传统规则引擎难以覆盖复杂场景
技术选型
对比主流大模型在考试场景的表现:
| 模型 | 平均响应延迟 | 知识准确性 | 长文本处理 |
|---|---|---|---|
| Qwen2-72B-Instruct | 1.8s | 92% | 支持 32k |
| GPT-4 | 2.4s | 95% | 128k |
| Claude 3 | 3.1s | 89% | 200k |
| LLaMA3-70B | 2.9s | 87% | 8k |
选择 Qwen2 的核心优势:
- 中文专业术语理解优于国际模型
- 支持 system prompt 精确控制输出格式
- 单位 token 成本比 GPT- 4 低 60%
Workflow 设计
核心流程
flowchart TD
A[考生 JWT 验证] --> B[查询考生档案]
B --> C{题库类型?}
C -->| 理论 | D[调用 Qwen2 生成选择题]
C -->| 实操 | E[生成案例分析题]
D --> F[返回 BASE64 编码试题]
E --> F
F --> G[考生作答]
G --> H[调用 Qwen2 评估]
H --> I[记录审计日志]
智能组题实现
from qwen_agent.agents import Assistant
from tenacity import retry, stop_after_attempt
@retry(stop=stop_after_attempt(3))
async def generate_question(
exam_type: str,
difficulty: int,
knowledge_points: list[str]
) -> dict:
"""
使用 Qwen2 动态生成考试题目
:param exam_type: 题型如 'mcq'(选择题)/'case'
:param difficulty: 1- 5 难度级别
:param knowledge_points: 关联知识点列表
:return: 包含题目、选项、标准答案的 dict
"""
agent = Assistant(
model='qwen2-72b-instruct',
system_prompt=f"""
你是一个专业认证考试出题系统,请根据要求生成题目:1. 题型:{exam_type}
2. 难度:{difficulty}
3. 知识点:{','.join(knowledge_points)}
4. 输出 JSON 格式:{"question":"","options":[],"answer":""}
""",
temperature=0.3 # 控制输出稳定性
)
try:
response = await agent.run()
return validate_question(json.loads(response))
except json.JSONDecodeError:
raise ValueError("模型返回格式异常")
# 示例调用
question = await generate_question(
exam_type="mcq",
difficulty=3,
knowledge_points=["网络安全", "加密算法"]
)
生产级优化
缓存策略
from datetime import timedelta
from redis import Redis
QUESTION_CACHE = Redis(host='cache.redis', db=1)
def get_cache_key(params: dict) -> str:
"""生成题库缓存键"""
return f"exam:{hash(frozenset(params.items()))}"
async def get_cached_question(params: dict) -> dict | None:
key = get_cache_key(params)
if cached := QUESTION_CACHE.get(key):
return json.loads(cached)
question = await generate_question(**params)
QUESTION_CACHE.setex(
key,
timedelta(hours=6),
json.dumps(question)
)
return question
安全防护
-
JWT 验证中间件 :
from fastapi import Depends, HTTPException async def verify_token(token: str = Header(...)) -> dict: try: return jwt.decode(token, SECRET_KEY, algorithms=["HS256"]) except jwt.PyJWTError: raise HTTPException(403, "无效凭证") -
内容过滤 :
BANNED_WORDS = ["答案", "作弊", "代考"] def sanitize_answer(text: str) -> str: for word in BANNED_WORDS: if word in text: raise ValueError("包含违规内容") return text
避坑指南
模型输出不稳定
- 设置 temperature=0.3:平衡创造力和稳定性
- 输出格式校验 :
def validate_question(data: dict) -> dict: if not all(k in data for k in ("question", "options", "answer")): raise ValueError("缺失必要字段") if len(data["options"]) !=4 and data.get("type")=="mcq": raise ValueError("选择题需 4 个选项") return data - 备选题库 :当连续 3 次生成失败时,切换预置题库
幂等性设计
CREATE TABLE exam_records (id VARCHAR(36) PRIMARY KEY,
user_id VARCHAR(32) NOT NULL,
question_hash CHAR(64) NOT NULL,
answer TEXT,
score DECIMAL(3,1),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY idx_user_question (user_id, question_hash)
) ENGINE=InnoDB;
延伸思考
建议后续通过 RAG 增强专业领域能力:
- 使用 LlamaIndex 构建专业文档向量库
- 在生成题目时检索相关技术白皮书
- 将检索结果作为 context 注入 system prompt
示例改进后的 prompt 模板:
根据以下技术文档和考生信息生成题目:--- 文档开始 ---
{retrieved_context}
--- 文档结束 ---
考生级别:{level}
需要覆盖:{knowledge_points}
通过实际测试,采用 Qwen2+Workflow 的方案使组题速度从平均 5 秒提升到 2 秒以内,同时错误率从 15% 降至 3% 以下。这套架构特别适合需要快速迭代题库的认证场景。
正文完
