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