From fa296a6e4d2f7356f53b9a33d0b05d48522436bc Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Tue, 02 Sep 2025 15:51:23 +0800
Subject: [PATCH] feat(ai): 优化 AI 对话功能

---
 src/main/java/cc/mrbird/febs/ai/req/memberTalkStream/ApiMemberTalkMemberAnswerSavaDto.java |   27 +++++++++++++
 src/main/java/cc/mrbird/febs/ai/enumerates/AiTalkOutputEnum.java                           |    8 ++--
 src/main/java/cc/mrbird/febs/ai/req/memberTalkStream/AiPromptJsonReq.java                  |    2 +
 src/main/java/cc/mrbird/febs/ai/service/ApiMemberTalkStreamService.java                    |    7 +--
 src/main/java/cc/mrbird/febs/ai/service/impl/ApiMemberTalkStreamServiceImpl.java           |   25 +++++++++---
 src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkStreamController.java   |   14 ++++--
 6 files changed, 64 insertions(+), 19 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkStreamController.java b/src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkStreamController.java
index b482022..b13f133 100644
--- a/src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkStreamController.java
+++ b/src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkStreamController.java
@@ -1,10 +1,7 @@
 package cc.mrbird.febs.ai.controller.memberTalk;
 
 import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto;
-import cc.mrbird.febs.ai.req.memberTalkStream.AiTalkAnswerStreamDto;
-import cc.mrbird.febs.ai.req.memberTalkStream.ApiMemberTalkAnswerSavaDto;
-import cc.mrbird.febs.ai.req.memberTalkStream.ApiMemberTalkReloadStreamDto;
-import cc.mrbird.febs.ai.req.memberTalkStream.ApiMemberTalkStreamDto;
+import cc.mrbird.febs.ai.req.memberTalkStream.*;
 import cc.mrbird.febs.ai.req.talk.AiTalkAnswerStream;
 import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkItemVo;
 import cc.mrbird.febs.ai.res.memberTalkStream.ApiMemberTalkReloadStreamVo;
@@ -67,6 +64,13 @@
         return apiMemberTalkStreamService.historyPage(dto);
     }
 
