一、项目背景

在现代企业客服场景中,智能对话系统已成为提升服务效率的关键技术。本文介绍一个基于Spring Boot和大模型的智能对话系统实现,该系统具备实时对话处理、历史对话管理和定时任务处理等核心功能。

二、系统架构设计

2.1 技术栈

  • 后端框架:Spring Boot 2.x

  • 数据库操作:MyBatis-Plus

  • JSON处理:FastJSON

  • 任务调度:Spring Scheduled

  • 模型集成:自定义大模型接口

2.2 核心类设计

@RestController
@RequestMapping("/big")
public class BigController {
    @Resource
    private SendMapper sendMapper;      // 消息发送Mapper
    @Resource
    private HistoryMapper historyMapper; // 历史记录Mapper
    @Resource
    private InfoMapper infoMapper;      // 对话信息Mapper
}

三、核心功能实现

3.1 实时对话处理(show_msg接口)

3.1.1 消息防重机制

系统通过时间窗口和内容比对防止重复消息处理:

// 20秒内相同消息拦截
public boolean isWithin20Seconds(Info existInfo) {
    if (existInfo == null || existInfo.getCreateTime() == null) {
        return false;
    }
    long currentTime = System.currentTimeMillis();
    long createTime = existInfo.getCreateTime().getTime();
    long timeDifference = currentTime - createTime;
    return timeDifference < 20000; // 20秒窗口
}
3.1.2 对话流程控制

系统区分首次对话和非首次对话,采用不同的响应策略:

// 首次对话:发送默认欢迎语
tempInfo2.setContent("您好,有台车要处理报废吗? 发下联系方式,给您沟通报价!");

// 非首次对话:调用大模型智能回复
String modelAnswer = SmartEntity_1.SmartWork(infoIn.getVisitor_id(), infoList);

3.2 消息补充机制(supply_msg接口)

该接口用于批量补充历史对话记录,确保对话完整性:

@PostMapping("/supply_msg")
public void supply_msg(@RequestBody InfoIn infoIn) {
    // 批量处理消息补充,避免重复插入
    for (InfoIn tempInfoIn : infoIn.getInfoInList()) {
        // 检查消息是否已存在
        QueryWrapper<Info> infoQueryWrapper = new QueryWrapper<>();
        infoQueryWrapper.eq("visitor_id", tempInfoIn.getVisitor_id())
                       .eq("content", tempInfoIn.getContent());
        Info existInfo = infoMapper.selectOne(infoQueryWrapper);
        
        if (existInfo == null) {
            // 插入新记录
            infoMapper.insert(existInfo);
        }
    }
}

3.3 定时任务处理(scheduledRefresh方法)

3.3.1 任务调度配置
@Scheduled(fixedRate = 60000) // 每60秒执行一次
public void scheduledRefresh() {
    // 处理超时对话逻辑
}
3.3.2 超时对话识别

系统识别5分钟无更新的对话进行批量处理:

public boolean isMoreThanTwoMinutes(Date createTime) {
    LocalDateTime createDateTime = createTime.toInstant()
                                           .atZone(ZoneId.systemDefault())
                                           .toLocalDateTime();
    LocalDateTime now = LocalDateTime.now();
    Duration duration = Duration.between(createDateTime, now);
    return duration.toMinutes() >= 5; // 5分钟超时
}
3.3.3 对话记录聚合与处理
// 按访客ID分组处理
Map<String, List<Info>> tempMap = allRecords.stream()
    .collect(Collectors.groupingBy(Info::getVisitorId));

// 拼接对话记录
StringBuilder chatMessage = new StringBuilder();
for (Info info : infoList) {
    String oneMsg = String.format("%s[%s]:%s",
        info.getType().equals("answer") ? "客服" : info.getVisitorId(),
        info.getCreateTime(),
        info.getContent());
    chatMessage.append(oneMsg).append("***");
}

四、数据库设计优化

4.1 对话信息表(Info)

  • visitor_id:访客唯一标识

  • content:消息内容

  • type:消息类型(question/answer)

  • role:角色(user/assistant)

  • create_time:创建时间

  • upload:上传状态标识

4.2 查询优化

使用MyBatis-Plus的Lambda表达式提高查询效率:

LambdaQueryWrapper<Info> wrapper = new LambdaQueryWrapper<>();
wrapper.orderByAsc(Info::getVisitorId)
       .orderByAsc(Info::getCreateTime)
       .isNull(Info::getUpload); // 过滤未上传记录

五、大模型集成策略

5.1 智能回复引擎

// 个性化回复生成
String modelAnswer = SmartEntity_1.SmartWork(visitorId, historyList);

// 对话总结与提取
String res = SmartEntity_2.SmartWork(visitorId, chatHistory);

5.2 电话号码验证

if (PhoneNumberValidator.isValidPhoneNumber(JSON.toJSON(res).toString())) {
    // 有效电话号码,执行上传
    String workRes = HttpUpload.doWork(res);
} else {
    // 标记为无效对话
    tempInfo.setUpload("无效对话记录");
}

六、异常处理与日志

6.1 统一异常处理

try {
    // 业务逻辑
    infoMapper.insert(tempInfo);
    return Res.success(tempInfo2);
} catch (Exception e) {
    e.printStackTrace(); // 生产环境应使用日志框架
    return Res.success("数据库操作发生异常" + new Date().toString());
}

6.2 日志输出

System.out.println("消息进入" + infoIn.getVisitor_id() + ":" + infoIn.getContent());
System.err.println("消息进入人大模型查到的消息:" + infoList.size());

七、性能优化建议

7.1 缓存策略

  • 对频繁查询的访客信息添加Redis缓存

  • 对话历史采用分页查询

7.2 数据库优化

  • visitor_idcreate_time添加复合索引

  • 定期归档历史对话记录

7.3 异步处理

  • 大模型调用改为异步非阻塞

  • 文件上传使用消息队列

八、部署与监控

8.1 部署建议

  • 使用Docker容器化部署

  • 配置Nginx负载均衡

  • 设置健康检查端点

8.2 监控指标

  • 接口响应时间

  • 大模型调用成功率

  • 数据库连接池状态

九、总结

本文详细介绍了基于大模型的智能对话系统设计与实现。系统通过实时对话处理、历史消息管理和定时任务调度,实现了完整的智能客服功能。关键技术点包括:

  1. 消息防重机制:20秒时间窗口防止重复处理

  2. 智能对话流程:区分首次和非首次对话场景

  3. 定时批量处理:5分钟超时对话自动汇总

  4. 大模型集成:个性化回复和对话总结

  5. 数据一致性:通过状态字段控制数据流转

该系统已在汽车报废咨询场景中得到验证,具有良好的可扩展性和稳定性,可根据不同业务需求快速适配。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