From a46c4d2db30c2f534400a6179cd82f7beb07a29d Mon Sep 17 00:00:00 2001 From: Administrator <15274802129@163.com> Date: Mon, 18 Aug 2025 09:54:23 +0800 Subject: [PATCH] feat(ai): 优化 AI 陪练问答流程 --- src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java | 84 +++++++++++++++++++++++++++++++++++------- 1 files changed, 70 insertions(+), 14 deletions(-) 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 fca39c3..fb2b2e7 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 @@ -1,11 +1,16 @@ package cc.mrbird.febs.ai.service.impl; +import cc.mrbird.febs.ai.controller.enumerates.AiTypeEnum; import cc.mrbird.febs.ai.entity.AiProductRole; +import cc.mrbird.febs.ai.req.ai.AiMessage; import cc.mrbird.febs.ai.req.ai.AiRequest; import cc.mrbird.febs.ai.res.ai.AiResponse; +import cc.mrbird.febs.ai.res.ai.RadarDataItem; import cc.mrbird.febs.ai.res.ai.Report; import cc.mrbird.febs.ai.service.AiProductRoleService; import cc.mrbird.febs.ai.service.AiService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.json.JSONUtil; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -98,7 +103,7 @@ } @Override - public AiResponse start(String productRoleId, String content) { + public AiResponse start(List<AiMessage> aiMessageDtoList,Integer type,String productRoleId, String content, String question) { if (!StringUtils.hasText(productRoleId)) { log.warn("productRoleId 不能为空"); return buildErrorResponse(CODE_NOT_FOUND, "AI陪练不存在"); @@ -110,19 +115,35 @@ return buildErrorResponse(CODE_NOT_FOUND, "AI陪练不存在"); } - String promptTemplate = aiProductRole.getPromptTemplate(); - String linkId = aiProductRole.getLinkId(); - if (!StringUtils.hasText(promptTemplate) || !StringUtils.hasText(linkId)) { - log.warn("角色配置不完整,promptTemplate 或 linkId 为空,productRoleId: {}", productRoleId); + String promptTemplate = "作为一个智能助手,请回答我提出的问题。"; + if (AiTypeEnum.QUESTION.getCode() == type){ + promptTemplate = aiProductRole.getPromptHead(); + } + if (AiTypeEnum.ANSWER.getCode() == type){ + promptTemplate = aiProductRole.getPromptTemplate()+question; + } + log.info("promptTemplate: {}", promptTemplate); + String linkId = aiProductRole.getLinkId(); + String jsonTemplate = aiProductRole.getJsonTemplate(); + + if ( + !StringUtils.hasText(promptTemplate) + || !StringUtils.hasText(linkId) + || !StringUtils.hasText(jsonTemplate) + ) { + log.warn("角色配置不完整,promptTemplate 或 linkId 或 jsonTemplate为空,productRoleId: {}", productRoleId); return buildErrorResponse(CODE_ERROR, "角色配置不完整"); } AiRequest aiRequest = new AiRequest(); aiRequest.setPromptTemplate(promptTemplate); + aiRequest.setJsonTemplate(jsonTemplate); aiRequest.setLinkId(linkId); aiRequest.setContent(content); - + if (CollUtil.isNotEmpty(aiMessageDtoList)){ + aiRequest.setAiMessageDtoList(aiMessageDtoList); + } return this.question(aiRequest); } @@ -131,19 +152,34 @@ String promptTemplate = aiRequest.getPromptTemplate(); String linkId = aiRequest.getLinkId(); String content = aiRequest.getContent(); - if (!StringUtils.hasText(promptTemplate) || !StringUtils.hasText(linkId) || !StringUtils.hasText(content)) { - log.warn("请求参数不完整,promptTemplate: {}, linkId: {}, content: {}", promptTemplate, linkId, content); + String jsonTemplate = aiRequest.getJsonTemplate(); + if ( + !StringUtils.hasText(promptTemplate) + || !StringUtils.hasText(linkId) + || !StringUtils.hasText(content) + || !StringUtils.hasText(jsonTemplate) + ) { + log.warn("请求参数不完整,promptTemplate: {}, linkId: {}, content: {}, jsonTemplate: {}", promptTemplate, linkId, content, jsonTemplate); return buildErrorResponse(CODE_ERROR, "请求参数不完整"); } - final List<ChatMessage> messages = new ArrayList<>(); - final ChatMessage systemMessage = ChatMessage.builder().role(ChatMessageRole.SYSTEM).content(promptTemplate).build(); - final ChatMessage userMessage = ChatMessage.builder().role(ChatMessageRole.USER).content(content).build(); + List<ChatMessage> messages = new ArrayList<>(); + ChatMessage systemMessage = ChatMessage.builder().role(ChatMessageRole.SYSTEM).content(promptTemplate).build(); + ChatMessage userMessage = ChatMessage.builder().role(ChatMessageRole.USER).content(content).build(); messages.add(systemMessage); + if (CollUtil.isNotEmpty(aiRequest.getAiMessageDtoList())){ + aiRequest.getAiMessageDtoList().forEach(aiMessageDto -> { + ChatMessage message = ChatMessage.builder() + .role(aiMessageDto.getRole()) + .content(aiMessageDto.getContent()) + .build(); + messages.add(message); + }); + } messages.add(userMessage); try { - JsonNode schemaNode = objectMapper.readTree(SCHEMA_JSON); + JsonNode schemaNode = objectMapper.readTree(jsonTemplate); ChatCompletionRequest.ChatCompletionRequestResponseFormat responseFormat = new ChatCompletionRequest.ChatCompletionRequestResponseFormat( "json_schema", new ResponseFormatJSONSchemaJSONSchemaParam( @@ -170,7 +206,6 @@ .filter(contentObj -> contentObj != null) .map(Object::toString) .collect(Collectors.joining()); - Report report = this.extractReportData(result); return buildSuccessResponse(report, result); } catch (JsonProcessingException e) { @@ -180,6 +215,27 @@ log.error("调用AI服务失败,modelId: {}", linkId, e); return buildErrorResponse(CODE_ERROR, "AI服务调用失败"); } + } + + public static void main(String[] args) { + Report report = new Report(); + List<RadarDataItem> radarDataItems = new ArrayList<>(); + + RadarDataItem item1 = new RadarDataItem(); + item1.setName("A"); + item1.setCode("A"); + item1.setScore("80"); + radarDataItems.add(item1); + + RadarDataItem item2 = new RadarDataItem(); + item2.setName("A"); + item2.setCode("A"); + item2.setScore("80"); + radarDataItems.add(item2); + report.setRadarDataItems(radarDataItems); + + System.out.println(JSONUtil.parse( report)); + } @Override @@ -278,7 +334,7 @@ public Report extractReportData(String modelOutput) { Matcher matcher = JSON_PATTERN.matcher(modelOutput); if (!matcher.find()) { - log.warn("未匹配到FunctionCall内容,原始输出长度: {}", modelOutput.length()); + log.warn("未匹配到FunctionCall内容,原始输出长度: {}", modelOutput); return null; } -- Gitblit v1.9.1