SpringBoot集成AI大模型的在线考试系统:从组卷到学情分析

在线考试系统已经不是一个新话题,但把 AI 大模型接进去之后,整个系统的能力边界发生了明显变化:组卷可以自动化,主观题评分可以辅助完成,学情分析可以基于文本生成建议。真正有工程价值的点不在于“调用一次大模型接口”,而在于如何把大模型能力嵌入到考试业务闭环中,并保证数据可信、流程可控、逻辑可追溯。这篇内容会以 SpringBoot 为基础,结合常规权限框架和数据库设计,演示一套“题库管理 + 在线考试 + AI 组卷 + AI 辅助评分 + 学情分析”的最小可运行系统,同时把工程上最关键的环节讲清楚。

适合阅读这篇内容的开发者包括:已经掌握 SpringBoot 基础开发,想了解业务系统如何集成大模型;正在设计在线考试或培训考核类项目,需要把 AI 能力落到具体模块;以及在本地学习时希望有一套带完整数据结构和接口设计的参考项目。读完这篇内容后,你会得到一套可以直接在本地启动、调试和扩展的工程骨架,也能知道哪些环节应该信任大模型,哪些环节必须保留人工兜底。

1. 先理解“在线考试 + 大模型”要解决什么问题

1.1 在线考试系统的传统功能边界

一套常规在线考试系统,核心流程并不复杂:管理员录入题库,维护试卷;考生在规定时间内登录系统答题;交卷后系统自动判分;最后统计考试成绩。在传统实现中,以下能力往往比较薄弱:

  • 组卷依赖人工选题,大型题库下很难保证每次试卷难度、知识点分布一致。
  • 主观题只能人工评阅,系统只能管理答题记录,无法给出评分参考。
  • 成绩统计停留在分数汇总层面,难以针对单个学生或单个班级生成可读的学习建议。

这些薄弱点正好是后续要接入大模型的位置。

1.2 大模型在考试系统中适合承担的角色

大模型不是替代整张试卷的生成器,也不是替代教师的最终评分人。在稳妥的工程设计中,大模型适合承担以下三类角色:

第一类是“题目生产辅助”。给定知识点范围、难度、题型等要求,模型生成候选题目,再由人工审核后进入题库。生成结果只能作为题源,不能绕过审核直接上卷。

第二类是“主观题评分参考”。模型按评分标准读取考生答案,输出得分点、扣分理由、参考得分。最终成绩必须由教师确认后生效,系统保留完整的评分过程记录。

第三类是“学情分析建议生成”。考试结束后,模型根据得分、做题时长、错误知识点,生成针对性的学习建议。这类文本本身风险较低,但依然要在产品上标注“仅供参考”。

这里要明确一个工程判断:大模型适合处理“非确定性内容生成”,不适合处理“必须精确一致的流程控制”。所有成绩计算、状态流转、权限校验、试卷锁定等动作,仍然要由 Java 业务代码完成。

1.3 AI 能力在系统中的四种接入形态

在实际项目里,大模型接入形态取决于系统规模和部署条件,常见有四种,整理如下。

接入形态 适用场景 优点 需要注意的问题
直接调用云端大模型接口 大多数中小型项目 接入快,模型能力强,无需自建算力 费用随调用量增长,依赖外部服务可用性
私有化部署开源模型 数据敏感、内网环境 数据不出内网,可长期运行 需要 GPU 资源,维护成本高
通过 API 网关统一封装 多模型替换、多项目复用 便于切换供应商,统一鉴权和限流 需要额外开发网关层
嵌入现有 AI 平台能力 企业内部已有模型平台 复用已有账号、审计和监控能力 需要遵循平台的接入规范

示例项目采用第一种形态,同时会在代码层做一层接口抽象,这样后续切换私有化部署时不需要改业务代码。

1.4 系统模块规划

按照考试业务闭环,系统分成五个模块:

  • 用户与权限模块:管理管理员、教师、学生三类角色。
  • 题库与试卷模块:维护题目分类、难度、题型;自动或人工组卷。
  • 在线考试模块:创建考试、考生答题、交卷判分。
  • AI 服务模块:统一封装大模型调用,处理组卷、评分、学情分析三类业务。
  • 统计与展示模块:输出成绩列表、得分分布、知识点掌握情况。

这个模块划分也决定了后续代码结构,再叠加 SpringBoot 的分层设计,就可以直接开工了。

需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。

2. 环境准备与技术选型

2.1 版本与依赖选择

示例项目采用目前主流稳定的技术组合。如果是拿来学习,建议先按下面版本对齐;如果是从零开始新项目,需要确认依赖最新发布状态后再使用。

组件 版本建议 说明
JDK 17 主流 SpringBoot 3.x 的基线版本
SpringBoot 3.2.x 负责 Web、事务、校验、自动配置
MyBatis-Plus 3.5.x 简化单表 CRUD,分页好用
MySQL 8.0 存储业务数据
Redis 可选 存储考试会话、验证码、热点数据
大模型服务 云端或私有化 REST 接口 统一走 HTTP 调用

引入依赖时,最核心的 pom 片段如下:

xml复制<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.5</version>
    <relativePath/>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
        <version>3.5.5</version>
    </dependency>
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
</dependencies>

这里要注意一个坑:MyBatis-Plus 对 SpringBoot 3 有独立 starter,不要误用 mybatis-plus-boot-starter。这个坐标看似差一个单词,实际会导致自动配置完全失效。

2.2 应用配置:不要把大模型密钥写进代码

配置文件保持外置化思路,默认提供 application.yml、application-dev.yml、application-prod.yml 三份配置。开发环境可以本地写死,生产环境必须通过环境变量注入。

yaml复制spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/exam_ai?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
    username: root
    password: ${MYSQL_PASSWORD:root}

mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0

