AI智能答题系统设计与实现

基于Spring Cloud微服务架构的AI智能答题系统,集成了现代分布式技术栈与人工智能能力,为用户提供智能化的面试题练习与AI辅助答题服务。系统采用云原生架构设计,具备高可用、高并发、可扩展的特性。

系统概述

本系统是一个基于Spring Cloud微服务架构的AI智能答题平台,旨在为用户提供智能化的面试题练习服务。系统集成了OpenAI大语言模型、阿里云语音合成、分布式消息队列等先进技术,构建了完整的智能答题生态。

核心特性

  • 智能AI答题:集成OpenAI GPT模型,提供智能题目生成与答案评估
  • 多模态交互:支持文本、语音等多种交互方式
  • 分布式架构:基于Spring Cloud微服务架构,支持水平扩展
  • 云原生部署:集成Nacos配置中心、Redis缓存、MinIO对象存储
  • 智能审核:AI自动审核用户提交的题目内容

系统架构设计

整体架构图

graph TB
    %% 用户层
    subgraph "用户层"
        A[Web前端]
        B[移动端H5]
        C[微信小程序]
    end

    %% 网关层
    subgraph "网关层"
        D[Spring Cloud Gateway]
    end

    %% 业务服务层
    subgraph "业务服务层"
        subgraph "用户服务模块"
            E1[用户注册/登录]
            E2[用户信息管理]
            E3[权限控制]
        end
        
        subgraph "题库服务模块"
            F1[题目管理]
            F2[分类管理]
            F3[图片上传]
            F4[刷题记录]
        end
        
        subgraph "AI服务模块"
            G1[智能答题]
            G2[语音合成]
            G3[OpenAI集成]
        end
        
        subgraph "安全服务模块"
            H1[JWT认证]
            H2[权限校验]
            H3[安全控制]
        end
    end

    %% 基础设施层
    subgraph "基础设施层"
        subgraph "消息队列"
            I1[RabbitMQ]
        end
        
        subgraph "缓存服务"
            J1[Redis]
        end
        
        subgraph "文件存储"
            K1[MinIO]
        end
        
        subgraph "配置中心"
            L1[Nacos]
        end
        
        subgraph "数据库"
            M1[MySQL]
        end
    end

    %% 连接关系
    A --> D
    B --> D
    C --> D
    
    D --> E1
    D --> E2
    D --> E3
    D --> F1
    D --> F2
    D --> F3
    D --> F4
    D --> G1
    D --> G2
    D --> G3
    D --> H1
    D --> H2
    D --> H3

    E1 --> I1
    E2 --> J1
    E3 --> M1
    F1 --> M1
    F2 --> M1
    F3 --> K1
    F4 --> M1
    G1 --> I1
    G2 --> K1
    G3 --> I1
    H1 --> J1
    H2 --> M1
    H3 --> L1

    %% 样式
    classDef userLayer fill:#e1f5fe
    classDef gatewayLayer fill:#f3e5f5
    classDef serviceLayer fill:#e8f5e8
    classDef infraLayer fill:#fff3e0

    class A,B,C userLayer
    class D gatewayLayer
    class E1,E2,E3,F1,F2,F3,F4,G1,G2,G3,H1,H2,H3 serviceLayer
    class I1,J1,K1,L1,M1 infraLayer

技术栈选型

技术分类 技术选型 版本 作用说明
微服务框架 Spring Cloud 2023.0.0 微服务治理框架
服务注册发现 Nacos 2.2.0 服务注册与配置管理
网关服务 Spring Cloud Gateway 4.0.0 统一网关入口
数据库 MySQL 8.0 关系型数据库
缓存 Redis 7.0 分布式缓存
消息队列 RabbitMQ 3.11 异步消息处理
对象存储 MinIO 最新版 分布式文件存储
AI服务 OpenAI API GPT-4 大语言模型
语音合成 阿里云TTS 最新版 文本转语音
前端框架 Vue3 + TypeScript 3.3+ 现代化前端框架
移动端 uni-app 3.0+ 跨平台移动应用

核心模块实现

1. AI服务模块

