基于前面已经开发好的刷题功能前后端,本周主要实现了利用ai生成相似题的功能。

一、功能目的

在已完成的408考研刷题系统基础上,集成智谱AI大模型,实现根据当前题目自动生成相似选择题的功能,以丰富专项刷题模块的练习资源,提升学习效果。

二、技术原理

1.大模型选择:选用智谱AI的 GLM-4-Flash-250414 模型

2.提示词选用

生成相似题的核心在于设计高质量的提示词,主要包含以下要素:

  • 角色设定:扮演408考研出题老师
  • 输入信息:原题内容、选项、正确答案、知识点、题型
  • 输出约束:明确指定输出JSON数组格式,包含 content(题目内容)、options(四个选项)、answer(正确答案)、analysis(解析)、knowledge_point(知识点)
  • 内容要求:保持相同题型、相同知识点、相同难度,不得与原题重复

3.异步与异常处理

AI API调用具有不确定性(网络延迟、模型限流、输出格式错误等)。后端做了两重保障:

  • 超时控制:设置30秒超时,避免长期阻塞。
  • 降级策略:若AI调用失败或返回JSON解析失败,则返回基于知识点的数据库相似题(_fallback_similar_questions),保证用户体验不中断。

三、功能实现

1.整体架构

系统规划采用“前端请求 → 后端代理 → AI API”三层结构:

  • 前端:用户提交答案后,点击“AI生成相似题”按钮,携带当前题目ID发起HTTP请求。
  • 后端:接收到请求后,从MySQL数据库查询原题的完整信息(题干、选项、标准答案、知识点等),构造特定的提示词,调用智谱AI的对话补全接口。
  • AI服务:GLM-4-Flash-250414模型根据提示词生成指定数量、符合格式要求的相似题(JSON数组),返回给后端。
  • 后端解析:将AI返回的文本解析为Python对象,进行格式校验和补全,最后返回给前端。
  • 前端展示:相似题列表显示在卡片底部,点击任意题目可弹窗进行独立练习(用户选择选项、提交、获得批改结果)。

2.后端设计

  • 采用服务分层设计:
  • AI服务层 (ai_service.py):封装智谱SDK,提供 generate_similar_questions 方法。
    def generate_similar_questions(self, original_question, count):
            prompt = self._build_prompt(original_question, count)
            response = self.client.chat.completions.create(
                model="GLM-4-Flash-250414",
                messages=[{"role": "user", "content": prompt}],
                response_format={"type": "json_object"}
            )
            return self._parse_response(response)
  • API层 (practice_api.py):新增 /ai/similar-questions 路由,接收题目ID和生成数量,调用AI服务并返回结果。
  • 依赖注入:通过FastAPI的 Depends 将AI服务注入路由,便于测试和替换。

2.前端交互

在 QuestionCard.vue 组件中:

  • 用户提交答案后,显示“AI生成相似题”按钮。
  • 点击后发起异步请求,显示loading状态。
  • 收到响应后,将生成的题目列表渲染在卡片下方。
  • 点击题目支持做题并ai批改生成解析。

因为生成的相似题是AI生成且都为选择题,所以决定采用前端模拟批改:前端根据标准答案判断正确性,解析直接使用AI返回的analysis。

// 打开相似题弹窗
const openSimilarQuestionDialog = (question) => {
  currentSimilarQuestion.value = question
  // 重置弹窗内的答题状态
  similarUserAnswer.value = ''
  similarSubmitted.value = false
  similarResult.value = null
  similarDialogVisible.value = true
}

// 提交相似题答案(前端判卷)
const submitSimilarAnswer = () => {
  if (!similarUserAnswer.value) {
    ElMessage.warning('请选择一个选项')
    return
  }
  const correctAnswer = currentSimilarQuestion.value.answer
  const isCorrect = (similarUserAnswer.value === correctAnswer)
  const fullScore = 2
  const score = isCorrect ? fullScore : 0

  similarResult.value = {
    is_correct: isCorrect,
    score: score,
    full_score: fullScore,
    correct_answer: correctAnswer,
    analysis: currentSimilarQuestion.value.analysis || '暂无解析'
  }
  similarSubmitted.value = true
}

四、测试

经实际运行,用户在点击“AI生成相似题”按钮后通常响应时间有5秒左右,耗时较长、等待感受明显。但整体运行顺畅,能够实现根据卡片题目生成相似题,且知识点、题型重合度较高。后期可针对响应时间较长这一问题进行优化。

五、后续计划

实现对收藏题目的数据统计与分析,根据收藏题目的科目、知识点生成数据统计与分析图表。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