From 85069103bd0b1a801924c660daad78aedd0bfb6c Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Thu, 18 Sep 2025 16:52:52 +0800
Subject: [PATCH] ``` feat(AiMemberTalkStreamService): 添加answerV3方法以支持流式生成报告
---
src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkStreamServiceImpl.java | 81 ++++++++++++++++++--------
src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkStreamService.java | 2
src/main/java/cc/mrbird/febs/ai/strategy/enumerates/LlmApplicationAppIdEnum.java | 2
src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkStreamController.java | 12 ++++
src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliApplicationLlmStrategyServiceImpl.java | 23 +------
src/main/java/cc/mrbird/febs/ai/req/memberTalkStream/ApiMemberTalkReportSavaDto.java | 3 -
6 files changed, 76 insertions(+), 47 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 3eb6323..200e143 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
@@ -93,6 +93,18 @@
return aiMemberTalkStreamService.answerV2(dto);
}
+ @ApiOperation("生成报告(流式)")
+ @ApiResponses({
+ @ApiResponse(code = 200, message = "流式响应", response = ApiMemberTalkStreamVoOld.class),
+ })
+ @PostMapping("/answerV3")
+ public Flux<FebsResponse> answerV3(@RequestBody @Validated AiTalkAnswerStreamDto dto) {
+ if (StrUtil.isEmpty(dto.getId()) || StrUtil.isEmpty(dto.getReqContext())|| StrUtil.isEmpty(dto.getReqContext())){
+ return Flux.just(new FebsResponse().fail().message("参数异常"));
+ }
+ return aiMemberTalkStreamService.answerV3(dto);
+ }
+
@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/req/memberTalkStream/ApiMemberTalkReportSavaDto.java b/src/main/java/cc/mrbird/febs/ai/req/memberTalkStream/ApiMemberTalkReportSavaDto.java
index 1d712d2..fbdfaa4 100644
--- a/src/main/java/cc/mrbird/febs/ai/req/memberTalkStream/ApiMemberTalkReportSavaDto.java
+++ b/src/main/java/cc/mrbird/febs/ai/req/memberTalkStream/ApiMemberTalkReportSavaDto.java
@@ -21,7 +21,4 @@
@ApiModelProperty(value = "回复内容", example = "10")
private String content;
- @NotNull(message = "类型ID不能为空")
- @ApiModelProperty(value = "类型 1:亮点 2:建议 3:参考答案 4:知识点总结", example = "10")
- private Integer type;
}
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkStreamService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkStreamService.java
index 6ad2653..8f475c0 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkStreamService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkStreamService.java
@@ -32,4 +32,6 @@
void updateMemberTalkUpdateTime(Integer state,Integer doneCnt,String memberTalkId, Date updateTime);
FebsResponse saveReport(ApiMemberTalkReportSavaDto dto);
+
+ Flux<FebsResponse> answerV3(AiTalkAnswerStreamDto dto);
}
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkStreamServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkStreamServiceImpl.java
index 001f00a..03f253e 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkStreamServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkStreamServiceImpl.java
@@ -11,6 +11,7 @@
import cc.mrbird.febs.ai.res.memberTalkStream.ApiMemberTalkStreamVo;
import cc.mrbird.febs.ai.service.*;
import cc.mrbird.febs.ai.strategy.LlmStrategyFactory;
+import cc.mrbird.febs.ai.strategy.enumerates.LlmApplicationAppIdEnum;
import cc.mrbird.febs.ai.strategy.enumerates.LlmStrategyEnum;
import cc.mrbird.febs.ai.strategy.param.LlmStrategyDto;
import cc.mrbird.febs.common.entity.FebsResponse;
@@ -30,10 +31,7 @@
import org.springframework.transaction.annotation.Transactional;
import reactor.core.publisher.Flux;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
+import java.util.*;
/**
* AI用户对话训练记录 Service实现类
@@ -257,21 +255,16 @@
llmStrategyDto = this.buildLlmStrategyDtoList(String.valueOf(type), 4);
llmStrategyDtoList.add(llmStrategyDto);
- LlmStrategyDto llmStrategyDtoMessage = buildMessages(state, memberTalkId);
- llmStrategyDtoList.add(llmStrategyDtoMessage);
String modelName = LlmStrategyEnum.getName(aiService.getSystemSetAiType());
-
return llmStrategyFactory.getCalculationStrategyMap().get(modelName).llmInvokeStreamingNoThink(llmStrategyDtoList);
}
- private LlmStrategyDto buildMessages(Integer state, String memberTalkId) {
+ private LlmStrategyDto buildMessages(String memberTalkId) {
LlmStrategyDto message = new LlmStrategyDto();
- if (1!= state){
- return message;
- }
LambdaQueryWrapper<AiMemberTalkItem> memberTalkItemQuery = Wrappers.lambdaQuery(AiMemberTalkItem.class);
memberTalkItemQuery.eq(AiMemberTalkItem::getMemberTalkId,memberTalkId);
+ memberTalkItemQuery.in(AiMemberTalkItem::getType,Arrays.asList(1, 2));
memberTalkItemQuery.orderByAsc(AiMemberTalkItem::getCreatedTime);
List<AiMemberTalkItem> aiMemberTalkItems = aiMemberTalkItemService.getListByQuery(memberTalkItemQuery);
if (CollUtil.isEmpty(aiMemberTalkItems)){
@@ -287,14 +280,12 @@
if (aiMemberTalkItem.getType() == 2){
llmStrategyDto.setRole(Role.USER.getValue());
}
- if (aiMemberTalkItem.getType() == 3){
- llmStrategyDto.setRole(Role.ASSISTANT.getValue());
- }
llmStrategyDto.setContent(aiMemberTalkItem.getContext());
messages.add(llmStrategyDto);
}
message.setRole(AiTypeEnum.MESSAGES.getName());
+ message.setContent(AiTypeEnum.MESSAGES.getName());
message.setMessages(messages);
return message;
@@ -397,25 +388,65 @@
this.updateMemberTalkUpdateTime(AiTypeEnum.AI_MEMBER_TALK_STATE_DONE.getCode(), aiMemberTalk.getDoneCnt(),aiMemberTalk.getId(), new Date());
- Integer type = dto.getType();
- String contentByCode = AiTalkOutputEnum.HIGH_LIGHT.getCodeByType(type);
- String analysis = aiMemberTalk.getAnalysis();
- HashMap<String, String> stringStringHashMap = new HashMap<>();
- if(StrUtil.isEmpty(analysis)){
- stringStringHashMap.put(contentByCode,content);
- }else{
- stringStringHashMap = JSONUtil.toBean(analysis, HashMap.class);
- stringStringHashMap.put(contentByCode,content);
- }
+// Integer type = dto.getType();
+// String contentByCode = AiTalkOutputEnum.HIGH_LIGHT.getCodeByType(type);
+// String analysis = aiMemberTalk.getAnalysis();
+// HashMap<String, String> stringStringHashMap = new HashMap<>();
+// if(StrUtil.isEmpty(analysis)){
+// stringStringHashMap.put(contentByCode,content);
+// }else{
+// stringStringHashMap = JSONUtil.toBean(analysis, HashMap.class);
+// stringStringHashMap.put(contentByCode,content);
+// }
aiMemberTalkMapper.update(
null,
Wrappers.lambdaUpdate(AiMemberTalk.class)
- .set(AiMemberTalk::getAnalysis,JSONUtil.toJsonStr(stringStringHashMap))
+ .set(AiMemberTalk::getAnalysis,content)
.eq(AiMemberTalk::getId,aiMemberTalk.getId())
);
return new FebsResponse().success();
}
+ @Override
+ public Flux<FebsResponse> answerV3(AiTalkAnswerStreamDto dto) {
+ String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid();
+ String memberTalkId = dto.getId();
+ AiMemberTalk aiMemberTalk = this.getById(memberTalkId);
+ if (ObjectUtil.isNull(aiMemberTalk)){
+ throw new FebsException("对话不存在");
+ }
+
+ LambdaQueryWrapper<AiProductRoleLink> productLinkQuery = Wrappers.lambdaQuery(AiProductRoleLink.class);
+ productLinkQuery.eq(AiProductRoleLink::getProductId,aiMemberTalk.getProductId());
+ productLinkQuery.last("limit 1");
+ AiProductRoleLink aiProductRoleLink = aiProductRoleLinkService.getByQuery(productLinkQuery);
+ if(ObjectUtil.isNull(aiProductRoleLink)){
+ throw new FebsException("产品没有关联AI陪练");
+ }
+
+ String productRoleId = aiProductRoleLink.getProductRoleId();
+ AiProductRole aiProductRole = aiProductRoleService.getById(productRoleId);
+ if (ObjectUtil.isNull(aiProductRole)){
+ throw new FebsException("产品AI陪练不存在");
+ }
+
+ String promptHead = aiProductRole.getPromptHead();
+
+ List<LlmStrategyDto> llmStrategyDtoList = new ArrayList<>();
+ LlmStrategyDto llmStrategyDto = this.buildLlmStrategyDtoList(promptHead, 1);
+ llmStrategyDtoList.add(llmStrategyDto);
+ llmStrategyDto = this.buildLlmStrategyDtoList("请按照要求生成报告", 2);
+ llmStrategyDtoList.add(llmStrategyDto);
+ llmStrategyDto = this.buildLlmStrategyDtoList(String.valueOf(LlmApplicationAppIdEnum.REPORT.getCode()), 4);
+ llmStrategyDtoList.add(llmStrategyDto);
+
+ LlmStrategyDto llmStrategyDtoMessage = buildMessages(memberTalkId);
+ llmStrategyDtoList.add(llmStrategyDtoMessage);
+ String modelName = LlmStrategyEnum.getName(aiService.getSystemSetAiType());
+
+ return llmStrategyFactory.getCalculationStrategyMap().get(modelName).llmInvokeStreamingNoThink(llmStrategyDtoList);
+ }
+
}
diff --git a/src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliApplicationLlmStrategyServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliApplicationLlmStrategyServiceImpl.java
index 7a158ef..6b5f9e7 100644
--- a/src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliApplicationLlmStrategyServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliApplicationLlmStrategyServiceImpl.java
@@ -39,6 +39,7 @@
private final String bizParam_1 = "prompt_ai_system";
private final String bizParam_2 = "question";
private final String bizParam_3 = "query";
+ private final String bizParam_4 = "messages";
private HashMap getPrompt(List<LlmStrategyDto> dto) {
HashMap<String, String> bizParamsMap = new HashMap<>();
@@ -52,25 +53,11 @@
if (StrUtil.equals(dtoItem.getRole(),Role.USER.getValue())){
bizParamsMap.put(bizParam_3, dtoItem.getContent());
}
- }
- return bizParamsMap;
- }
-
- private List<Message> getMessages(List<LlmStrategyDto> dto) {
- List<Message> messages = new ArrayList<>();
- for (LlmStrategyDto dtoItem : dto){
- if (StrUtil.equals(AiTypeEnum.MESSAGES.getName(), dtoItem.getRole())){
- List<LlmStrategyDto> messages1 = dtoItem.getMessages();
- for (LlmStrategyDto dtoItem1 : messages1){
- messages.add(Message.builder()
- .role(dtoItem1.getRole())
- .content(dtoItem1.getContent())
- .build());
- }
- break;
+ if (StrUtil.equals(dtoItem.getRole(),AiTypeEnum.MESSAGES.getName())){
+ bizParamsMap.put(bizParam_4, JSONUtil.toJsonStr(dtoItem.getMessages()));
}
}
- return messages;
+ return bizParamsMap;
}
private String getQuery(List<LlmStrategyDto> dto) {
@@ -178,7 +165,6 @@
throw new FebsException("百炼工作流初始化异常");
}
HashMap prompt = getPrompt(dto);
- List<Message> messages = getMessages(dto);
String query = getQuery(dto);
String appId = getAppId(dto);
if (prompt == null || prompt.size() == 0){
@@ -197,7 +183,6 @@
.appId(appId) //替换为实际的应用 ID
.flowStreamMode(FlowStreamMode.MESSAGE_FORMAT)
.prompt(query)
- .messages( messages)
.bizParams(JsonUtils.toJsonObject( prompt))
.build();
diff --git a/src/main/java/cc/mrbird/febs/ai/strategy/enumerates/LlmApplicationAppIdEnum.java b/src/main/java/cc/mrbird/febs/ai/strategy/enumerates/LlmApplicationAppIdEnum.java
index 12eef5b..1c06bad 100644
--- a/src/main/java/cc/mrbird/febs/ai/strategy/enumerates/LlmApplicationAppIdEnum.java
+++ b/src/main/java/cc/mrbird/febs/ai/strategy/enumerates/LlmApplicationAppIdEnum.java
@@ -5,6 +5,8 @@
@Getter
public enum LlmApplicationAppIdEnum {
+ REPORT(6,"48468fdcdfc340f2950e49559a4dbcd3","生成报告"),
+
NORMAL(5,"8ea7ab1665de4a88b868849318d72f45","通用"),
KEY_KNOWLEDGE(4,"8ea7ab1665de4a88b868849318d72f45","知识点总结"),
--
Gitblit v1.9.1