AI答题平台项目笔记

AI答题平台项目笔记

一、流程:后端——>前端——>优化——>部署

二、需求分析

  1. 明确要做的需求,然后把需求模块化,最后分级
    • 用户模块
      • 注册
      • 登录
      • 管理——管理员
    • 应用模块
      • 创建
      • 修改
      • 删除
      • 查看列表
      • 查看详情
      • 查看自己创建的应用
      • 管理——管理员
      • 审核与下架——管理员
      • 应用分享:扫码查看
    • 题目模块
      • 创建:题目选项的得分
      • 修改
      • 删除
      • 管理——管理员
      • AI生成题目
    • 打分模块
      • 创建
      • 修改
      • 删除
      • 回答计算评分
        • 自定义——测评
        • 自定义——打分
        • AI评分
      • 管理——管理员
    • 回答模块
      • 提交回答(创建)
      • 查看某次回答的评分结果
      • 查看自己提交的回答列表
    • 总体提交的分析模块
      • 评分结果分析和查看

三、设计库表

分为:

  1. 用户表
  2. 应用表
  3. 题目表
  4. 评分结果表
  5. 用户答案记录表

四、后端项目整体初始化

  • MySQL 必须准备 8.x 版本
  • Redis 默认不开启
  • Elasticsearch 默认不开启
  • COS 对象存储,不影响运行

执行默认写好的sql语句脚本,建表

  1. 改模块名(全局替换)
  2. 改包名(重构 + 全局替换)
  3. 移除不必要的模块(Elasticsearch、微信开发、表格处理、定时任务相关代码)。不移除也不影响项目运行。
  4. 执行真实业务的库表初始化脚本,更改数据库等配置为自己的,尝试重新运行项目。

五、后端基础开发(增删改查)

1.数据访问层代码生成

通过mybatis X代码生成mapper和实体类,随后把文件放入对应目录下

2.业务代码逻辑开发

包括 controller层、service层(接口以及实现类)、数据模型(DTO,VO,Enum类)

3.数据模型开发

编写数据模型包装类(请求类DTO和视图类VO)、JSON 结构对应的类、枚举类。

包装类需要根据前端实际传递的请求参数或需要的响应结果自行修改。

4.接口开发(controller,也可以叫控制层)

根据不同的模块,编写对应的controller。

controller进行数据的校验,鉴权,调用对应service方法。

先把实体类(请求的类)转化为DTO,然后进行一系列逻辑判定,

最后把封装好的数据(一般是VO)返回给前端。

具体逻辑,需要参考需求。可以想象controller是一个酒店接待前台,然后进行一系列的操作。比如查询请求。用户提交请求,接待提供表格并填写信息,接待校验提交的信息,以及权限,查询信息是否存在,返回信息(如果不存在,需要报告,使用enum类返回查询错误的信息)

5.服务开发(service层)

通过增删改查的开发,可以完成下列功能:

  • 用户模块
    • 注册 P0
    • 登录 P0
    • 管理用户 - 增删改查(仅管理员可用)P1
  • 应用模块
    • 创建应用 P0
    • 修改应用 P1
    • 删除应用 P1
    • 查看应用列表 P0
    • 查看应用详情 P0
    • 查看自己创建的应用 P1
    • 管理应用 - 增删改查(仅管理员可用)P0
  • 题目模块**(必须和一个应用绑定)**
    • 创建题目(包括题目选项得分设置)P0
    • 修改题目 P1
    • 删除题目 P1
    • 管理题目 - 增删改查(仅管理员可用)P1
  • 评分模块**(必须和一个应用绑定)**
    • 创建评分结果 P0
    • 修改评分结果 P1
    • 删除评分结果 P1
    • 管理评分结果 - 增删改查(仅管理员可用)P1
  • 回答模块**(必须和一个应用绑定)**
    • 提交回答(创建)P0
    • 查看某次回答的评分结果 P0
    • 查看自己提交的回答列表 P1
    • 管理回答 - 增删改查(仅管理员可用)P1

根据以上的需求,进行服务的开发

比如,酒店前台接收到了请求,客户需要具体做什么事情,后台服务编写此服务的代码,进行处理,最后交由controller调用,并返还数据

六、后端核心业务开发

应用审核功能

审核是一个通用能力。具体体现为,应用提交,需要判定是否合法,审核的状态,以及审核的一些消息

评分模块实现

需求:针对不同的应用类别和评分策略,编写不同的实现逻辑。

核心实现方式:策略模式

策略模式是一种行为设计模式,它定义了一系列算法,并将每个算法封装到独立的类中,使得它们可以相互替换。

在本项目的场景中,输入的参数是一致的(应用和用户的答案列表),并且每种实现逻辑区别较大,很适合使用策略模式。

所有代码放到 scoring 包中,模块化。

当提及xx策略,就用到策略模式。可以考虑为针对同一种情况,提供不同的方法。这就是策略模式

