package com.supervision.handler.gpt; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.supervision.ai.AiUtil; import com.supervision.ai.dto.MessageDTO; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.util.*; /** * 条件判断handler */ @Slf4j @Component public class ConditionJudgeHandler { /** * 效果有些一般,但是也能勉强去用 * * @param question * @param candidateAnswerList * @param userAnswer * @return */ public Set conditionJudge(String question, Collection candidateAnswerList, String userAnswer) { List messageList = new ArrayList<>(); messageList.add(new MessageDTO("system", "现在要做社会保障业务分类,我现在给你一个问题,给你候选答案列表,请你根据用户的实际回答,从候选答案列表中给我选择对应的候选答案.除了候选答案,什么其他的都不要说.")); messageList.add(new MessageDTO("assistant", "好的")); messageList.add(new MessageDTO("user", StrUtil.format("问题:[{}]", question))); messageList.add(new MessageDTO("assistant", "继续")); messageList.add(new MessageDTO("user", StrUtil.format("候选答案列表:[{};未找到匹配答案]", StrUtil.join(";", candidateAnswerList)))); messageList.add(new MessageDTO("assistant", "继续")); messageList.add(new MessageDTO("user", StrUtil.format("用户答案:[{}],现在请给我匹配的候选答案,其他什么都不要说.如果有多个候选答案,用;号分割", userAnswer))); log.info("conditionJudge判断候选答案:{}", JSONUtil.toJsonStr(messageList)); String judgeResult = AiUtil.chatByMessage(messageList); log.info("conditionJudge判断结果是:{}", judgeResult); return new HashSet<>(Arrays.asList(judgeResult.split(";"))); } /** * 以循环的形式去判断条件是否满足 * * @param question 问题 * @param candidateAnswerList 判断条件 * @param userAnswer 用户回答 */ public Set newConditionJudge(String question, Collection candidateAnswerList, String userAnswer, String conditionType) { Set judgeResultSet = new HashSet<>(); String template = "当我问用户:{},用户给我的回答是:[{}],\n" + "基于用户的回答,判断一下用户{}是否满足[{}]?满足就只回复true,反之只回复false"; for (String candidateAnswer : candidateAnswerList) { String judgeResult = StrUtil.format(template, question, userAnswer, conditionType, candidateAnswer); String answer = AiUtil.chat(judgeResult); log.info("conditionJudge判断条件:\n{},\n结果是:{}", judgeResult, answer); try { if (BooleanUtil.toBoolean(answer)) { judgeResultSet.add(candidateAnswer); } } catch (Exception e) { log.info("{}非布尔类型,不统计在内", answer); } } return judgeResultSet; } }