From 63446c356df28f927e4d4735b2f867b278c1fec6 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Tue, 26 Aug 2025 11:38:30 +0800
Subject: [PATCH] refactor(ai): 优化 AI聊天功能代码
---
src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java | 73 ++++++++++++++++++++++++------------
src/main/java/cc/mrbird/febs/ai/controller/talk/ApiAiTalkController.java | 5 ++
src/main/java/cc/mrbird/febs/ai/req/talk/AiTalkAnswerStream.java | 1
3 files changed, 52 insertions(+), 27 deletions(-)
diff --git a/src/main/java/cc/mrbird/febs/ai/controller/talk/ApiAiTalkController.java b/src/main/java/cc/mrbird/febs/ai/controller/talk/ApiAiTalkController.java
index ada9ad3..ce47ea2 100644
--- a/src/main/java/cc/mrbird/febs/ai/controller/talk/ApiAiTalkController.java
+++ b/src/main/java/cc/mrbird/febs/ai/controller/talk/ApiAiTalkController.java
@@ -17,6 +17,7 @@
import cc.mrbird.febs.ai.service.AiMemberTalkService;
import cc.mrbird.febs.ai.service.AiTalkService;
import cc.mrbird.febs.common.entity.FebsResponse;
+import cn.hutool.core.util.StrUtil;
import io.swagger.annotations.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -96,7 +97,9 @@
})
@PostMapping("/answer-streamV2")
public Flux<FebsResponse> answerStreamV2(@RequestBody @Validated AiTalkAnswerStream dto) {
-
+ if (StrUtil.isEmpty(dto.getQuestion())){
+ return Flux.just(new FebsResponse().fail().message("请输入问题"));
+ }
return aiTalkService.answerStreamV2(dto);
}
}
diff --git a/src/main/java/cc/mrbird/febs/ai/req/talk/AiTalkAnswerStream.java b/src/main/java/cc/mrbird/febs/ai/req/talk/AiTalkAnswerStream.java
index 0f4836e..199a944 100644
--- a/src/main/java/cc/mrbird/febs/ai/req/talk/AiTalkAnswerStream.java
+++ b/src/main/java/cc/mrbird/febs/ai/req/talk/AiTalkAnswerStream.java
@@ -17,7 +17,6 @@
private String talkId;
- @NotBlank(message = "内容不能为空")
@ApiModelProperty(value = "内容", example = "10")
private String question;
}
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java
index cccfe88..1ea2e73 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java
@@ -428,31 +428,27 @@
String question = dto.getQuestion();
log.info("----- standard request -----");
+ // 参数校验
+ if (StrUtil.isBlank(question)) {
+ return Flux.just(new FebsResponse().fail().message("问题不能为空"));
+ }
List<ChatMessage> messages = new ArrayList<>();
+
final ChatMessage systemMessage = ChatMessage.builder()
.role(ChatMessageRole.SYSTEM)
.content("你是豆包,是由字节跳动开发的 AI 人工智能助手")
.build();
messages.add(systemMessage);
- //获取消息记录
- if (StrUtil.isNotEmpty(dto.getTalkId())){
+
+ // 获取历史消息记录
+ if (StrUtil.isNotEmpty(dto.getTalkId())) {
List<AiTalkItem> aiTalkItems = aiTalkItemService.getListByTalkId(dto.getTalkId());
- if(CollUtil.isNotEmpty(aiTalkItems)){
- for (AiTalkItem aiTalkItem : aiTalkItems){
- if (aiTalkItem.getType() == 1){
- ChatMessage memberMessage = ChatMessage.builder()
- .role(ChatMessageRole.USER)
- .content(aiTalkItem.getContext())
- .build();
- messages.add(memberMessage);
- }
- if (aiTalkItem.getType() == 2){
- ChatMessage assistantMessage = ChatMessage.builder()
- .role(ChatMessageRole.ASSISTANT)
- .content(aiTalkItem.getContext())
- .build();
- messages.add(assistantMessage);
+ if (CollUtil.isNotEmpty(aiTalkItems)) {
+ for (AiTalkItem aiTalkItem : aiTalkItems) {
+ ChatMessage chatMessage = buildChatMessageFromItem(aiTalkItem);
+ if (chatMessage != null) {
+ messages.add(chatMessage);
}
}
}
@@ -486,18 +482,24 @@
return new FebsResponse().success().data("END");
}
-
- ApiMemberTalkStreamVo apiMemberTalkStreamVo = new ApiMemberTalkStreamVo();
- // 判断是否触发深度思考,触发则打印模型输出的思维链内容
ChatMessage message = choice.getMessage();
- if (message.getReasoningContent()!= null &&!message.getReasoningContent().isEmpty()) {
- apiMemberTalkStreamVo.setReasoningContent(message.getReasoningContent());
- System.out.print(message.getReasoningContent());
+ ApiMemberTalkStreamVo apiMemberTalkStreamVo = new ApiMemberTalkStreamVo();
+
+ // 处理 reasoning content
+ String reasoningContent = message.getReasoningContent();
+ if (StrUtil.isNotEmpty(reasoningContent)) {
+ apiMemberTalkStreamVo.setReasoningContent(reasoningContent);
+ log.debug("Reasoning Content: {}", reasoningContent);
}
- String content = message.getContent() == null ? "" : message.getContent().toString();
+ // 安全处理 content
+ String content = "";
+ if (message.getContent() != null) {
+ content = message.getContent().toString();
+ }
apiMemberTalkStreamVo.setContent(content);
- System.out.print(content);
+ log.debug("Content: {}", content);
+
return new FebsResponse().success().data(apiMemberTalkStreamVo);
})
.onErrorResume(throwable -> {
@@ -507,6 +509,27 @@
});
}
+ // 提取为私有方法,提高可读性和复用性
+ private ChatMessage buildChatMessageFromItem(AiTalkItem item) {
+ if (item == null) return null;
+
+ switch (item.getType()) {
+ case 1:
+ return ChatMessage.builder()
+ .role(ChatMessageRole.USER)
+ .content(item.getContext())
+ .build();
+ case 2:
+ return ChatMessage.builder()
+ .role(ChatMessageRole.ASSISTANT)
+ .content(item.getContext())
+ .build();
+ default:
+ return null;
+ }
+ }
+
+
private Report tryRepairTruncatedJson(String truncatedJson) {
String[] repairAttempts = {
--
Gitblit v1.9.1