两种策略实现
1、自定义测评类应用评分策略
2、自定义得分类应用评分策略

针对不同的应用,采取不同的策略,但是提交的答案是一样的,只是根据应用的种类进行了不同的评分。

全局执行器

简化外部对策略的调用,只需通过提交答案列表,和相关的应用种类即可调用。

在调用的时候,通过==注解驱动==的方式,申明应用类型和评分策略。

在执行器的调用判定的时候,自动评定注解,再调用对应的逻辑即可

回答模块

addUserAnswer 创建回答方法中补充 “调用评分模块并更新回答表” 的逻辑即可。

image-20250326210049636

控制应用可见范围

如果应用未过审,用户无法答题、并且无法通过列表查看到未过审的应用。

最后

使用 Swagger 对整个流程进行测试即可。

七、接入AI

使用智谱 AI SDK

需要阅读官方文档hQmtAITT+NI1jMGj7JwdSRjVrBuX839ouIXWwMyS6yU=

使用指南:https://open.bigmodel.cn/dev/howuse/introduction

可以看到很多能力,比如知识库、网络搜索等

接口文档:https://open.bigmodel.cn/dev/apic42IwGFiMfkx2mfUJN223sQ2XPAYSJE80oyCmTtWzVA=

有 3 种调用方式,SDK、HTTP 和第三方框架。

比较推荐 SDK,方便,不用自己构造 HTTP 请求并构造响应对象。

跟着官方文档去学习使用即可:https://open.bigmodel.cn/dev/api#sdk_install

Java 中使用 SDK

1)引入 maven

2)写单元测试,跑通demo

3)debug如果出问题,改这个地方

在这里插入图片描述

封装 AI 模块

目的是更快速灵活地调用 AI 的能力,各项目都可以复用。

1)在 application.yml 中定义 AI 配置
ai:
  apiKey: xxx
2)写AI 的配置类,打上@ConfigurationPropertities(prefix=“ai”)的注解

初始化调用智谱的 Client 并将其注册为 bean。

@Configuration
@ConfigurationProperties(prefix = "ai")
@Data
public class AiConfig {

    private String apiKey;

    @Bean
    public ClientV4 getClientV4() {
        return new ClientV4.Builder(apiKey).build();
    }
}

后续直接调用 public ClientV4 client;就生成了ClientV4的对象。

@Configuration,是表示这是一个配置类,把类交给Ioc管理;@ConfigurationProperties(prefix = “ai”)会扫描配置yml,xml对应的配置,并进行填充

@Data,Lombok注解,getset方法一步到位;@Bean,打在方法上,将方法返回的对象交给ioc容器管理。(如果是官方的类,我更倾向使用@Bean注解,只需一个方法就可以返回新对象;如果是自己写的类,更倾向@component,@具体的部件和层次)

3)智谱 SDK 提供的客户端已经很方便了,但我们仍然可以根据实际业务需求,封装本项目内通用的 AI 请求构建模块。

比如将复杂的消息、请求构建、从返回值中获取结果的过程进行封装。X9icfu4Y5Wc0gdJ0BnWoVEbVfhLL18yOsSRVXp21GXQ=

一般建议先封装通用的方法,然后提供不同参数默认值的简化调用方法,层层简化。

最通用的方法,可自定义消息、是否流式、随机数:

public String doRequest(List<ChatMessage> messages, Boolean stream, Float temperature) {
    // 构造请求
    ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
    .model(Constants.ModelChatGLM4)
    .stream(stream)
    .invokeMethod(Constants.invokeMethod)
    .temperature(temperature)
    .messages(messages)
    .build();
    ModelApiResponse invokeModelApiResp = clientV4.invokeModelApi(chatCompletionRequest);
    ChatMessage result = invokeModelApiResp.getData().getChoices().get(0).getMessage();
    return result.getContent().toString();
}

通用请求,简化了消息传递:

public String doRequest(String systemMessage, String userMessage, Boolean stream, Float temperature) {
    // 构造请求
    List<ChatMessage> messages = new ArrayList<>();
    ChatMessage systemChatMessage = new ChatMessage(ChatMessageRole.SYSTEM.value(), systemMessage);
    ChatMessage userChatMessage = new ChatMessage(ChatMessageRole.USER.value(), userMessage);
    messages.add(systemChatMessage);
    messages.add(userChatMessage);
    return doRequest(messages, stream, temperature);
}

接下来就是方法的各种重载

八、AI生成题目

需求分析

原本创建题目需要人工一个个添加标题和选项,比较麻烦。

可以使用 AI,根据已经填写的应用信息,自动生成题目,然后再由人工进行编辑确认,提高创建题目的效率。

方案设计

AI 生成内容的核心是编写 Prompt,好的、精准的 Prompt 才能帮助我们得到预期的结果。

首先明确我们能提供或者需要输入给 AI 的参数,然后构建 Prompt 并输入给 AI,让 AI 生成题目并处理成我们需要的格式。