AI服务模块是整个系统的核心,负责智能答题、语音合成等功能。

智能对话实现

@Service
@Slf4j
public class ModelServiceImpl implements ModelService {
    private final ChatClient chatClient;
    
    /**
     * 智能对话处理
     * 支持三种模式:系统模式、AI模式、混合模式
     */
    public Flux<String> chat(ChatDto chatDto) {
        // 记录AI使用统计
        recordAi(chatDto.getNickname());
        recordAiUser();
        
        // 根据模式分发处理
        if (chatDto.getModel().equals(AiConstant.SYSTEM_MODEL)) {
            return systemModel(chatDto);  // 系统题库模式
        } else if (chatDto.getModel().equals(AiConstant.AI_MODEL)) {
            return aiModel(chatDto);      // AI生成模式
        }
        return mixModel(chatDto);         // 混合模式
    }
    
    /**
     * 混合模式实现
     * 优先从系统题库获取,无则AI生成
     */
    private Flux<String> mixModel(ChatDto chatDto) {
        Long currentId = SecurityUtils.getCurrentId();
        String currentName = SecurityUtils.getCurrentName();
        AiHistory aiHistory = getCurrentHistory(chatDto);
        
        if (aiHistory == null) {
            // 首次对话,校验专题是否存在
            Long subjectId = disposeSystemModel(chatDto);
            if (subjectId == null) {
                return verifyPrompt(chatDto, null);  // AI生成
            }
            return sendRandomTopicToUser(chatDto);    // 系统题库
        } else {
            // 处理用户答案评估
            return processUserAnswer(chatDto, aiHistory);
        }
    }
}

语音合成实现

/**
 * 语音合成服务
 * 集成阿里云TTS,支持多种语音类型
 */
public ResponseEntity<byte[]> tts(TtsDto text) {
    recordAiUser();  // 记录使用统计
    
    // 构建语音合成参数
    SpeechSynthesisParam param = SpeechSynthesisParam.builder()
            .apiKey(ttsProperties.getApiKey())
            .model(ttsProperties.getModel())
            .voice(ttsProperties.getVoice())
            .build();
    
    // 执行语音合成
    SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, null);
    ByteBuffer audio = synthesizer.call(text.getText());
    byte[] audioBytes = audio.array();
    
    // 设置响应头
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    headers.set(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=output.mp3");
    
    return ResponseEntity.ok()
            .headers(headers)
            .body(audioBytes);
}

2. 题库服务模块

题库服务负责题目管理、分类管理、用户刷题记录等功能。

题目管理实现

@Data
public class Topic extends BaseEntity {
    private String topicName;      // 题目标题
    private String answer;         // 标准答案
    private String aiAnswer;       // AI生成答案
    private Integer sorted;        // 排序
    private Integer isEveryday;   // 是否每日一题
    private Integer isMember;     // 是否会员专享
    private Long viewCount;       // 浏览次数
    private Integer status;       // 状态
    private String createBy;      // 创建者
    private String failMsg;        // 失败原因
}

智能审核实现

/**
 * AI智能审核题目内容
 * 自动判断题目质量并生成AI答案
 */
public void auditTopic(TopicAudit topicAudit) {
    String topicName = topicAudit.getTopicName();
    String subjectName = topicAudit.getTopicSubjectName();
    String labelName = topicAudit.getTopicLabelName();
    String answer = topicAudit.getAnswer();
    
    // 构建审核提示词
    String prompt = PromptConstant.AUDIT_TOPIC + "\n" +
            "面试题名称: 【" + topicName + "】\n" +
            "用户输入的面试题答案: 【" + answer + "】\n" +
            "关联标签: 【" + labelName + "】\n" +
            "所属专题: 【" + subjectName + "】\n";
    
    // 调用AI审核
    String content = getAiContent(prompt, topicAudit.getAccount(), topicAudit.getUserId());
    
    // 解析AI返回结果
    JSONObject jsonObject = JSON.parseObject(content);
    boolean result = jsonObject.getBooleanValue("result");
    String reason = jsonObject.getString("reason");
    
    Topic topic = new Topic();
    topic.setId(topicAudit.getId());
    if (result) {
        topic.setStatus(StatusEnums.NORMAL.getCode());
        log.info("审核通过: {}", reason);
    } else {
        topic.setStatus(StatusEnums.AUDIT_FAIL.getCode());
        topic.setFailMsg(reason);
        log.warn("审核未通过: {}", reason);
    }
    
    // 更新题目状态
    topicFeignClient.auditTopic(topic);
    recordAuditLog(reason, topicAudit.getAccount(), topicAudit.getUserId());
}

