From ee7b48f64238fa86f9092f1fe1d73d32ac1eda1b Mon Sep 17 00:00:00 2001 From: liu Date: Tue, 23 Apr 2024 18:01:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/supervision/config/ResponseConfig.java | 4 ++-- .../com/supervision/controller/AskController.java | 14 ++++++++++---- .../handler/gpt/AnswerQuestionHandler.java | 4 ++-- .../handler/gpt/ConditionJudgeHandler.java | 14 ++++++++------ .../handler/gpt/ItemExtractHandler.java | 11 ++++++----- 5 files changed, 28 insertions(+), 19 deletions(-) diff --git a/kbqa-common/src/main/java/com/supervision/config/ResponseConfig.java b/kbqa-common/src/main/java/com/supervision/config/ResponseConfig.java index b46a8f9..857883e 100644 --- a/kbqa-common/src/main/java/com/supervision/config/ResponseConfig.java +++ b/kbqa-common/src/main/java/com/supervision/config/ResponseConfig.java @@ -70,9 +70,9 @@ public class ResponseConfig implements ResponseBodyAdvice { @ExceptionHandler(BusinessException.class) public GlobalResult businessExceptionResponse(BusinessException exception) { log.error(exception.getMessage(), exception); - Integer code = null == exception.getCode() ? HttpStatus.INTERNAL_SERVER_ERROR.value(): exception.getCode(); + int code = null == exception.getCode() ? HttpStatus.INTERNAL_SERVER_ERROR.value(): exception.getCode(); String message = StrUtil.isNotEmpty(exception.getMessage()) ? exception.getMessage() : "业务异常"; - return GlobalResult.error( code, exception.getMessage(), message); + return GlobalResult.error(code, exception.getMessage(), message); } diff --git a/kbqa-graph/src/main/java/com/supervision/controller/AskController.java b/kbqa-graph/src/main/java/com/supervision/controller/AskController.java index 1886ea8..ff7b692 100644 --- a/kbqa-graph/src/main/java/com/supervision/controller/AskController.java +++ b/kbqa-graph/src/main/java/com/supervision/controller/AskController.java @@ -39,7 +39,7 @@ public class AskController { try { return askService.roundTalk(roundTalkReqVO); } catch (Exception e) { - log.info("多轮对话过程中出现了异常,则说明多轮对话走不通,那么就根据sessionId获取Redis中的原始问题,直接走单轮对话"); + log.error("多轮对话过程中出现了异常,则说明多轮对话走不通,那么就根据sessionId获取Redis中的原始问题,直接走单轮对话", e); // 如果多轮对话过程中出现了异常,则说明多轮对话走不通,那么就根据sessionId获取Redis中的原始问题,直接走单轮对话 Object cache = redisTemplate.opsForValue().get(SESSION_PARAM + roundTalkReqVO.getSessionId()); SessionParamDTO sessionParamDTO = BeanUtil.toBean(cache, SessionParamDTO.class); @@ -54,9 +54,15 @@ public class AskController { @PostMapping("singleTalk") public SingleTalkResVO singleTalk(@RequestBody SingleTalkReqVO singleTalkReqVO) { log.info("单轮对话问题开始:{}", singleTalkReqVO.getUserTalk()); - SingleTalkResVO singleTalkResVO = askService.singleTalk(singleTalkReqVO); - log.info("单轮对话问题结束:{}", singleTalkReqVO.getUserTalk()); - return singleTalkResVO; + try { + SingleTalkResVO singleTalkResVO = askService.singleTalk(singleTalkReqVO); + log.info("单轮对话问题结束:{}", singleTalkReqVO.getUserTalk()); + return singleTalkResVO; + } catch (Exception e) { + log.error("单轮对话过程中出现了异常", e); + return SingleTalkResVO.builder().answerText("您好,我暂时还不会回答这个问题哦!").build(); + } + } @ApiOperation("多轮对话中用户手动填写参数,可能直接返回结果") diff --git a/kbqa-graph/src/main/java/com/supervision/handler/gpt/AnswerQuestionHandler.java b/kbqa-graph/src/main/java/com/supervision/handler/gpt/AnswerQuestionHandler.java index d90dbba..5a2d253 100644 --- a/kbqa-graph/src/main/java/com/supervision/handler/gpt/AnswerQuestionHandler.java +++ b/kbqa-graph/src/main/java/com/supervision/handler/gpt/AnswerQuestionHandler.java @@ -21,7 +21,7 @@ public class AnswerQuestionHandler { "\"\"\"{}\"\"\"\n" + "同时,有一个和用户的问答过程的记录供你参考以提供更精确的回答,内容是:" + "\"\"\"{}\"\"\"\n" + - "请用不超过 100 个词的长度准确和详细的回答用户的问题。"; + "请用不超过 100 个词的长度准确和详细的回答用户的问题。请直接给我最终答案,不要反问"; String askRecordTemplate = "问:{}\n 用户答:{};\n"; StringBuilder askRecord = new StringBuilder(); for (Map.Entry entry : talkRecord.entrySet()) { @@ -42,7 +42,7 @@ public class AnswerQuestionHandler { public String answerSingleQuestionNew(String question, Map> detailMap) { String template = "作为AI助手,你的任务是帮助用户查找和理解特定政务的政策内容并给于用户答案。在这个场景中,你将使用政策内容来回答用户问题:{}。请根据政策内容\n" + "\"\"\"{}\"\"\"\n" + - "并用不超过 100 个词的长度准确和详细的回答用户的问题。"; + "并用不超过 100 个词的长度准确和详细的回答用户的问题。请直接给我最终答案,不要反问"; List messageList = new ArrayList<>(); messageList.add(new MessageDTO("user", StrUtil.format(template, question, JSONUtil.toJsonStr(detailMap)))); diff --git a/kbqa-graph/src/main/java/com/supervision/handler/gpt/ConditionJudgeHandler.java b/kbqa-graph/src/main/java/com/supervision/handler/gpt/ConditionJudgeHandler.java index 02fe9db..dd4c6ae 100644 --- a/kbqa-graph/src/main/java/com/supervision/handler/gpt/ConditionJudgeHandler.java +++ b/kbqa-graph/src/main/java/com/supervision/handler/gpt/ConditionJudgeHandler.java @@ -11,6 +11,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * 条件判断handler @@ -32,18 +34,18 @@ public class ConditionJudgeHandler { List messageList = new ArrayList<>(); String template = "当我问用户:{},用户给我的回答是:[{}],\n" + "基于用户的回答,请依次判断以下列表:[{}]中的哪些项满足用户的回答?\n" + - "请从给定列表中找出所有满足的项.以jsonArray格式输出且只返回jsonArray.jsonArray的格式示例为:```json[\"满足的条件1\",\"满足的条件2\"]```.如果列表中项全部不满足,则返回:未找到"; + "请从给定列表中找出所有满足的项,并以json数组的格式返回,格式示例[\"xxx\",\"xxx\"]。直接说答案,不需要推理过程。如果列表中项全部不满足,则返回:未找到"; + String judgeAsk = StrUtil.format(template, question, userAnswer, CollUtil.join(candidateAnswerList, ";")); log.info("conditionJudge问题是:{}", judgeAsk); messageList.add(new MessageDTO("user", judgeAsk)); String judgeResult = AiUtil.chatByMessage(messageList); log.info("conditionJudge判断结果是:{}", judgeResult); - if (judgeResult.contains("```json")) { - judgeResult = StrUtil.subBetween(judgeResult, "```json", "```"); - judgeResult = StrUtil.removePrefix(judgeResult, "```json"); - judgeResult = StrUtil.removeSuffix(judgeResult, "```"); + String[] strings = StrUtil.subBetweenAll(judgeResult, "[", "]"); + if (strings.length == 0) { + return new HashSet<>(); } - HashSet result = new HashSet<>(JSONUtil.toList(judgeResult, String.class)); + HashSet result = new HashSet<>(JSONUtil.toList("[" + strings[0] + "]", String.class)); if (result.size() == 1 && result.contains("未找到")) { return new HashSet<>(); } diff --git a/kbqa-graph/src/main/java/com/supervision/handler/gpt/ItemExtractHandler.java b/kbqa-graph/src/main/java/com/supervision/handler/gpt/ItemExtractHandler.java index 07cb3a3..1bd3027 100644 --- a/kbqa-graph/src/main/java/com/supervision/handler/gpt/ItemExtractHandler.java +++ b/kbqa-graph/src/main/java/com/supervision/handler/gpt/ItemExtractHandler.java @@ -25,9 +25,10 @@ public class ItemExtractHandler { * @param possible 可能的实体 */ public List itemExtractByPossibleItemWithExample(String question, List possible) { - String template = "请根据以下事项列表,从句子中识别并标注出对应的社保业务事项名称。若句子中不能直接对应到任何事项,就找可能性最高的事项。" + - "请确保只识别并标注一种可能性最高的社保业务事项。不要识别出事项列表之外的事项。\n" + - "事项列表:{}\n" + + String template = "作为AI助手,你的任务是帮助用户查找和理解用户问题中可能问的事项。" + + "请根据以下事项列表,从用输入中识别并标注出对应的社保业务事项名称。若输入中不能直接对应到任何事项,就找可能性最高的事项。" + + "请确保只识别并标注一种可能性最高的社保业务事项,且识别的事项存在于列表中。\n" + + "事项列表:[{};无关问题]\n" + "我现在有一些示例,可供你学习。\n" + "输入:企业职工多少岁可以退休?输出:企业职工退休\n" + "输入:深圳的职工退休手续怎么办?输出:深圳企业职工退休\n" + @@ -41,9 +42,9 @@ public class ItemExtractHandler { "输入:我是南京市户口,可以在深圳办理退休吗?输出:省外户口企业职工退休\n" + "输入:我是澳门人,在深圳好多年了,可以根据城乡居民来办理退休吗?输出:港澳台和外籍人员城乡居民退休\n" + "输入:今天中午吃什么?输出:无关问题\n" + - "现在我给你一句话,请给我输出:\n" + + "请你学习上面示例中的输入和输出的提取方式。现在我给你一句话,请给我输出:\n" + "输入:{}\n" + - "请直接回答输出:"; + "输出:"; List messageList = new ArrayList<>(); messageList.add(new MessageDTO("user", StrUtil.format(template, CollUtil.join(possible, ";"), question)));