1、明确输入参数

明确需要提供给 AI 的参数列表:

  1. 应用信息,包括应用名称、描述、类别(得分 / 测评)
  2. 题目信息,包括要生成的题目数、每题选项数

当然,还可以有其他信息,比如限定单个选项的得分范围、选项对应的属性集合等。X9icfu4Y5Wc0gdJ0BnWoVEbVfhLL18yOsSRVXp21GXQ=

不过因为 AI 给出的结果存在随机性,建议大家先一切从简,只提供核心参数,保证 AI 输出的结果尽可能地稳定。

2、明确返回结果

需要 JSON 格式的题目列表,比如:

[
  {
    "options": [
      {
        "result": "I",
        "value": "独自工作",
        "key": "A"
      },
      {
        "result": "E",
        "value": "与他人合作",
        "key": "B"
      }
    ],
    "title": "你通常更喜欢"
  }
]

3、编写和调试 Prompt

推荐阅读智谱 AI 官方提供的 Prompt 工程指南:https://open.bigmodel.cn/dev/howuse/prompt

遵循 Prompt 工程指南中的技巧,编写出系统 Prompt 和用户 Prompt。c42IwGFiMfkx2mfUJN223sQ2XPAYSJE80oyCmTtWzVA=

系统 Prompt 如下:

你是一位严谨的出题专家,我会给你如下信息:
```
应用名称,
【【【应用描述】】】,
应用类别,
要生成的题目数,
每个题目的选项数
```

请你根据上述信息,按照以下步骤来出题:
1. 要求:题目和选项尽可能地短,题目不要包含序号,每题的选项数以我提供的为主,题目不能重复
2. 严格按照下面的 json 格式输出题目和选项
```
[{"options":[{"value":"选项内容","key":"A"},{"value":"","key":"B"}],"title":"题目标题"}]
```
title 是题目,options 是选项,每个选项的 key 按照英文字母序(比如 ABCD)以此类推,value 是选项内容
3. 检查题目是否包含序号,若包含序号则去除序号
4. 返回的题目列表格式必须为 JSON 数组

用户 Prompt 按照顺序提供信息即可,示例 Prompt 如下。

MBTI 性格测试,
【【【快来测测你的 MBTI 性格】】】,
测评类,
103

技巧:

  1. 定义 System Prompt
  2. 让 GLM 进行角色扮演
  3. 使用分隔符标示不同的输入部分
  4. 少样本学习
  5. 指定输出长度的示例
  6. 将复杂任务分解为简单的子任务
  7. 指定固定的输出格式
  8. 通过按顺序输入参数来节约空间。
  9. 对于描述这种多行内容,可以通过特殊字符括起来,防止用户的输入干扰生成结果。

然后编写单元测试来进一步调试,得到的结果可能会包含额外的开头和结尾字符串。对应的解决方案是,利用字符串查找,找到开头的 ‘[’ 和结尾的 ‘]’,进行截取。

最后,将 JSON 字符串转换为题目对象,返回给前端即可。

最后,写接口,写常量,写DTO

AI评分模块照着生成题目模块写

九、系统优化

  • 幂等设计
    • 需求分析
    • 方案选型
    • 方案设计
    • 前端
    • 后端
    • 验证测试
  • 线程池隔离
    • 需求分析
    • 方案设计
    • 开发实现
    • 验证测试
  • 统计分析功能
    • 需求分析
    • 方案选型
    • MyBatis 自定义 SQL
    • 后端开发
      • 热门应用排行统计
      • 应用回答分布统计

十、性能优化

性能优化

  • RxJava 响应式编程
    • RxJava 介绍
    • RxJava 核心原理讲解
    • demo 演示
  • AI 生成题目优化
    • 需求分析
    • 方案设计(SSE 技术)
    • 后端开发
    • 前端开发
  • AI 评分优化
    • 需求分析
    • 方案设计
    • 后端实现
  • 分库分表实战
    • 需求分析
    • 分库分表概念
    • 分库分表技术选型
    • 方案设计
    • 后端实战
    • 验证测试
      选型
    • 方案设计
    • 前端
    • 后端
    • 验证测试
  • 线程池隔离
    • 需求分析
    • 方案设计
    • 开发实现
    • 验证测试
  • 统计分析功能
    • 需求分析
    • 方案选型
    • MyBatis 自定义 SQL
    • 后端开发
      • 热门应用排行统计
      • 应用回答分布统计

十、性能优化

性能优化

  • RxJava 响应式编程
    • RxJava 介绍
    • RxJava 核心原理讲解
    • demo 演示
  • AI 生成题目优化
    • 需求分析
    • 方案设计(SSE 技术)
    • 后端开发
    • 前端开发
  • AI 评分优化
    • 需求分析
    • 方案设计
    • 后端实现
  • 分库分表实战
    • 需求分析
    • 分库分表概念
    • 分库分表技术选型
    • 方案设计
    • 后端实战
    • 验证测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值