代码提交

main
liu 1 year ago
parent 52b270c2c8
commit ee7b48f642

@ -70,9 +70,9 @@ public class ResponseConfig implements ResponseBodyAdvice<Object> {
@ExceptionHandler(BusinessException.class) @ExceptionHandler(BusinessException.class)
public GlobalResult<?> businessExceptionResponse(BusinessException exception) { public GlobalResult<?> businessExceptionResponse(BusinessException exception) {
log.error(exception.getMessage(), 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() : "业务异常"; String message = StrUtil.isNotEmpty(exception.getMessage()) ? exception.getMessage() : "业务异常";
return GlobalResult.error( code, exception.getMessage(), message); return GlobalResult.error(code, exception.getMessage(), message);
} }

@ -39,7 +39,7 @@ public class AskController {
try { try {
return askService.roundTalk(roundTalkReqVO); return askService.roundTalk(roundTalkReqVO);
} catch (Exception e) { } catch (Exception e) {
log.info("多轮对话过程中出现了异常,则说明多轮对话走不通,那么就根据sessionId获取Redis中的原始问题,直接走单轮对话"); log.error("多轮对话过程中出现了异常,则说明多轮对话走不通,那么就根据sessionId获取Redis中的原始问题,直接走单轮对话", e);
// 如果多轮对话过程中出现了异常,则说明多轮对话走不通,那么就根据sessionId获取Redis中的原始问题,直接走单轮对话 // 如果多轮对话过程中出现了异常,则说明多轮对话走不通,那么就根据sessionId获取Redis中的原始问题,直接走单轮对话
Object cache = redisTemplate.opsForValue().get(SESSION_PARAM + roundTalkReqVO.getSessionId()); Object cache = redisTemplate.opsForValue().get(SESSION_PARAM + roundTalkReqVO.getSessionId());
SessionParamDTO sessionParamDTO = BeanUtil.toBean(cache, SessionParamDTO.class); SessionParamDTO sessionParamDTO = BeanUtil.toBean(cache, SessionParamDTO.class);
@ -54,9 +54,15 @@ public class AskController {
@PostMapping("singleTalk") @PostMapping("singleTalk")
public SingleTalkResVO singleTalk(@RequestBody SingleTalkReqVO singleTalkReqVO) { public SingleTalkResVO singleTalk(@RequestBody SingleTalkReqVO singleTalkReqVO) {
log.info("单轮对话问题开始:{}", singleTalkReqVO.getUserTalk()); log.info("单轮对话问题开始:{}", singleTalkReqVO.getUserTalk());
try {
SingleTalkResVO singleTalkResVO = askService.singleTalk(singleTalkReqVO); SingleTalkResVO singleTalkResVO = askService.singleTalk(singleTalkReqVO);
log.info("单轮对话问题结束:{}", singleTalkReqVO.getUserTalk()); log.info("单轮对话问题结束:{}", singleTalkReqVO.getUserTalk());
return singleTalkResVO; return singleTalkResVO;
} catch (Exception e) {
log.error("单轮对话过程中出现了异常", e);
return SingleTalkResVO.builder().answerText("您好,我暂时还不会回答这个问题哦!").build();
}
} }
@ApiOperation("多轮对话中用户手动填写参数,可能直接返回结果") @ApiOperation("多轮对话中用户手动填写参数,可能直接返回结果")

@ -21,7 +21,7 @@ public class AnswerQuestionHandler {
"\"\"\"{}\"\"\"\n" + "\"\"\"{}\"\"\"\n" +
"同时,有一个和用户的问答过程的记录供你参考以提供更精确的回答,内容是:" + "同时,有一个和用户的问答过程的记录供你参考以提供更精确的回答,内容是:" +
"\"\"\"{}\"\"\"\n" + "\"\"\"{}\"\"\"\n" +
"请用不超过 100 个词的长度准确和详细的回答用户的问题。"; "请用不超过 100 个词的长度准确和详细的回答用户的问题。请直接给我最终答案,不要反问";
String askRecordTemplate = "问:{}\n 用户答:{};\n"; String askRecordTemplate = "问:{}\n 用户答:{};\n";
StringBuilder askRecord = new StringBuilder(); StringBuilder askRecord = new StringBuilder();
for (Map.Entry<String, String> entry : talkRecord.entrySet()) { for (Map.Entry<String, String> entry : talkRecord.entrySet()) {
@ -42,7 +42,7 @@ public class AnswerQuestionHandler {
public String answerSingleQuestionNew(String question, Map<String, List<String>> detailMap) { public String answerSingleQuestionNew(String question, Map<String, List<String>> detailMap) {
String template = "作为AI助手你的任务是帮助用户查找和理解特定政务的政策内容并给于用户答案。在这个场景中你将使用政策内容来回答用户问题{}。请根据政策内容\n" + String template = "作为AI助手你的任务是帮助用户查找和理解特定政务的政策内容并给于用户答案。在这个场景中你将使用政策内容来回答用户问题{}。请根据政策内容\n" +
"\"\"\"{}\"\"\"\n" + "\"\"\"{}\"\"\"\n" +
"并用不超过 100 个词的长度准确和详细的回答用户的问题。"; "并用不超过 100 个词的长度准确和详细的回答用户的问题。请直接给我最终答案,不要反问";
List<MessageDTO> messageList = new ArrayList<>(); List<MessageDTO> messageList = new ArrayList<>();
messageList.add(new MessageDTO("user", StrUtil.format(template, question, JSONUtil.toJsonStr(detailMap)))); messageList.add(new MessageDTO("user", StrUtil.format(template, question, JSONUtil.toJsonStr(detailMap))));

@ -11,6 +11,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.*; import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** /**
* handler * handler
@ -32,18 +34,18 @@ public class ConditionJudgeHandler {
List<MessageDTO> messageList = new ArrayList<>(); List<MessageDTO> messageList = new ArrayList<>();
String template = "当我问用户:{},用户给我的回答是:[{}]\n" + String template = "当我问用户:{},用户给我的回答是:[{}]\n" +
"基于用户的回答,请依次判断以下列表:[{}]中的哪些项满足用户的回答?\n" + "基于用户的回答,请依次判断以下列表:[{}]中的哪些项满足用户的回答?\n" +
"请从给定列表中找出所有满足的项.以jsonArray格式输出且只返回jsonArray.jsonArray的格式示例为:```json[\"满足的条件1\",\"满足的条件2\"]```.如果列表中项全部不满足,则返回:未找到"; "请从给定列表中找出所有满足的项并以json数组的格式返回,格式示例[\"xxx\",\"xxx\"]。直接说答案,不需要推理过程。如果列表中项全部不满足,则返回:未找到";
String judgeAsk = StrUtil.format(template, question, userAnswer, CollUtil.join(candidateAnswerList, ";")); String judgeAsk = StrUtil.format(template, question, userAnswer, CollUtil.join(candidateAnswerList, ";"));
log.info("conditionJudge问题是:{}", judgeAsk); log.info("conditionJudge问题是:{}", judgeAsk);
messageList.add(new MessageDTO("user", judgeAsk)); messageList.add(new MessageDTO("user", judgeAsk));
String judgeResult = AiUtil.chatByMessage(messageList); String judgeResult = AiUtil.chatByMessage(messageList);
log.info("conditionJudge判断结果是:{}", judgeResult); log.info("conditionJudge判断结果是:{}", judgeResult);
if (judgeResult.contains("```json")) { String[] strings = StrUtil.subBetweenAll(judgeResult, "[", "]");
judgeResult = StrUtil.subBetween(judgeResult, "```json", "```"); if (strings.length == 0) {
judgeResult = StrUtil.removePrefix(judgeResult, "```json"); return new HashSet<>();
judgeResult = StrUtil.removeSuffix(judgeResult, "```");
} }
HashSet<String> result = new HashSet<>(JSONUtil.toList(judgeResult, String.class)); HashSet<String> result = new HashSet<>(JSONUtil.toList("[" + strings[0] + "]", String.class));
if (result.size() == 1 && result.contains("未找到")) { if (result.size() == 1 && result.contains("未找到")) {
return new HashSet<>(); return new HashSet<>();
} }

@ -25,9 +25,10 @@ public class ItemExtractHandler {
* @param possible * @param possible
*/ */
public List<String> itemExtractByPossibleItemWithExample(String question, List<String> possible) { public List<String> itemExtractByPossibleItemWithExample(String question, List<String> possible) {
String template = "请根据以下事项列表,从句子中识别并标注出对应的社保业务事项名称。若句子中不能直接对应到任何事项,就找可能性最高的事项。" + String template = "作为AI助手你的任务是帮助用户查找和理解用户问题中可能问的事项。" +
"请确保只识别并标注一种可能性最高的社保业务事项。不要识别出事项列表之外的事项。\n" + "请根据以下事项列表,从用输入中识别并标注出对应的社保业务事项名称。若输入中不能直接对应到任何事项,就找可能性最高的事项。" +
"事项列表:{}\n" + "请确保只识别并标注一种可能性最高的社保业务事项,且识别的事项存在于列表中。\n" +
"事项列表:[{};无关问题]\n" +
"我现在有一些示例,可供你学习。\n" + "我现在有一些示例,可供你学习。\n" +
"输入:企业职工多少岁可以退休?输出:企业职工退休\n" + "输入:企业职工多少岁可以退休?输出:企业职工退休\n" +
"输入:深圳的职工退休手续怎么办?输出:深圳企业职工退休\n" + "输入:深圳的职工退休手续怎么办?输出:深圳企业职工退休\n" +
@ -41,9 +42,9 @@ public class ItemExtractHandler {
"输入:我是南京市户口,可以在深圳办理退休吗?输出:省外户口企业职工退休\n" + "输入:我是南京市户口,可以在深圳办理退休吗?输出:省外户口企业职工退休\n" +
"输入:我是澳门人,在深圳好多年了,可以根据城乡居民来办理退休吗?输出:港澳台和外籍人员城乡居民退休\n" + "输入:我是澳门人,在深圳好多年了,可以根据城乡居民来办理退休吗?输出:港澳台和外籍人员城乡居民退休\n" +
"输入:今天中午吃什么?输出:无关问题\n" + "输入:今天中午吃什么?输出:无关问题\n" +
"现在我给你一句话,请给我输出:\n" + "请你学习上面示例中的输入和输出的提取方式。现在我给你一句话,请给我输出:\n" +
"输入:{}\n" + "输入:{}\n" +
"请直接回答输出:"; "输出:";
List<MessageDTO> messageList = new ArrayList<>(); List<MessageDTO> messageList = new ArrayList<>();
messageList.add(new MessageDTO("user", StrUtil.format(template, CollUtil.join(possible, ";"), question))); messageList.add(new MessageDTO("user", StrUtil.format(template, CollUtil.join(possible, ";"), question)));

Loading…
Cancel
Save