ai:
  model:
    base-url: ${AI_BASE_URL:https://your-model-service.example.com/v1}
    api-key: ${AI_API_KEY:}
    default-model: ${AI_MODEL:default-chat-model}
    timeout-seconds: 30
    max-tokens: 2048

需要注意:serverTimezone=Asia/Shanghai 不能省略,否则 LocalDateTime 在数据库时区与 JVM 时区不一致时会出现少 8 小时之类的问题。AI 相关配置统一放在 ai.model 节点下,方便后续扩展超时、重试、多模型优先级等参数。

2.3 大模型接口的抽象设计

直接在每个业务 Service 里注入某个大模型 SDK,会让代码被厂商绑定。更稳妥的做法是定义一个最小接口,只暴露“发送消息、获取回答”的能力。

java复制public interface AiChatClient {

    /**
     * 发送对话请求,返回文本内容
     */
    String chat(String systemPrompt, String userPrompt);

    /**
     * 指定模型名称发送请求,用于不同任务选择不同模型
     */
    String chat(String model, String systemPrompt, String userPrompt);
}

接口实现类负责处理 HTTP 调用、超时、重试和异常转换。业务层只依赖 AiChatClient,不知道底层是云端服务还是私有化服务。

REST 调用通常走 OpenAI 兼容格式,下面是一个简化实现思路:

java复制public class OpenAiCompatibleClient implements AiChatClient {

    private final RestTemplate restTemplate;
    private final AiModelProperties properties;

    @Override
    public String chat(String systemPrompt, String userPrompt) {
        return chat(properties.getDefaultModel(), systemPrompt, userPrompt);
    }

    @Override
    public String chat(String model, String systemPrompt, String userPrompt) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.setBearerAuth(properties.getApiKey());

        Map<String, Object> body = new HashMap<>();
        body.put("model", model);
        body.put("messages", List.of(
                Map.of("role", "system", "content", systemPrompt),
                Map.of("role", "user", "content", userPrompt)
        ));
        body.put("temperature", 0.2);

        HttpEntity<Map<String, Object>> request = new HttpEntity<>(body, headers);
        ResponseEntity<JsonNode> response =
                restTemplate.postForEntity(properties.getBaseUrl() + "/chat/completions", request, JsonNode.class);

        // 实际解析时还要处理 error、choices 为空、content 为空等情况
        return response.getBody()
                .path("choices")
                .path(0)
                .path("message")
                .path("content")
                .asText();
    }
}

生产实现里不允许这样一笔带过,必须检查 HTTP 状态码、解析异常、熔断和日志。学习阶段可以先用 RestTemplate,架构上后续可替换为 WebClient 或 OkHttp。

3. 数据库设计是关键:先画清楚关系,再写业务代码

3.1 核心表结构与关系

考试系统涉及的对象非常多,如果一上来就建二十张表,很容易迷失。最小闭环只需要六张表:

  • sys_user:用户表,包含管理员、教师、学生,通过 role 字段区分。
  • exam_question:题目表,包含题干、选项 JSON、答案、题型、难度、知识点。
  • exam_paper:试卷表,保存试卷基本信息。
  • exam_paper_question:试卷题目关联表,记录每道题在试卷中的分值、顺序。
  • exam_record:考试记录表,记录考生某次考试的状态、开始时间和得分。
  • exam_answer:答题明细表,保存学生对每道题的答案。

核心关系如下:

  • 一个用户可以参加多场考试,所以 exam_record 关联 sys_user 和 exam_paper。
  • 一张试卷包含多道题,通过 exam_paper_question 关联。
  • 一场考试有多道答题明细,通过 exam_answer 关联 exam_record 和 exam_question。

3.2 关键 DDL 片段

下面是题目表和考试记录表的设计参考:

sql复制CREATE TABLE `exam_question` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `type` varchar(20) NOT NULL COMMENT 'single/multiple/true_false/subjective',
  `content` text NOT NULL COMMENT '题干',
  `options` json DEFAULT NULL COMMENT '单选题和多选题的选项',
  `answer` text DEFAULT NULL COMMENT '客观题答案;主观题可不填',
  `analysis` text DEFAULT NULL COMMENT '解析,主观题可存评分要点',
  `score` int NOT NULL DEFAULT '5' COMMENT '默认分值',
  `difficulty` tinyint NOT NULL DEFAULT '3' COMMENT '1-5',
  `knowledge_point` varchar(100) DEFAULT NULL COMMENT '知识点标签',
  `status` tinyint NOT NULL DEFAULT '1' COMMENT '0禁用 1启用',
  `created_by` bigint DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  `deleted` tinyint DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='题目表';