+    @ApiOperation(value = "保存用户回答", notes = "保存答案")
+    @PostMapping(value = "/saveMemberAnswer")
+    public FebsResponse saveMemberAnswer(@RequestBody @Validated ApiMemberTalkMemberAnswerSavaDto dto) {
+
+        return apiMemberTalkStreamService.saveMemberAnswer(dto);
+    }
+
     @ApiOperation("回答(流式)")
     @ApiResponses({
             @ApiResponse(code = 200, message = "流式响应", response = cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkStreamVo.class),
@@ -79,7 +83,7 @@
         return apiMemberTalkStreamService.answer(dto);
     }
 
-    @ApiOperation(value = "保存答案", notes = "保存答案")
+    @ApiOperation(value = "保存AI回答", notes = "保存AI回答")
     @PostMapping(value = "/saveAnswer")
     public FebsResponse saveAnswer(@RequestBody @Validated ApiMemberTalkAnswerSavaDto dto) {
 
diff --git a/src/main/java/cc/mrbird/febs/ai/enumerates/AiTalkOutputEnum.java b/src/main/java/cc/mrbird/febs/ai/enumerates/AiTalkOutputEnum.java
index 417fd9b..5088bf5 100644
--- a/src/main/java/cc/mrbird/febs/ai/enumerates/AiTalkOutputEnum.java
+++ b/src/main/java/cc/mrbird/febs/ai/enumerates/AiTalkOutputEnum.java
@@ -9,13 +9,13 @@
 @Getter
 public enum AiTalkOutputEnum {
 
-    KEY_KNOWLEDGE(4,"只输出知识点总结","KEY_KNOWLEDGE"),
+    KEY_KNOWLEDGE(4,"根据问题和用户输入的内容,进行知识点总结。","KEY_KNOWLEDGE"),
 
-    REFERENCE_ANSWER(3,"只输出参考答案","REFERENCE_ANSWER"),
+    REFERENCE_ANSWER(3,"根据问题和用户输入的内容,输出参考答案。","REFERENCE_ANSWER"),
 
-    SUGGESTION(2,"只输出建议","SUGGESTION"),
+    SUGGESTION(2,"根据问题和用户输入的内容,给出建议并文字输出。","SUGGESTION"),
 
-    HIGH_LIGHT(1,"只输出亮点","HIGH_LIGHT");
+    HIGH_LIGHT(1,"根据问题和用户输入的内容,分析答案的亮点并文字输出。","HIGH_LIGHT");
 
     private final int type;
     private final String content;
diff --git a/src/main/java/cc/mrbird/febs/ai/req/memberTalkStream/AiPromptJsonReq.java b/src/main/java/cc/mrbird/febs/ai/req/memberTalkStream/AiPromptJsonReq.java
index 364e9a0..24af385 100644
--- a/src/main/java/cc/mrbird/febs/ai/req/memberTalkStream/AiPromptJsonReq.java
+++ b/src/main/java/cc/mrbird/febs/ai/req/memberTalkStream/AiPromptJsonReq.java
@@ -12,6 +12,8 @@
 
     private String task;
 
+    private String question;
+
     private String rule;
 
     private String outputFormat;
diff --git a/src/main/java/cc/mrbird/febs/ai/req/memberTalkStream/ApiMemberTalkMemberAnswerSavaDto.java b/src/main/java/cc/mrbird/febs/ai/req/memberTalkStream/ApiMemberTalkMemberAnswerSavaDto.java
new file mode 100644
index 0000000..0c5dc26
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/req/memberTalkStream/ApiMemberTalkMemberAnswerSavaDto.java
@@ -0,0 +1,27 @@
+package cc.mrbird.febs.ai.req.memberTalkStream;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+/**
+ * @author Administrator
+ */
+@Data
+@ApiModel(value = "ApiMemberTalkMemberAnswerSavaDto", description = "参数")
+public class ApiMemberTalkMemberAnswerSavaDto {
+
+
+    /**
+     * 用户对话ID (UUID)
+     */
+    @NotBlank(message = "会话ID不能为空")
+    @ApiModelProperty(value = "会话ID", example = "10")
+    private String memberTalkId;
+
+    @NotBlank(message = "回复内容不能为空")
+    @ApiModelProperty(value = "回复内容", example = "10")
+    private String content;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/service/ApiMemberTalkStreamService.java b/src/main/java/cc/mrbird/febs/ai/service/ApiMemberTalkStreamService.java
index 9994afd..93da81c 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/ApiMemberTalkStreamService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/ApiMemberTalkStreamService.java
@@ -2,10 +2,7 @@
 
 import cc.mrbird.febs.ai.entity.AiMemberTalk;
 import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto;
-import cc.mrbird.febs.ai.req.memberTalkStream.AiTalkAnswerStreamDto;
-import cc.mrbird.febs.ai.req.memberTalkStream.ApiMemberTalkAnswerSavaDto;
-import cc.mrbird.febs.ai.req.memberTalkStream.ApiMemberTalkReloadStreamDto;
-import cc.mrbird.febs.ai.req.memberTalkStream.ApiMemberTalkStreamDto;
+import cc.mrbird.febs.ai.req.memberTalkStream.*;
 import cc.mrbird.febs.common.entity.FebsResponse;
 import com.baomidou.mybatisplus.extension.service.IService;
 import reactor.core.publisher.Flux;
@@ -22,6 +19,8 @@
 
     FebsResponse historyPage(ApiMemberTalkItemPageDto dto);
 
+    FebsResponse saveMemberAnswer(ApiMemberTalkMemberAnswerSavaDto dto);
+
     Flux<FebsResponse> answer(AiTalkAnswerStreamDto dto);
 
     FebsResponse saveAnswer(ApiMemberTalkAnswerSavaDto dto);
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/ApiMemberTalkStreamServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/ApiMemberTalkStreamServiceImpl.java
index 3b1b327..d0bd09f 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/ApiMemberTalkStreamServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/ApiMemberTalkStreamServiceImpl.java
@@ -119,6 +119,20 @@
     }
 
     @Override
+    public FebsResponse saveMemberAnswer(ApiMemberTalkMemberAnswerSavaDto dto) {
+        String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid();
+        String memberTalkId = dto.getMemberTalkId();
+        String content = dto.getContent();
+
+        AiMemberTalk aiMemberTalk = this.getById(memberTalkId);
+        if (ObjectUtil.isNull(aiMemberTalk)){
+            throw new FebsException("对话不存在");
+        }
+        aiMemberTalkItemService.add(memberUuid,aiMemberTalk.getId(),2,content,new Date());
+        return new FebsResponse().success();
+    }
+
+    @Override
     public Flux<FebsResponse> answer(AiTalkAnswerStreamDto dto) {
 
         String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid();
@@ -151,9 +165,7 @@
         memberTalkItemQuery.orderByDesc(AiMemberTalkItem::getCreatedTime);
         memberTalkItemQuery.last("limit 1");
         AiMemberTalkItem aiMemberTalkItem = aiMemberTalkItemService.getByQuery(memberTalkItemQuery);
-        aiMemberTalkItemService.add(memberUuid,aiMemberTalk.getId(),2,reqContext,new Date());
-
-        String prompt = this.buildPrompt(aiProductRole.getPromptHead(), aiProductRole.getPromptTemplate(), type);
+        String prompt = this.buildPrompt(aiMemberTalkItem.getContext(),reqContext,aiProductRole.getPromptHead(), aiProductRole.getPromptTemplate(), type);
 
 
         List<LlmStrategyDto> llmStrategyDtoList = new ArrayList<>();
@@ -166,10 +178,11 @@
         return llmStrategyFactory.getCalculationStrategyMap().get(modelName).llmInvokeStreamingNoThink(llmStrategyDtoList);
     }
 
-    private String buildPrompt(String promptHead, String promptTemplate,Integer type){
+    private String buildPrompt(String question,String answer,String promptHead, String promptTemplate,Integer type){
         AiPromptJsonReq aiPromptJsonReq = new AiPromptJsonReq();
-        aiPromptJsonReq.setTask(promptHead);
-        aiPromptJsonReq.setRule(promptTemplate);
+        aiPromptJsonReq.setQuestion( question);
+        aiPromptJsonReq.setTask( promptHead);
+        aiPromptJsonReq.setRule( promptTemplate);
         String contentByCode = AiTalkOutputEnum.HIGH_LIGHT.getContentByType(type);
         aiPromptJsonReq.setOutputFormat(contentByCode);
 

--
Gitblit v1.9.1