3. 用户服务模块

用户服务负责用户认证、权限管理、用户信息维护等功能。

用户实体设计

@Data
public class SysUser extends BaseEntity {
    private String account;        // 账号
    private String avatar;         // 头像
    private String password;       // 密码
    private String email;         // 邮箱
    private Integer status;       // 状态
    private LocalDateTime memberTime;  // 会员时间
    private String nickname;      // 昵称
}

JWT认证实现

/**
 * 用户认证服务
 * 基于JWT实现无状态认证
 */
@Service
public class SecurityUserDetailsService implements UserDetailsService {
    
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 查询用户信息
        SysUser user = sysUserService.getByAccount(username);
        if (user == null) {
            throw new UsernameNotFoundException("用户不存在");
        }
        
        // 查询用户权限
        List<String> permissions = sysUserService.getPermissions(user.getId());
        
        // 构建用户详情
        return new SecurityUserDetails(user, permissions);
    }
}

4. 安全服务模块

安全服务提供统一的认证授权、权限校验等功能。

权限校验实现

/**
 * 权限校验切面
 * 基于注解实现方法级权限控制
 */
@Aspect
@Component
public class SecurityAspect {
    
    @Around("@annotation(RequirePermission)")
    public Object checkPermission(ProceedingJoinPoint joinPoint) throws Throwable {
        // 获取当前用户
        Long currentId = SecurityUtils.getCurrentId();
        String currentRole = SecurityUtils.getCurrentRole();
        
        // 校验权限
        if (!hasPermission(currentId, currentRole)) {
            throw new TopicException(ResultCodeEnum.PERMISSION_DENIED);
        }
        
        return joinPoint.proceed();
    }
}

数据库设计

核心表结构

用户相关表