sql复制CREATE TABLE `exam_record` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `exam_no` varchar(64) NOT NULL COMMENT '考试编号,业务展示用',
  `user_id` bigint NOT NULL,
  `paper_id` bigint NOT NULL,
  `total_score` int DEFAULT NULL COMMENT '最终得分',
  `objective_score` int DEFAULT NULL COMMENT '客观题得分',
  `subjective_score` int DEFAULT NULL COMMENT '主观题得分,默认存教师确认后的分值',
  `status` tinyint NOT NULL DEFAULT '0' COMMENT '0未开始 1答题中 2待批改 3已完成',
  `start_time` datetime DEFAULT NULL,
  `submit_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_exam_no` (`exam_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考试记录表';

设计时有两个地方值得注意。第一个是主观题答案和成绩:主观题评分不一定采用分数字段直接覆盖,因为大模型给出的参考分和教师确认分可能存在差异,所以 subjective_score 语义要定义为“最终生效分数”,大模型分数另外存人工审核日志或相关子表。第二个是 exam_no:业务上用于查询的编号不要依赖自增主键,在创建考试时生成并保证唯一,便于后续对接外部系统。

3.3 题目关联试卷时的扩展考虑

设计 exam_paper_question 时,最简单模型只记录 paper_id 和 question_id。实际开发中建议增加 sort_no、actual_score 字段:sort_no 控制展示顺序,actual_score 允许同一道题在不同试卷中分值不同。

sql复制CREATE TABLE `exam_paper_question` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `paper_id` bigint NOT NULL,
  `question_id` bigint NOT NULL,
  `sort_no` int NOT NULL DEFAULT '0',
  `actual_score` int NOT NULL DEFAULT '5',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_paper_question` (`paper_id`, `question_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='试卷题目关联表';

这种中间表设计避免把题目和试卷耦合在同一张表里,后续即使调整题目顺序、替换某道题,也不会影响其他试卷。

4. 基础业务模块:从登录到组卷到考试的完整闭环

4.1 用户认证与角色权限

考试系统必须区分角色权限。这里采用 Spring Security + JWT 的方式,不引入复杂的权限框架,便于学习且足以支撑小中型系统。

核心实现包含几个部分:

  • JwtAuthenticationFilter:每次请求解析 Header 中的 Token,将用户信息放入 SecurityContext。
  • UserDetailsService:从数据库加载用户。
  • 接口权限注解:例如 @PreAuthorize("hasRole('ADMIN')")。
  • 登录接口:校验用户名密码后签发 JWT。

JWT 工具类参考:

java复制@Component
public class JwtUtils {

    @Value("${jwt.secret}")
    private String secret;

    @Value("${jwt.expire-hours:24}")
    private Long expireHours;

    public String generateToken(Long userId, String username, String role) {
        return Jwts.builder()
                .setSubject(username)
                .claim("userId", userId)
                .claim("role", role)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + expireHours * 3600 * 1000))
                .signWith(SignatureAlgorithm.HS256, secret)
                .compact();
    }
}

这里不要直接把用户密码存储为明文,推荐使用 BCryptPasswordEncoder,这也是 Spring Security 内置的加密方案。

4.2 题库管理:AI 生成题目的两个约束

题库管理本身是普通 CRUD,但加上 AI 之后要注意两条约束:

第一,AI 生成的题目不能直接写入正式题库。正确流程是进入“待审核”状态,由教师确认后才置为启用。

第二,AI 生成题目时,需要要求模型按固定 JSON 结构返回,然后由代码解析并做字段校验。解析失败必须记录日志并走人工处理,不能直接跳过或默认异常。

新增题目接口的核心逻辑:

java复制public Long addQuestion(QuestionSaveRequest request) {
    validateQuestion(request);

    ExamQuestion question = new ExamQuestion();
    question.setType(request.getType());
    question.setContent(request.getContent());
    question.setOptions(request.getOptions());
    question.setAnswer(request.getAnswer());
    question.setAnalysis(request.getAnalysis());
    question.setScore(request.getScore());
    question.setDifficulty(request.getDifficulty());
    question.setKnowledgePoint(request.getKnowledgePoint());
    question.setStatus(0); // 默认待审核
    questionMapper.insert(question);
    return question.getId();
}

private void validateQuestion(QuestionSaveRequest request) {
    if (StringUtils.hasText(request.getContent()) == false) {
        throw new BusinessException("题干不能为空");
    }
    if ("single".equals(request.getType()) && CollectionUtils.isEmpty(request.getOptions())) {
        throw new BusinessException("单选题必须包含选项");
    }
    if ("single".equals(request.getType()) && StringUtils.hasText(request.getAnswer()) == false) {
        throw new BusinessException("单选题必须设置答案");
    }
}

4.3 组卷策略:固定试题、随机抽题与 AI 生成组合

组卷策略不必一开始就做得很复杂,但至少要支持三种模式:

  • 固定试卷:管理员直接挑选题目,适用于重要考试。
  • 随机抽题:按知识点、难度、题型比例从题库抽取,适用于日常练习。
  • AI 辅助出题:先由管理员指定知识点和难度,调用大模型生成候选题,人工确认后进入试卷。

随机抽题可以用 MyBatis-Plus 的查询条件,也可以直接使用 SQL 按知识点分组随机抽取。SQL 方式在数据量较大时更可控:

sql复制SELECT id, content, options, answer, score, difficulty, knowledge_point
FROM exam_question
WHERE status = 1
  AND type = #{type}
  AND difficulty = #{difficulty}
  AND knowledge_point = #{knowledgePoint}
ORDER BY RAND()
LIMIT #{limit}

ORDER BY RAND() 在小数据量下没有问题,大数据量下性能会随表变大而下降。若题库超过十万条,建议改成“先随机取主键,再回表查询”的方式。

AI 辅助组卷的流程必须设计成异步任务,因为生成题目通常耗时数秒甚至更久,不能让 HTTP 请求一直阻塞。实现步骤为:

  1. 管理员提交组卷任务,保存到 paper_gen_task 表。
  2. 后台线程或消息队列中调用 AiChatClient。
  3. 将生成结果转成 QuestionSaveRequest,保存为待审核题目。
  4. 管理员审核通过后,再选择加入试卷。

异步处理在代码层面的最小实现可以使用 @Async,但生产环境需要考虑任务状态持久化、失败重试和人工介入入口。

4.4 在线考试核心流程

在线考试流程的状态机很清楚:未开始 -> 答题中 -> 待批改 -> 已完成。

考生进入考试时做两件事:创建 exam_record,生成考试快照。考试快照的作用是防止试题在考试期间被管理员修改。最简单快照方式是在 exam_record 里保存试卷题目的 JSON 数组,或者在 exam_answer 中预置所有题目记录。

推荐使用后者:考生开始考试时,按照 exam_paper_question 查询所有题目,并为每道题创建一条 exam_answer。这样交卷时只需要按记录更新答案和得分,不需要关心实时查询试卷表。

交卷接口需要额外处理两个问题。

第一个是幂等。考生可能双击或重复请求交卷,必须通过状态判断来保证只处理一次:

java复制@Transactional
public SubmitResult submit(SubmitRequest request) {
    ExamRecord record = getRecordForUpdate(request.getRecordId(), request.getUserId());

    if (record.getStatus() == ExamStatus.SUBMITTED || record.getStatus() == ExamStatus.FINISHED) {
        return SubmitResult.alreadySubmitted(record);
    }
    if (record.getStatus() != ExamStatus.IN_PROGRESS) {
        throw new BusinessException("当前状态不允许交卷");
    }

    // 更新答题明细、计算客观题得分、判断是否有主观题
    record.setStatus(hasSubjective ? ExamStatus.PENDING_REVIEW : ExamStatus.FINISHED);
    record.setSubmitTime(LocalDateTime.now());
    examRecordMapper.updateById(record);
    return SubmitResult.success(record);
}

第二个是超时判定。前端倒计时结束后,后端仍然要再次校验当前时间是否晚于考试截止时间,不能只相信前端参数。服务端判定的实现是在查询 exam_record 时比较 start_time + duration_minutes 与当前时间。

4.5 客观题自动判分与主观题人工/辅助评分

客观题判分逻辑很简单:读取 exam_answer 中的答案,与 exam_question.answer 做精确比较。选择题答案建议用固定分隔符存储,例如多选题答案存为 A,B,C,判分时先拆分再比对。

主观题评分是本项目接入大模型的主要场景之一。流程设计如下:

  1. 交卷后,系统把主观题答案、题干、评分要点、参考解析组装成提示词。
  2. 调用大模型获取 JSON 格式评分结果,包含建议分数、得分点、扣分点。
  3. 评分结果先写入 exam_answer 的 ai_review_result 字段,不直接覆盖最终得分。
  4. 教师在管理端查看 AI 参考评分,可采纳或修改,确认后更新最终得分。

这里要考虑大模型调用失败不阻塞交卷:主观题评分放在异步流程中,交卷接口立即返回成功,只是状态停留在“待批改”。

AI 评分提示词示例:

text复制你是一位严谨的考试阅卷教师。请根据题干、参考答案和学生答案,从内容准确性、要点覆盖、表达清晰度三方面评价。

要求:
1. 输出 JSON,格式为
{"suggestScore": 0, "scoreReasons": ["..."], "deductReasons": ["..."], "comment": "一句话总结"}
2. suggestScore 必须是数字,范围 0 到 {maxScore}
3. 如果学生答案与题目无关,suggestScore 必须为 0
4. 不要输出 JSON 以外的内容

题干:
{questionContent}

参考答案:
{referenceAnswer}

学生答案:
{studentAnswer}

工程上有一个容易被忽略的细节:大模型输出偶尔会在 JSON 前后增加解释文本、代码块标记,甚至直接输出 Markdown。解析时必须先做清洗,再使用 JSON 解析库,解析失败时把原始输出记录到日志,方便排查。建议在 AiReviewParser 中组合使用正则清理、JSON 异常捕获和默认降级策略。

5. 大模型接入的工程化封装

5.1 为什么业务代码里不能直接写 Prompt

很多初学者喜欢在 Service 里拼接 String prompt = "请帮我出题" + request.getKnowledgePoint();,这种做法在演示阶段可以,但在工程化项目中会造成三个问题:

  • 提示词没有版本管理,线上调整文案要重新发布代码。
  • 不同业务重复拼装,格式不一致,解析结果质量不稳定。
  • 模型供应商或模型版本变更后,提示词策略可能失效,但代码层无法快速感知。

正确做法是把提示词模板放入独立资源目录,如 resources/prompt/*.txt。代码读取模板后,用 {} 占位符替换参数。简单实现可以使用 Spring 的 Resource 加载或 String.replace;复杂场景可以使用模板引擎。

java复制public class PromptTemplateLoader {

    public String render(String templateName, Map<String, Object> context) {
        String template = loadTemplate(templateName);
        for (Map.Entry<String, Object> entry : context.entrySet()) {
            template = template.replace("{" + entry.getKey() + "}", String.valueOf(entry.getValue()));
        }
        return template;
    }
}

5.2 结构化输出与失败降级

大模型接口返回 String 之后,业务层要迅速把它转成可靠对象。下面是一个解析 AI 组卷结果的方法:

java复制public List<QuestionSaveRequest> parseGeneratedQuestions(String aiOutput) {
    String cleaned = cleanJson(aiOutput);
    JsonNode root;
    try {
        root = objectMapper.readTree(cleaned);
    } catch (JsonProcessingException e) {
        log.warn("AI 输出解析失败,原始内容={}", aiOutput);
        throw new AiResponseParseException("AI 返回内容无法解析为 JSON");
    }

    JsonNode questionsNode = root.get("questions");
    if (questionsNode == null || !questionsNode.isArray()) {
        throw new AiResponseParseException("AI 返回内容缺少 questions 数组");
    }

    List<QuestionSaveRequest> result = new ArrayList<>();
    for (JsonNode node : questionsNode) {
        QuestionSaveRequest request = new QuestionSaveRequest();
        request.setType(node.path("type").asText("single"));
        request.setContent(node.path("content").asText());
        request.setAnswer(node.path("answer").asText());
        request.setAnalysis(node.path("analysis").asText());
        request.setDifficulty(node.path("difficulty").asInt(3));
        request.setKnowledgePoint(node.path("knowledgePoint").asText());
        // 字段级校验,忽略非法题目
        if (StringUtils.hasText(request.getContent())) {
            result.add(request);
        }
    }
    return result;
}

关键点在于:永远不要相信模型第一次输出的内容。parseGeneratedQuestions 里的字段级过滤、类型转换和日志记录,是对线上数据质量的第一道防线。

5.3 调用策略:超时、重试与并发限制

大模型接口不像数据库查询,它可能因为服务端负载、网络波动或内容审核返回较慢。生产环境必须设置明确策略。

策略项 开发环境建议 生产环境建议
建立连接超时 5 秒 5 秒
读取响应超时 30 秒 30 到 60 秒
重试次数 1 次或不重试 2 次,注意幂等
并发上限 不限制,便于调试 按供应商配额设置信号量或线程池
失败兜底 打印完整错误 转人工处理队列,页面提示“评分暂不可用”

使用信号量控制并发是一种相对轻量的方式:

java复制@Component
public class AiRateLimiter {

    private final Semaphore semaphore = new Semaphore(5);

    public void acquire() {
        try {
            if (!semaphore.tryAcquire(3, TimeUnit.SECONDS)) {
                throw new BusinessException("AI 服务繁忙,请稍后重试");
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            throw new BusinessException("请求被中断");
        }
    }

    public void release() {
        semaphore.release();
    }
}

调用结束后必须在 finally 中释放信号量,防止线程积累导致系统不可用。

6. 学情分析与数据展示

6.1 学情分析的数据来源

成绩只是结果,学情分析要有过程数据。最容易利用的数据包括:

  • 各题型得分率。
  • 各知识点错误率。
  • 答题时长与题目分值之间的关系。
  • 主观题高频扣分原因。

这些数据不需要大模型也能算,但大模型可以把统计结果转成自然语言建议。例如系统统计出“二次函数相关题目得分率不足 40%”,模型可以生成一份 150 字的学习建议,推荐相关练习方向。

6.2 分析接口设计

/api/analysis/student/{userId} 接口返回 JSON,结构大致如下:

json复制{
  "userId": 1001,
  "totalExams": 12,
  "averageScore": 86.5,
  "weakKnowledgePoints": [
    {
      "point": "二次函数",
      "accuracy": 0.36,
      "advice": "建议加强函数图象与性质专项练习,重点理解顶点式与交点式的应用场景。"
    }
  ]
}

生成建议的代码不要写成长 SQL 加超长 Java 逻辑,而是拆成两步:先查询统计结果,再判断是否满足调用大模型的阈值,如薄弱知识点数量大于 2 且最近考试数量大于 3。这样避免每次请求都消耗模型调用费用。

7. 运行验证与常见问题排查

7.1 初始化数据与启动检查

项目启动前,需要先初始化数据库和基础账号。建议准备一个 data.sql,包含一个管理员、一个教师、一个学生账号,以及少量题目数据。

启动后按以下顺序验证:

  1. 访问 Swagger 或 Knife4j 地址,确认接口文档加载。
  2. 调用登录接口获取 Token。
  3. 使用 Token 调用用户信息接口。
  4. 创建一场考试,考生进入考试。
  5. 交卷后确认客观题分数自动生成。
  6. 对有主观题的考试触发 AI 评分任务,查看日志中的模型返回内容。

推荐把这一操作序列整理成 Postman 或 Apifox 集合,作为回归测试脚本的一部分。

7.2 常见问题排查表

下表汇总了示例项目中最容易踩到的六个问题,均配有现象、原因和检查路径。

问题现象 常见原因 检查方式 处理建议
接口返回 401 JWT 过期、Token 未带、用户角色被禁用 检查 Header、Token 解析日志 确认认证过滤器执行顺序与白名单配置
登录成功但访问某些接口 403 角色权限配置不匹配 查看 Security 日志和 @PreAuthorize 注解 按角色分配权限,不直接放行全部接口
数据库时间比当前时间少 8 小时 JDBC URL 缺少 serverTimezone 查询数据库时间和 JVM 时间 统一设置为 Asia/Shanghai
AI 调用超时 网络问题、模型服务负载高、参数过大 检查调用日志耗时和错误堆栈 增加超时时间,开启重试,接入异步任务
AI 输出无法解析 模型没有按 JSON 格式返回 打印原始输出到日志 在解析层增加清洗逻辑,并转人工兜底
交卷后分数少算或重复算 事务边界不对、状态未锁定 检查 @Transactional 与状态判断逻辑 记录锁定采用 select ... for update 或状态版本号

7.3 结合日志定位 AI 评分失败

AI 相关功能失败时,日志必须能回答四个问题:

  • 调用哪个模型,传入哪个模板。
  • 请求耗时是多少。
  • 原始返回内容是什么。
  • 解析失败发生在哪个字段。

因此,在 AiChatClient 实现类里至少记录以下日志:

text复制[AiChatClient] model={}, promptTemplate={}, costMs={}, output={}

不要在大模型接口这类外部依赖上省日志。如果线上出现大批量调用失败,没有这一步会非常被动。

8. 生产环境落地的额外保障

8.1 安全与合规边界

在线考试系统涉及学生数据、成绩数据和答题内容,生产环境需要注意三个基本问题:

  • 数据库连接、大模型密钥都通过环境变量或密钥管理服务注入,不持久化到代码仓库。
  • 用户密码使用 BCrypt 加密,JWT 密钥定期轮换。
  • AI 生成内容只能作为草稿和参考,不能直接作为正式试题或最终评分,保留人工审核环节。

从产品设计上,还应该在页面对 AI 生成结果做出明确标识,例如“本题由 AI 生成,尚未审核”或“评分为 AI 参考建议,最终以教师批改为准”。

8.2 性能与资源优化

因为引入了外部大模型调用,系统性能瓶颈往往不在数据库,而在 AI 调用链路。核心优化手段有三个。

第一个是异步化。组卷、评分、学情建议都放进异步任务中执行,让 HTTP 请求快速响应。

第二个是缓存。题库列表、试卷元数据、学生基本信息等读多写少的数据,可以使用本地缓存或 Redis 缓存。AI 生成结果短时间重复请求的情况较少,不建议缓存,但同一场考试的评分结果可以按答题记录缓存。

第三个是数据库层优化。exam_answer 表按 record_id 建立索引,exam_record 表按 user_id 和 status 建立联合索引,避免全表扫描。

8.3 可复用清单:上线前检查表

下面的清单可以直接打印成文档,在测试环境验收时逐项确认。

  • 固定题目试卷能否正常创建、编辑、发布。
  • 考生在答题中途刷新页面,答题记录是否保留。
  • 考试截止时间到达后,后端是否自动终止答题。
  • 重复提交交卷请求,系统是否只处理一次。
  • 客观题分数计算是否与预期一致。
  • 主观题 AI 评分是否进入待审核状态,教师确认后是否更新最终分。
  • AI 服务不可用或超时时,考试主流程是否不受影响。
  • 管理员禁用试卷后,考生是否无法继续进入考试。
  • 所有外部密钥是否通过环境变量注入。
  • 日志中能否看到 AI 请求的耗时与原始返回。

8.4 后续扩展方向

示例项目保留了清晰的扩展点。如果要在真实项目中使用,建议按以下优先级演进:

  • 引入 Redis 存储考试会话和答题缓存,降低数据库压力。
  • 引入消息队列处理 AI 组卷和评分任务,支持失败重试。
  • 增加试卷审批流,保证考试发布前有复核环节。
  • 把 AI 调用接入统一网关,支持多模型切换、用量统计和配额控制。
  • 增加防作弊能力,包括切屏记录、答题轨迹分析、IP 异常检测。
  • 基于考试数据持续迭代提示词模板,建立不同科目、不同题型的提示词版本库。

扩展的前提是先保证核心考试链路稳定。AI 是增强能力,不是业务底座。先把权限、状态机、数据一致性这些基本功做扎实,再让大模型放大系统的自动化能力,整个项目才会既可用又可维护。

内容推荐

CordisBench:用状态机评测大模型对组件生命周期的动态推理能力
CordisBench · 组件生命周期 · 状态机
在动态智能体系统中,组件常于对话过程、工具调度或异步事件流中被动态注册、初始化和销毁,其生命周期比传统后端服务更难跟踪。这要求大模型具备对运行时状态的持续推理能力,而不仅仅是静态代码理解。CordisBench 正是针对这一能力缺口设计的评估方向,它借助组件快照、事件日志与依赖关系构造评测样本,用状态机模拟生命周期迁移,考察模型能否判断当前状态并预测下一事件。本文从状态机与事件驱动原理入手,介绍如何搭建最小生命周期评测脚手架,包括样本生成、Prompt 设计、答案归一化与准确率计算。该方法适用于智能体可观测性、自主运维和 Agent Harness 评估等场景,帮助开发者定位大模型在状态追踪上的真实短板。
Hermes Skill 实战指南:智能体技能注册、编排与安装详解
Hermes Skill · 技能注册 · 技能编排
在智能体与自动化系统开发中,技能模块化是降低维护成本、提升复用性的关键思路。传统直接写死函数调用的方式,在面对多业务流程时会陷入反复修改主流程的困境。基于统一技能抽象层,Hermes Skill 为技能注册、路由、执行与编排提供了标准化的解决方案。开发者只需按规范定义技能描述文件并实现执行器,即可通过扫描或配置完成注册,由框架统一处理鉴权、限流及调用链管理。无论是企业内部自动化流程、多系统集成,还是大模型驱动的智能体平台,这种设计都能让能力管理更规范、替换更灵活。本文从环境准备、核心组件、配置原理到 Spring Boot 项目中的完整安装与验证流程,逐步拆解落地要点,并针对扫描不到技能、接口 404、线程池耗尽等常见问题给出排查建议,帮助开发者在工程实践中快速上手并建立可演进的技能管理体系。
大模型应用开发全家桶:LLM+RAG+Agent+MCP+工作流双技术栈实践
大模型应用开发 · LLM · RAG
大型语言模型(LLM)的工程化落地已从单次对话转向多模块协作,开发者普遍面临如何组织代码以集成RAG、Agent、MCP、工作流和工具调用的难题。本文从工程架构角度,剖析一套不绑定特定厂商、不局限于单一语言的大模型应用全家桶设计思路。通过接口隔离和分层抽象,将模型能力与业务系统解耦,使知识库问答、智能客服、自动化流程等场景快速接入。结合FastAPI与Spring Boot双版本示例,展示LLM接入、检索增强生成、Agent决策循环、工具标准化协议及流程编排的具体实现方法,帮助团队构建可测试、可维护、可跨语言协作的AI应用骨架。
AI大模型应用实战全家桶:从0带敲RAG、Agent与MCP双版本
大模型应用开发 · LLM · RAG
大模型应用开发正在成为后端工程师的新技能栈。除了直接调用LLM接口,还需要理解检索增强生成(RAG)、智能体(Agent)、模型上下文协议(MCP)等核心概念。RAG通过外部知识库检索辅助模型生成,解决私有领域问答;Agent借助工具调用完成多步决策;MCP则统一了外部能力接入方式。这些技术在实际工程中常组合使用,形成知识库问答、智能助手等典型场景。然而,不同技术栈的落地方式差异较大,Python和Java开发者往往需要各自的参考实现。本文介绍一套从0带敲的AI大模型应用实战全家桶,完整覆盖LLM接入、RAG、Agent、MCP、工作流与工具调用,并提供FastAPI和Spring Boot双版本代码,帮助读者在真实业务中快速搭建可复用的大模型应用骨架。
TimesFM:零样本时间序列预测基础模型怎么用?
TimesFM · 时间序列基础模型 · 零样本预测
时间序列预测是数据分析中的经典难题,传统方法往往需要针对每个数据集单独调参,成本高昂。以Transformer为代表的基础模型架构,通过在大规模时序数据上预训练,学到了通用的趋势与周期规律,从而支持零样本预测:直接输入原始序列即可得到合理基线,无需重新训练。TimesFM正是这一技术路线的开源实现,在冷启动、批量基线生成等场景中,能显著降低建模门槛,帮助工程师快速判断数据潜力。理解其patch切分与decoder-only设计,能更好地在实际预测任务中落地。
陌生开源仓库评估实战:从环境配置到批量任务的全流程指南
开源仓库 · 环境配置 · 批量任务
开源软件生态中,面对信息不全的GitHub仓库,如何快速判断其真实用途与可运行性是开发者普遍面临的难题。合理评估一个项目,不能依赖名称或star数量,而应从仓库结构、依赖文件与语言构成反推其类型,再通过环境隔离与硬件检查确保可复现性。最小样例测试是验证输入输出链路的关键手段,参数调整需先理解默认值的边界,而批量任务则考验资源管理与错误隔离能力。本文以Sequoia-X为切入点,系统拆解一套从项目类型判断到生产化评估的完整流程,覆盖依赖管理、硬件适配、性能边界等高频问题,帮助开发者降低试错成本,同时规避文档缺失与维护停滞等潜在风险。
Hermes Skill实战:从安装到编写可复用的AI智能体技能包
Hermes · Skill · AI智能体
在AI智能体开发中,如何让模型从“能用”变成“好用”,关键在于构建一套可复用、可编排的能力单元——技能(Skill)。技能机制将原子工具、Prompt指令与业务规则封装为轻量模块,主程序通过约定协议自动发现并加载,从而提升系统的扩展性与可维护性。基于开放原子基金会的开源项目Hermes Agent,企业可在私有化部署环境下搭建完整的智能体服务,通过安装辅助系统Skill、配置模型接口、编写指令文件等步骤,快速沉淀团队知识资产。本文从技能设计原理出发,结合工程实践演示最小技能包与执行脚本的编写,并梳理环境配置、路径兼容、权限隔离等高频问题的排查思路,帮助开发者从零跑通一套可落地的智能体技能管理体系。
AI大模型应用开发全家桶:LLM、RAG、Agent与MCP实战
大模型应用开发 · LLM · RAG
大模型应用开发正从单一API调用走向系统化工程。理解LLM(大语言模型)的推理能力、RAG(检索增强生成)的知识外挂、Agent的自主决策、MCP(模型上下文协议)的工具标准化,以及工作流的任务编排,是构建生产级AI应用的基础。本文以FastAPI和Spring Boot双技术栈为例,从环境搭建到代码实现,演示如何将模型调用、知识检索、工具调用与任务编排串成完整链路,帮助开发者建立从概念到落地的工程化地图,避开常见工程陷阱。
从0到实战:AI大模型应用全家桶双版本落地指南
LLM · RAG · Agent
AI大模型应用正从单一的对话接口走向复杂的工程链路。理解LLM作为认知底座、RAG补充外部知识、Agent驱动多步决策、MCP标准化工具接入、工作流固化稳定路径,以及工具调用作为执行手段,是构建可落地系统的关键。这些技术协同工作,能帮助企业将大模型能力嵌入真实业务场景,如私有知识问答、自动化流程处理和跨系统协同。本文以FastAPI与SpringBoot双版本为主线,从环境搭建、最小实现到验证与排错,完整拆解一条能跑通的AI应用开发链路,为需要从接口调用进阶到完整应用开发的工程师提供实战参考。
原生统一多模态模型:理解与生成的协同实现指南
原生统一多模态模型 · 理解与生成协同 · 多模态大模型
多模态大模型正从模块拼接走向原生统一架构,核心挑战在于让理解与生成在同一套参数内协同工作。理解-生成协同(Understanding-Generation Synergy)要求模型在表征层、任务层、系统层统一设计:通过VQGAN等图像离散化技术将视觉信息转化为统一token序列,让图像与文本在同一个序列空间自回归建模;将视觉问答、文生图等任务统一为序列生成目标,简化多任务训练;同时兼顾训练与推理的系统工程优化。这种架构能显著降低部署成本,并提升模型对跨模态内容的理解与创作能力。本文面向多模态模型开发者和研究者,拆解原生统一模型的设计逻辑,并给出从表征到任务的代码示例和系统部署建议,帮助读者快速建立多模态理解与生成一体化的工程落地思路。
SpringBoot + AI大模型:在线考试系统智能化改造实战指南
SpringBoot · AI大模型 · 在线考试系统
在线考试系统正从传统客观题判分向智能化方向演进,其核心在于将AI大模型能力与业务场景深度融合。基于SpringBoot构建的考试主链路,通过统一封装模型调用接口、设计异步批改队列和完整的评分记录表,可以实现自动组卷、智能阅卷与考情分析。这类系统广泛应用于校园测评、企业培训、认证考试等标准化考试场景,能够有效降低教师重复劳动、缩短成绩反馈周期。工程落地的关键在于异步化处理、Prompt版本管理、人工复核机制以及token成本控制,同时需关注数据脱敏与合规要求。本文从系统架构、数据库设计、模型接入、组卷算法到智能阅卷全流程,给出可落地的工程实现方案。
AI大模型应用开发实战:LLM+RAG+Agent+MCP+工作流全家桶搭建
LLM · RAG · Agent
在大模型应用开发中,LLM、RAG、Agent、MCP与工作流常被割裂理解,导致落地困难。实际上,这些能力是分层协同的整体:LLM负责生成,RAG提供外部知识,工具调用赋予行动力,Agent驾驭多步推理,MCP统一工具接入,工作流固化业务路径。本文以一次真实请求为例,演示如何通过统一消息格式将这些模块串成一套可运行的后端服务骨架,并同时提供FastAPI与Spring Boot双版本实现。从最小闭环出发,逐步替换生产组件,最终覆盖智能问答、知识检索、自动化工具调用与固定流程编排等场景,帮助企业开发者从“调用模型接口”迈向“搭建完整AI应用服务”。
SpringBoot+AI大模型在线考试系统:智能出题、批改与学情分析实战
SpringBoot · AI大模型 · 在线考试系统
在线考试系统是后台开发中的常见项目,但如何让AI大模型真正参与业务,而不只是简单调用接口?从技术架构看,SpringBoot提供了稳定的业务骨架,AI大模型则负责主观题批改、智能出题与学情分析等核心环节。这类系统在设计上需遵循“AI辅助而非依赖”的原则,通过结构化提示词、异步任务和降级策略保证考试流程可靠。其典型应用场景包括教师批量生成题目、学生交卷后的自动评分以及基于考试数据生成个性化学习报告。对于毕业设计或企业培训平台,掌握AI接口封装、任务状态管理和异常处理,比堆砌功能更有价值。本文围绕系统边界、表结构设计、AI接入位置和性能优化,完整拆解一个生产可用的在线考试系统落地过程。
LLM-as-a-Judge摘要评估实战:机制、提示词设计与避坑指南
LLM-as-a-Judge · 摘要评估 · ROUGE
大语言模型的推理能力为文本质量评估提供了新思路。传统ROUGE指标仅统计词面重叠,难以衡量摘要的语义忠实度与信息覆盖。LLM-as-a-Judge让模型像人一样阅读原文与摘要,按指定维度给出可解释评分,支持相关性、连贯性、忠实度等细粒度诊断。该方案在摘要评测、RAG答案质量验证、模型对比等场景中逐渐成为主流。但评估效果高度依赖提示词设计、评分锚点、采样配置与位置偏差处理。系统拆解了直接打分、成对比较、多维度评估三种机制,并提供最小可行验证流程和常见陷阱排查思路,帮助开发者搭建可靠、可复现的自动评估体系。
轻量快速模型实战:Gemini 3.8 Flash 如何优化成本与批量工作流
Gemini 3.8 Flash · 轻量模型 · 批量处理
在大模型应用逐渐普及的今天,如何平衡推理质量、响应速度与调用成本,成为开发者落地 AI 能力时最现实的考量。轻量快速模型正是为了应对这一挑战而出现:它并非简单弱化版,而是针对低复杂度、高重复度任务重新设计的精度与成本平衡方案。通过降低单次请求延迟、提升并发吞吐能力,这类模型让批量文本抽取、格式化输出、内容预分类等场景得以低成本嵌入现有流程。工程实践中,合理的输入清洗、结构化提示词、输出校验与日志观测,能显著提升模型的稳定性和可维护性。以 Gemini 3.8 Flash 为代表的小模型,尤其适合作为工作流中的“第一层过滤器”,帮助开发者将重复劳动从人工中解放出来,实现更快、更可控的自动化处理。
Claude一小时实战:小应用、Skills、浏览器操作与业务自动化闭环
Claude · 大模型 · 业务自动化
在人工智能与自动化技术加速落地的今天,RPA(机器人流程自动化)与大模型辅助开发已成为企业提升效率的重要抓手。其核心逻辑是:先由模型理解自然语言需求,再通过脚本、标准技能包和浏览器控件将重复动作固化为可复用流程。这种模式显著降低内部工具的开发门槛,让运营与开发人员只需描述输入、处理逻辑、输出形式,即可获得可运行的小应用和业务流程闭环。常见于报表整理、网页填表、摘要生成等高频场景。围绕 Claude 的一小时实战,从环境准备到小应用、Skills、浏览器操作与业务自动化连穿的链路,正是验证这套方法的最短路径。
Gemini 3.8升级指南:多模态与长上下文下的模型评估与接入实践
Gemini 3.8 · 多模态 · 长上下文
大模型版本迭代日益频繁,开发者如何理性应对?从多模态与长上下文两大技术主线出发,解析Gemini系列模型的能力演进与性价比变化。通过建立业务测试集、平行对比输出质量与格式稳定性,以及灰度接入与回滚机制,帮助团队在新模型发布后快速完成技术选型。同时给出Python调用Gemini API的完整示例,覆盖文本、图像及批量回归场景,并提供隐患排查与工程实践建议。无论你正在构建Agent应用还是优化既有AI流程,这套方法都能让你在模型升级中掌握主动权。
Claude新模型升级实践:从API迁移评估到Token成本优化全指南
Claude模型升级 · API迁移 · Token成本控制
在LLM应用开发中,模型迭代频繁,新版本往往宣称“更强、更便宜”,但真实落地时,能力提升和成本下降并不必然转化为业务收益。开发者需要理解大模型API的Token计费结构、上下文缓存机制、输出长度控制等基础原理,才能科学评估迁移价值。模型评测是迁移的第一关,通过建立业务场景基线、对比新旧模型输出质量,才能判断是否值得切换。工程实践中,将模型ID配置化、灰度发布、提示词版本管理、异常排查等环节环环相扣。同时,成本优化不能只看单价,还要关注输出Token膨胀、重复调用、缓存命中率等现实因素。本文梳理了一套从模型评测、API接入、迁移评估到成本控制的实操方法,帮助使用Claude API或做LLM选型的开发者,在模型升级浪潮中稳妥获利。
TimesFM:Google开源时间序列基础模型,零样本预测与工程实践指南
时间序列预测 · 基础模型 · 零样本
时间序列预测是业务决策中的高频需求,但传统建模流程复杂,且每个场景都需要重新调参与训练。TimesFM是Google Research开源的时序基础模型,基于Transformer架构与patching机制,将时间序列切分为patch并预训练在真实世界海量数据上,从而实现对任意新序列的零样本预测。其核心价值在于压缩了从数据到预测的链路,无需特征工程与逐序列训练,即可快速获得可靠的基线结果,显著降低工程交付成本。该模型适用于销量预估、流量监控、库存管理等多序列批量预测场景,尤其适合缺少历史数据或数据质量参差不齐的业务。围绕TimesFM,可以了解其架构原理、输入数据规范、零样本推理流程及反归一化等关键细节,为实际项目选型和工程接入提供直接参考。
AI训练数据退出机制配置指南:防止输入输出用于训练
数据隐私 · AI训练数据 · opt out
在人工智能与数据隐私的交汇点,训练数据合规已成为企业与开发者必须掌握的基础能力。许多AI平台默认将用户输入与输出数据纳入模型优化流程,由此催生了所谓的数据退出(opt out)机制——一种用于阻断服务数据向训练数据流转的设置。理解其原理,即区分“用于服务”与“用于训练”,是应用数据治理与保护敏感信息的关键。该机制广泛应用于个人隐私设置、企业数据管控、API请求声明及本地部署等场景。系统梳理通用退出配置流程、请求级标记方法、验证技巧与兜底策略,为应对外部AI服务中的训练数据采集风险提供了可落地的排查体系。
已经到底了哦
精选内容
热门内容
最新内容
SpringBoot集成AI大模型的在线考试系统:从组卷到学情分析
在企业级应用开发中,如何将大模型能力嵌入传统业务系统是当前工程实践的热点。在线考试系统作为典型的管理信息系统,其核心流程包含题库管理、权限控制、组卷、答题与判分等环节。传统实现往往依赖人工选题与手工评阅,难以高效支撑主观题评分和个性化学情分析。引入AI大模型后,系统能够自动生成候选题目、提供主观题评分参考、并基于考试数据生成学习建议。但工程落地的关键在于将这些能力封装为可靠的服务,与SpringBoot后端、数据库设计和权限体系有机结合。本文基于SpringBoot 3.x,结合Spring Security与MyBatis-Plus,演示一套涵盖AI组卷、AI辅助评分、学情分析的最小可运行系统,并重点讲解接口抽象、结构化输出、异步调用与降级策略,帮助开发者构建可扩展、可追溯的智能考试平台。
Hermes Skill:让大模型 Agent 实现技能化扩展的工程指南
大模型Agent在业务落地中常面临能力固化、扩展困难的问题。技能化扩展机制将模型能力与业务逻辑解耦,把工具调用、规则执行封装为可插拔的技能单元,使Agent能动态适配查询、调度等实际场景。基于清单描述与运行时调度的架构,可显著提升开发效率与系统稳定性。以Hermes Skill为例,展示技能化扩展的概念原理、安装流程、调试方法与最佳实践,为企业构建灵活可控的智能体应用提供工程参考。
Claude工作流实战:提示词、Projects、Skills与连接器组合用法
在AI应用开发与自动化脚本场景中,仅仅将对话式AI视为“智能聊天框”会极大限制其工程价值。真正提升效率的关键,在于构建一套可复用、可维护的AI工作流。核心原理包括四个层面:提示词工程作为交互底座,负责明确任务目标与输出约束;Projects提供跨对话的长期上下文管理,解决模型冷启动问题;Skills将专业处理流程结构化封装,固化代码审查、接口生成等标准动作;连接器则打通外部系统数据,实现实时数据闭环。四者协同可支撑文档生成、团队知识管理等真实业务场景,让模型从被动应答转为主动执行。本文完整拆解这套组合用法,并提供可直接落地的中英双语实践模板,帮助开发者建立稳定高效的Claude使用方式。
千问3.8本地部署Agent:用DeepSeek Harness零成本编排任务
大模型本地部署是当前开发者摆脱付费API依赖的可行路径,通过开源权重模型搭建私有推理环境,能让数据全程不出本机。在此基础上,Agent作为一种具备决策与工具调用能力的运行模式,可自动拆解目标、调用外部工具并循环推进;而任务编排框架(如DeepSeek Harness)则负责将模型、工具与流程串联成稳定的自动化流水线。这类方案对预算有限的开发者、中低端显卡用户以及有数据隔离需求的工程场景尤其有价值,既能完成文件处理、信息抽取等本地Agent任务,又不必承担按Token计费的云端成本。本文以千问3.8本地部署为例,解读如何借助DeepSeek Harness构建可控的多模型协作工作流,同时提醒零成本口号背后的硬件要求、环境调试与维护投入,帮助读者更理性地把控落地节奏。
Codex实战:从自动补全到AI编程代理的完整指南
AI编程工具正从代码补全走向代理式智能体,核心差异在于前者补全单行代码,后者能自主执行命令、读写文件、运行测试并迭代修复。这类工具将一次完整的开发循环从小时级压缩到分钟级,尤其适合重构、补写测试和排查报错等可验证场景。但使用上限取决于需求描述能力,目标、上下文、约束与验收条件缺一不可。Codex作为其中代表性CLI工具,其安全边界与权限控制同样关键。本文从工程实践角度,拆解Codex的安装、任务描述、进阶用法、踩坑排查及适用边界,帮助开发者从“会用”走向“敢用”。
Claude一小时实战:从聊天到小应用、Skills与业务自动化
在AI工具普及的今天,很多人把大模型对话当作搜索引擎使用,但真正的价值在于构建可重复运行的自动化链路。从自然语言交互到工程化落地,核心是利用Claude的对话能力生成小应用、固化可复用的Skills、通过浏览器操作代替人工执行,最终串联成完整的业务自动化流程。理解输入定义、输出验证和过程重跑这三大原理,是技术落地的基础。这种能力不仅适用于程序员,也适合运营、产品等非技术角色处理周报汇总、数据清洗、表单填报等高频重复任务。本文以一小时实践为主线,拆解从临时对话到可复用工具的关键步骤,帮助你在真实业务场景中验证AI的工程价值,避免陷入“聊天式实战”的误区。
Gemini 3.8 Flash API接入实战:从最小请求到生产级配置
大模型应用开发中,API接入往往比模型选型更考验工程细节。理解HTTP请求结构、上下文窗口和生成参数,是构建稳定AI应用的基础。Gemini 3.8 Flash及Flash Cyber作为轻量级大模型,在文本摘要、信息抽取、客服问答等高频低延迟场景中具有实用价值。本文从最小请求出发,逐步讲解多轮会话的contents维护、结构化输出的JSON校验与兜底、403与429等错误码的区分和排查,以及生产环境下的成本控制、安全防护与灰度切换,为后端开发者提供一份可落地的接入清单。
开源项目分析实战:从Sequoia-X看环境配置与源码排错
开源项目是技术选型和工程实践中的重要资源,但面对一个陌生GitHub仓库,初学者往往止步于“能跑起来”。真正高效的分析方法,应建立在对仓库元信息、环境依赖、启动方式、源码链路和排错思路的系统拆解之上。通过掌握README、构建文件、配置项与外部依赖的识别技巧,可以快速判断项目定位;结合最小化启动、日志验证与分支覆盖阅读法,又能从“运行成功”走向“理解原理”。这套方法论适用于任何开源项目,尤其适合需要二次开发或集成到自己系统中的场景。本文以Sequoia-X为例,完整演示从克隆、环境准备到问题排查与PR提交的分析流程,帮助读者建立可复用的开源项目分析模板。
DeepSeek Harness:让AI记住历史决策的工程实践
大语言模型本身不具备持久记忆,每次调用只能依赖当前上下文。在AI客服、智能助手和自动化决策系统中,历史决策的丢失常导致建议反复、结论漂移。解决这一问题的关键在于将AI决策转化为可查询、可回放的显式工程资产。通过结构化的决策日志记录,结合场景化的历史摘要注入,模型能快速复用此前结论。在需求评审、技术选型、故障处理等典型场景中,这种机制不仅提升了决策一致性,还能为后续复盘和优化提供依据。DeepSeek Harness方法正是这样一套实践思路:它不依赖特定框架,而是通过外部存储、检索与提示词构造,让AI真正‘记住’历史决策。本文结合可运行代码示例,拆解其实现原理与常见坑位。
从Demo到生产:完整Agent体系的工具调用、记忆、协同与安全护栏
随着大模型能力的普及,AI Agent 正在成为连接语言模型与真实业务的关键载体。一个可用的 Agent 并非简单的模型循环调用,而是需要构建可控的执行体系。工具调用通过结构化协议让模型安全接入外部能力;长短记忆分层管理对话连续性与跨会话事实;人机协同将高风险决策分包给人工,平衡效率与风险;安全护栏以最小权限、执行边界和全程审计兜底。LangChain 与 LangGraph 等框架为这四层提供了工程化支撑,使 Agent 能真正从 Demo 走向生产。本文结合实战经验,系统拆解这四大核心维度,并为开发者提供从简单循环到完整体系的演进路径与排查思路,帮助你在真实业务中快速定位短板、补齐边界。
已经到底了哦