# 《AI智能客服系统》落地实现-第03节:业务逻辑层与接口层的设计与实现
作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)
沉淀,成长,突破,帮助他人,成就自我。
- 本章难度:★☆☆☆☆
- 本章重点:对AI智能客服系统的业务逻辑层和接口层的代码进行设计与实现,从全局角度掌握AI智能客服系统的整体项目结构。重点掌握AI智能客服系统的通用设计思路和设计方法,并能够将其灵活应用到自身实际项目中。
大家好,我是冰河~~
AI智能客服系统的数据模型与数据存储层的代码已经设计和实现完毕,接下来,我们就一起设计和手撸业务逻辑层和接口层的代码。
# 一、前言
相信各位小伙伴经过经过AI智能客服系统前面章节的学习,已经掌握了AI智能客服系统的数据模型与数据存储层的设计和实现。大家在学习项目时,最好是跟着专栏的源码自己手动敲一遍代码。设计和实现完数据模型与数据存储层的代码后,接下来,我们就重点设计和手撸业务逻辑层与接口层的代码。
# 二、本节诉求
对AI智能客服系统的业务逻辑层和接口层的代码进行设计与实现,从全局角度掌握AI智能客服系统的整体项目结构。重点掌握AI智能客服系统的通用设计思路和设计方法,并能够将其灵活应用到自身实际项目中。
# 三、核心设计
注意:本节只给大家展示AI智能客服系统业务逻辑层和接口层的核心类实现关系,其他代码的实现细节,大家可以自行到本节对应的源码分支进行查看,这里不再赘述。
AI智能客服系统业务逻辑层和接口层的核心类设计如图3-1所示。
本节,需要重点实现的类包括:AiBotService类、AiBotController类和HomeController类。
AiBotService类:AI智能客服系统的核心业务逻辑层实现类,通过SpringAI调用AI大模型,调用ChatMapper接口的方法读写数据表,都在这个类中实现。
AiBotController类:AI智能客服系统对外的核心数据交互接口,所有会话类、聊天类、系统健康检查类等接口,都在这个类中实现。
HomeController类:AI智能客服系统重定向首页的接口实现类,访问此类的接口会直接将请求重定向到系统首页。
# 四、编码实现
本节只给大家展示AI智能客服系统业务逻辑层和接口层的核心类编码实现,其他代码的实现细节,大家可以自行到本节对应的源码分支进行查看,这里不再赘述。
(1)实现AiBotService类
AiBotService类是AI智能客服系统的核心业务逻辑层实现类,通过SpringAI调用AI大模型,调用ChatMapper接口的方法读写数据表,都在这个类中实现。
源码详见:io.binghe.springai.bot.service.AiBotService。
@Slf4j
@Service
public class AiBotService {
private final ChatClient chatClient;
private final ChatLogsMapper chatLogsMapper;
@Value("${app.chatbot.system-prompt:你是一个专业的智能客服助手,请友好、专业地回答用户的问题。}")
private String systemPrompt;
@Value("${app.chatbot.max-history:5}")
private int maxHistory;
@Value("${app.chatbot.timeout:30000}")
private long timeout;
public AiBotService(ChatClient.Builder chatClientBuilder, ChatLogsMapper chatLogsMapper) {
this.chatClient = chatClientBuilder.build();
this.chatLogsMapper = chatLogsMapper;
}
/**
* 处理用户聊天请求
*/
public AiResponse sendMessage(AiRequest request) {
long startTime = System.currentTimeMillis();
try {
// 参数验证
if (request.getMessage() == null || request.getMessage().trim().isEmpty()) {
return AiResponse.error("发送的消息不能为空", request.getSessionId());
}
String message = request.getMessage().trim();
// 构建对话上下文
List<Message> messages = buildAiContext(request.getSessionId(), message);
// 调用AI获取响应
String aiResponse = callAIWithTimeout(messages);
long responseTime = System.currentTimeMillis() - startTime;
// 保存聊天记录
saveChatLogs(request.getSessionId(), message, aiResponse);
log.info("消息处理完成, 会话ID:{}, 耗时:{}ms", request.getSessionId(), responseTime);
return new AiResponse(aiResponse, request.getSessionId(), responseTime);
} catch (Exception e) {
long responseTime = System.currentTimeMillis() - startTime;
log.error("消息处理异常,会话ID: {}, 耗时: {}ms", request.getSessionId(), responseTime, e);
return AiResponse.error("系统繁忙,请稍后重试", request.getSessionId());
}
}
/*********************省略其他代码*********************/
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 查看完整文章
加入冰河技术 (opens new window)知识星球,解锁完整技术文章、小册、视频与完整代码
