用户可基于 AI 快速生成题目并制作应用,经管理员审核后,可在线答题并基于多种评分算法或 AI 得到回答总结;管理员还可集中管理整站内容,并进行统计分析。
基于 Spring Boot + Redis + ChatGLM AI + RxJava + SSE + Caffeine + Vue3 + Arco Design + Pinia 的 AI 答题应用平台。
- 用户注册 => 登录
- 用户创建应用 => 创建题目(包括题目选项得分)=> 创建评分规则(评分策略和评分结果)
- 管理员管理应用,审核发布(下架)应用
- 用户查看、检索应用列表,进入应用详情页,在线答题并提交回答
- 经过评分模块计算后,用户可查看本次评分结果
- 库表设计:根据业务设计用户 / 应用 / 题目 / 评分结果 / 用户答题表。其中题目表采用 JSON 存储复杂的嵌套题目和选项,便于维护扩展,并通过给题目表添加 appId 索引提升检索性能;
- 评分模块:基于策略模式实现了多种用户回答评分算法(如统计得分、AI 评分等),全局执行器会扫描策略类上的自定义注解并选取策略,相较于
if else提高了系统的可扩展性; - 基于 ChatGLM AI 封装了通用 AI 服务,并通过配置类自动读取 key 配置初始化 AI 客户端 Bean,便于全局使用;
- AI 生成题目:通过系统预设、少样本学习、任务拆解等手段优化 Prompt,让 AI 返回 JSON 题目内容,便于后端处理;
- 由于 AI 生成题目较慢,选用 ChatGLM 的流式 API 并通过 SSE 实时推送单道题目给前端,提高用户体验;
- 基于 RxJava 的操作符链式调用处理 AI 异步数据流,先通过 map 获取并处理字符串、filter 过滤空值、flatMap 映射串为单个字符,再通过括号平衡算法准确拼接出单道题目,使得逻辑简单清晰;
- 为防止用户多次提交重复答案,基于雪花算法为每次答题分配唯一 id,并通过数据库主键实现幂等设计,避免了重复的脏数据;
- 由于相同答案的 AI 评分应该相同,使用 Caffeine 本地缓存答案 Hash 对应的 AI 评分结果,提高评分性能(10s 到 5ms)的同时大幅节约成本;并通过 Redisson 分布式锁解决缓存击穿问题;
- 为应对用户答题数的增长,基于 Sharding JDBC 配置取模分片算法,根据应用 id 对用户答题记录分表,提高了单表查询性能和可扩展性;
- 由于服务器资源有限,为会员创建核心线程数更大的隔离线程池,保证普通用户不会影响会员使用 AI 的体验;
- 统计分析:后端基于 MyBatis xml 自定义 SQL 实现热门应用和回答分布的统计,前端通过 ECharts 实现可视化;
- 使用 Knife4j + Swagger 自动生成后端接口文档,并通过编写 ApiOperation 等注解补充接口注释,避免了人工编写维护文档的麻烦。