-- 用户表
CREATE TABLE sys_user (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
    account VARCHAR(50) NOT NULL UNIQUE COMMENT '账号',
    password VARCHAR(255) NOT NULL COMMENT '密码',
    nickname VARCHAR(50) COMMENT '昵称',
    email VARCHAR(100) COMMENT '邮箱',
    avatar VARCHAR(255) COMMENT '头像URL',
    status TINYINT DEFAULT 1 COMMENT '状态',
    member_time DATETIME COMMENT '会员时间',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- 角色表
CREATE TABLE sys_role (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '角色ID',
    role_name VARCHAR(50) NOT NULL COMMENT '角色名称',
    role_code VARCHAR(50) NOT NULL UNIQUE COMMENT '角色编码',
    description VARCHAR(200) COMMENT '角色描述',
    status TINYINT DEFAULT 1 COMMENT '状态',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

题库相关表

-- 题目表
CREATE TABLE topic (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '题目ID',
    topic_name VARCHAR(500) NOT NULL COMMENT '题目标题',
    answer TEXT COMMENT '标准答案',
    ai_answer TEXT COMMENT 'AI答案',
    sorted INT DEFAULT 0 COMMENT '排序',
    is_everyday TINYINT DEFAULT 0 COMMENT '是否每日一题',
    is_member TINYINT DEFAULT 0 COMMENT '是否会员专享',
    view_count BIGINT DEFAULT 0 COMMENT '浏览次数',
    status TINYINT DEFAULT 1 COMMENT '状态',
    create_by VARCHAR(50) COMMENT '创建者',
    fail_msg TEXT COMMENT '失败原因',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- 题目分类表
CREATE TABLE topic_category (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '分类ID',
    category_name VARCHAR(100) NOT NULL COMMENT '分类名称',
    parent_id BIGINT DEFAULT 0 COMMENT '父分类ID',
    sort_order INT DEFAULT 0 COMMENT '排序',
    status TINYINT DEFAULT 1 COMMENT '状态',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

AI服务相关表

-- AI对话历史表
CREATE TABLE ai_history (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '记录ID',
    chat_id VARCHAR(100) NOT NULL COMMENT '对话ID',
    user_id BIGINT NOT NULL COMMENT '用户ID',
    account VARCHAR(50) COMMENT '账号',
    title VARCHAR(200) COMMENT '对话标题',
    content TEXT COMMENT '对话内容',
    status TINYINT COMMENT '状态',
    mode VARCHAR(20) COMMENT '模式',
    parent TINYINT DEFAULT 0 COMMENT '是否父级',
    original_title VARCHAR(200) COMMENT '原始标题',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- AI使用记录表
CREATE TABLE ai_record (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '记录ID',
    user_id BIGINT NOT NULL COMMENT '用户ID',
    nickname VARCHAR(50) COMMENT '昵称',
    count BIGINT DEFAULT 1 COMMENT '使用次数',
    ai_time DATETIME COMMENT '使用时间',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

系统优化与亮点

1. 性能优化

Redis缓存策略

/**
 * 缓存优化实现
 * 使用Redis缓存热点数据,提升系统性能
 */
@Service
public class CacheService {
    
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    
    /**
     * 缓存用户信息
     */
    public void cacheUserInfo(Long userId, SysUser user) {
        String key = RedisConstant.USER_INFO_PREFIX + userId;
        stringRedisTemplate.opsForValue().set(key, JSON.toJSONString(user), 
                Duration.ofHours(24));
    }
    
    /**
     * 缓存题目列表
     */
    public List<Topic> getCachedTopics(Long categoryId) {
        String key = RedisConstant.TOPIC_LIST_PREFIX + categoryId;
        String cached = stringRedisTemplate.opsForValue().get(key);
        if (StringUtils.isNotEmpty(cached)) {
            return JSON.parseArray(cached, Topic.class);
        }
        return null;
    }
}

数据库连接池优化

# 数据库连接池配置
spring:
  datasource:
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5
      connection-timeout: 30000
      idle-timeout: 600000
      max-lifetime: 1800000
      leak-detection-threshold: 60000

2. 高可用设计

服务熔断降级

/**
 * 服务熔断实现
 * 使用Hystrix实现服务降级
 */
@Component
public class TopicFeignFallback implements TopicFeignClient {
    
    @Override
    public List<Topic> getSubjectTopicList(Long subjectId) {
        log.warn("题库服务调用失败,返回默认数据");
        return Collections.emptyList();
    }
    
    @Override
    public void auditTopic(Topic topic) {
        log.warn("题目审核服务调用失败,记录日志");
        // 记录失败日志,后续重试
    }
}

分布式锁实现

/**
 * 分布式锁实现
 * 防止重复提交和并发问题
 */
@Service
public class DistributedLockService {
    
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    
    public boolean tryLock(String lockKey, String lockValue, long expireTime) {
        Boolean result = stringRedisTemplate.opsForValue()
                .setIfAbsent(lockKey, lockValue, Duration.ofSeconds(expireTime));
        return Boolean.TRUE.equals(result);
    }
    
    public void releaseLock(String lockKey, String lockValue) {
        String script = "if redis.call('get', KEYS[1]) == ARGV[1] then " +
                "return redis.call('del', KEYS[1]) else return 0 end";
        stringRedisTemplate.execute(new DefaultRedisScript<>(script, Long.class),
                Collections.singletonList(lockKey), lockValue);
    }
}

3. 监控与日志

系统监控

/**
 * 系统监控指标
 * 集成Micrometer实现系统监控
 */
@Component
public class SystemMetrics {
    
    private final MeterRegistry meterRegistry;
    private final Counter aiRequestCounter;
    private final Timer aiResponseTimer;
    
    public SystemMetrics(MeterRegistry meterRegistry) {
        this.meterRegistry = meterRegistry;
        this.aiRequestCounter = Counter.builder("ai.requests.total")
                .description("AI请求总数")
                .register(meterRegistry);
        this.aiResponseTimer = Timer.builder("ai.response.time")
                .description("AI响应时间")
                .register(meterRegistry);
    }
    
    public void recordAiRequest() {
        aiRequestCounter.increment();
    }
    
    public void recordAiResponseTime(Duration duration) {
        aiResponseTimer.record(duration);
    }
}

学习成果与技能提升

技术能力提升

  1. 微服务架构设计

    • 深入理解Spring Cloud微服务生态
    • 掌握服务注册发现、配置管理、网关路由等核心概念
    • 学会微服务拆分原则和边界划分
  2. 分布式系统开发

    • 熟练使用Nacos进行服务治理
    • 掌握Redis分布式缓存应用
    • 理解RabbitMQ消息队列异步处理机制
  3. AI技术集成

    • 集成OpenAI GPT模型实现智能对话
    • 掌握阿里云TTS语音合成技术
    • 实现AI内容审核和智能评估
  4. 云原生技术栈

    • 使用MinIO实现分布式文件存储
    • 掌握Docker容器化部署
    • 理解云原生应用设计原则

系统设计能力

  1. 架构设计思维

    • 学会从业务需求到技术架构的转换
    • 掌握高可用、高并发系统设计原则
    • 理解分布式系统的CAP理论应用
  2. 数据库设计能力

    • 设计合理的数据库表结构
    • 掌握索引优化和查询性能调优
    • 理解数据库分库分表策略
  3. 安全设计意识

    • 实现JWT无状态认证
    • 掌握RBAC权限控制模型
    • 理解系统安全防护机制

工程实践能力

  1. 代码质量管控

    • 使用Lombok简化代码编写
    • 掌握异常处理和日志记录
    • 理解代码重构和优化技巧
  2. 测试驱动开发

    • 编写单元测试和集成测试
    • 掌握Mock测试技术
    • 理解测试覆盖率的重要性
  3. DevOps实践

    • 使用Git进行版本控制
    • 掌握CI/CD流水线设计
    • 理解容器化部署流程

系统亮点总结

技术创新点

  1. AI智能审核机制

    • 自动审核用户提交的题目内容
    • AI生成标准答案和解析
    • 提升内容质量和用户体验
  2. 多模态交互体验

    • 支持文本和语音双重交互
    • 智能语音合成技术
    • 提升用户交互体验
  3. 智能推荐算法

    • 基于用户行为推荐题目
    • 个性化学习路径规划
    • 提升学习效率

架构优势

  1. 高可扩展性

    • 微服务架构支持水平扩展
    • 服务间松耦合设计
    • 支持独立部署和升级
  2. 高可用性

    • 服务熔断降级机制
    • 分布式缓存提升性能
    • 多副本部署保证可用性
  3. 高性能

    • Redis缓存热点数据
    • 数据库连接池优化
    • 异步消息处理机制

业务价值

  1. 用户体验提升

    • 智能化答题体验
    • 个性化学习推荐
    • 多端统一体验
  2. 运营效率提升

    • AI自动审核减少人工成本
    • 数据统计分析支持决策
    • 自动化运维降低维护成本
  3. 技术积累

    • 微服务架构最佳实践
    • AI技术应用经验
    • 分布式系统设计能力

总结

通过本项目的开发实践,深入掌握了现代分布式系统开发的核心技术栈,包括Spring Cloud微服务架构、AI技术集成、云原生应用开发等。项目不仅实现了预期的业务功能,更重要的是在技术架构设计、系统性能优化、用户体验提升等方面积累了宝贵经验。

系统采用微服务架构设计,具备良好的可扩展性和可维护性;集成AI技术提供智能化服务,提升用户体验;使用云原生技术栈,支持容器化部署和自动化运维。这些技术实践为后续的大型系统开发奠定了坚实基础。

在开发过程中,不仅提升了技术能力,更重要的是培养了系统思维和工程实践能力,为成为一名优秀的软件工程师奠定了坚实基础。

作者

HuangZhongqi

发布于

2025-01-27

更新于

2025-10-03

许可协议

评论