diff --git a/kbqa-graph/pom.xml b/kbqa-graph/pom.xml index f815fff..6ab4d2c 100644 --- a/kbqa-graph/pom.xml +++ b/kbqa-graph/pom.xml @@ -94,6 +94,12 @@ compile + + org.apache.poi + poi-ooxml + 4.1.2 + + diff --git a/kbqa-graph/src/main/java/com/supervision/ai/AiUtil.java b/kbqa-graph/src/main/java/com/supervision/ai/AiUtil.java index ef2933e..cb09d05 100644 --- a/kbqa-graph/src/main/java/com/supervision/ai/AiUtil.java +++ b/kbqa-graph/src/main/java/com/supervision/ai/AiUtil.java @@ -71,9 +71,11 @@ public class AiUtil { ChatReqDTO chatReqDTO = new ChatReqDTO(); chatReqDTO.setModel("glm-3-turbo"); chatReqDTO.setMessages(messageList); - HttpResponse response = HttpRequest.post("https://open.bigmodel.cn/api/paas/v4/chat/completions") - .body(JSONUtil.toJsonStr(chatReqDTO)).header("Authorization", TOKEN).execute(); - String body = response.body(); + String body; + try (HttpResponse response = HttpRequest.post("https://open.bigmodel.cn/api/paas/v4/chat/completions") + .body(JSONUtil.toJsonStr(chatReqDTO)).header("Authorization", TOKEN).execute()) { + body = response.body(); + } ChatResDTO bean = JSONUtil.toBean(body, ChatResDTO.class); return bean.getChoices().stream().findFirst().orElseThrow(() -> new RuntimeException("获取政策文件失败")).getMessage().getContent(); } 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 b037801..0c1ae6a 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 @@ -71,7 +71,7 @@ public class ItemExtractHandler { public List itemExtractByPossibleItemWithExample(String question, List possible) { String template = "请根据以下事项列表,从句子中识别并标注出对应的社保业务事项名称。若句子中不能直接对应到任何事项,就找可能性最高的事项。" + "请确保只识别并标注一种可能性最高的社保业务事项。\n" + - "事项列表:{}" + + "事项列表:{}\n" + "我现在有一些示例,可供你学习。\n" + "输入:企业职工多少岁可以退休?输出:企业职工退休\n" + "输入:深圳的职工退休手续怎么办?输出:深圳企业职工退休\n" + diff --git a/kbqa-graph/src/test/java/com/supervision/AskTest.java b/kbqa-graph/src/test/java/com/supervision/AskTest.java index 8abb77e..741070d 100644 --- a/kbqa-graph/src/test/java/com/supervision/AskTest.java +++ b/kbqa-graph/src/test/java/com/supervision/AskTest.java @@ -1,6 +1,13 @@ package com.supervision; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.file.FileReader; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.poi.excel.ExcelReader; +import cn.hutool.poi.excel.ExcelUtil; +import cn.hutool.poi.excel.ExcelWriter; import com.supervision.service.AskService; import com.supervision.vo.SingleTalkReqVO; import com.supervision.vo.SingleTalkResVO; @@ -11,6 +18,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.charset.Charset; import java.util.List; @Slf4j @@ -19,142 +31,65 @@ import java.util.List; public class AskTest { @Autowired - private AskService askService; - @Test - public void test() { + private AskService askService; - for (String question : loadQuestion()) { - log.info("======start=======>>>question:{}", question); + @Test + public void test() throws IOException { + // 从excel中获取问题,开始循环调用 + ExcelReader reader = ExcelUtil.getReader("/Users/flevance/Desktop/知识图谱/正常退休业务问题梳理_0422.xlsx", 1); + File file = FileUtil.file("/Users/flevance/Java/KBQA/test.log"); + ExcelWriter writer = ExcelUtil.getWriter("/Users/flevance/Desktop/知识图谱/正常退休业务问题梳理_0422_output.xlsx", "Sheet2"); + + // 从第一行开始读取 + List> readList = reader.read(1); + for (int i = 0; i < readList.size(); i++) { + List objects = readList.get(i); SingleTalkReqVO singleTalkReqVO = new SingleTalkReqVO(); - singleTalkReqVO.setUserTalk(question); + singleTalkReqVO.setUserTalk(String.valueOf(objects.get(1))); + SingleTalkResVO singleTalkResVO = null; try { - SingleTalkResVO singleTalkResVO = askService.singleTalk(singleTalkReqVO); - log.info("====end=====>>>answer:{}<<<======end=======", singleTalkResVO.getAnswerText()); + singleTalkResVO = askService.singleTalk(singleTalkReqVO); } catch (Exception e) { - log.info("====end=====>>>answer:{}<<<======end=======", "error"); + log.info("出现异常,结束"); } + FileReader fileReader = new FileReader(file); + List strings = fileReader.readLines(); + int y = i + 1; + strings.stream().filter(e -> StrUtil.contains(e, "identifyIntent开始识别意图:")).findAny().ifPresent(e -> { + String s = StrUtil.subAfter(e, "identifyIntent开始识别意图:", true); + writer.writeCellValue(2, y, s); + }); + strings.stream().filter(e -> StrUtil.contains(e, "identifyIntent意图识别结果为:")).findAny().ifPresent(e -> { + String s = StrUtil.subAfter(e, "identifyIntent意图识别结果为:", true); + writer.writeCellValue(3, y, s); + }); + strings.stream().filter(e -> StrUtil.contains(e, "itemExtractByPossibleItemWithExample查询语句为:")).findAny().ifPresent(e -> { + String s = StrUtil.subAfter(e, "itemExtractByPossibleItemWithExample查询语句为:", true); + writer.writeCellValue(4, y, s); + }); + strings.stream().filter(e -> StrUtil.contains(e, "itemExtractByPossibleItemWithExample结果为:")).findAny().ifPresent(e -> { + String s = StrUtil.subAfter(e, "itemExtractByPossibleItemWithExample结果为:", true); + writer.writeCellValue(5, y, s); + }); + strings.stream().filter(e -> StrUtil.contains(e, "answerQuestion的prompt是:")).findAny().ifPresent(e -> { + String s = StrUtil.subAfter(e, "answerQuestion的prompt是:", true); + writer.writeCellValue(6, y, s); + }); + SingleTalkResVO finalSingleTalkResVO = singleTalkResVO; + strings.stream().filter(e -> StrUtil.contains(e, "answerQuestion的答案是:")).findAny().ifPresent(e -> { + String s = StrUtil.subAfter(e, "answerQuestion的答案是:", true); + if (ObjectUtil.isNotNull(finalSingleTalkResVO)) { + writer.writeCellValue(7, y, finalSingleTalkResVO.getAnswerText()); + } + }); + writer.flush(); + BufferedWriter writer1 = FileUtil.getWriter(file, Charset.defaultCharset(), false); + writer1.write(""); + writer1.flush(); + writer1.close(); } - } - - @Test - public void test1() { - - // - SingleTalkReqVO singleTalkReqVO = new SingleTalkReqVO(); - singleTalkReqVO.setUserTalk("退休手续办理完成后,如何查询养老保险待遇的发放情况?"); - SingleTalkResVO singleTalkResVO = askService.singleTalk(singleTalkReqVO); - System.out.println("answer: "+singleTalkResVO.getAnswerText()); - } - - - public List loadQuestion(){ - String question = "领取养老金的具体条件有哪些?\n" + - "新农保和城居保制度实施时,已年满 60 周岁的人是否可以直接领取基础养老金?\n" + - "参加原新农保或城居保的参保人,需要满足什么条件才能按月领取养老金?\n" + - "缴费累计达到多少年可以按月领取养老金?\n" + - "如果累计缴费年限没有达到规定缴费年限,应该怎么办?\n" + - "继续逐年缴费是否能享受政府缴费补贴?\n" + - "一次性补缴养老保险费是否享受政府缴费补贴?\n" + - "不继续逐年缴费或补缴至规定缴费年限,会有什么影响?\n" + - "60 周岁但累计缴费年限未达到规定的,能否申请按月领取个人账户养老金?\n" + - "个人账户养老金发放有何规定?\n" + - "办理按月领取养老金需要提供哪些材料?\n" + - "如何申请按月领取养老金?\n" + - "办理养老金领取手续的流程是怎样的?\n" + - "养老金的领取方式有哪些?\n" + - "领取养老金的资格如何审核?\n" + - "参保人的年龄和缴费年限以什么为准?\n" + - "不同地区的养老金办理条件是否相同?\n" + - "是否可以代办养老金领取手续?\n" + - "办理过程中如有疑问,如何咨询?\n" + - "养老金的发放时间是如何规定的?\n" + - "非干部身份的参保人办理退休需要提供离职证明吗?\n" + - "办理女干部在工人岗位退休的其他条件是什么?\n" + - "达龄月台账未出时,申请办理退休的具体流程是怎样的?\n" + - "单位延缴或个人延缴的情况下,办理退休有哪些注意事项?\n" + - "机要转档的具体流程和要求是什么?\n" + - "退休员工签领《养老保险待遇决定书》时还需要提供其他材料吗?\n" + - "办理退休手续的时间有限制吗?\n" + - "如果参保人档案未通过机要转至我局,该如何办理退休手续?\n" + - "参保人档案的审核标准是什么?\n" + - "退休手续办理完成后,如何查询养老保险待遇的发放情况?\n" + - "办理深圳市城乡居民养老保险需要哪些具体材料?\n" + - "深圳市企业职工养老保险养老金申请表如何获取?\n" + - "非深圳市户籍可以办理城乡居民养老保险吗?\n" + - "办理退休手续时,必须本人前往社保经办机构吗?\n" + - "代办退休手续需要提供哪些材料?\n" + - "退休年龄是如何确定的?\n" + - "深圳市养老保险业务办理委托书的格式是怎样的?\n" + - "办理养老待遇业务的具体流程是什么?\n" + - "线上办理养老待遇业务的具体操作步骤是什么?\n" + - "如何查询办理退休手续的进度?\n" + - "退休员工签领《养老保险待遇决定书》后多久能领回员工档案材料?\n" + - "办理退休手续的时间有没有限制?\n" + - "档案通过机要转至我局后,多久会通知当事人前来办理退休手续?\n" + - "办理退休手续需要满足哪些条件?\n" + - "女干部在工人岗位退休的具体条件是什么?\n" + - "身份证丢失了怎么办理退休手续?\n" + - "户口簿的信息需要与实际情况完全一致吗?\n" + - "港澳通行证或香港身份证的作用是什么?\n" + - "人事档案包括哪些内容?\n" + - "没有人事档案可以办理退休手续吗?\n" + - "授权委托书需要公证吗?\n" + - "办理退休手续的依据是什么?\n" + - "不同岗位的退休年龄有何区别?\n" + - "退休手续可以提前办理吗?\n" + - "办理退休手续后,养老金如何发放?\n" + - "养老保险待遇决定书有什么作用?\n" + - "退休人员如何领取养老金?\n" + - "养老金的计算方式是怎样的?\n" + - "办理退休手续时,需要缴纳费用吗?\n" + - "退休后养老金会随着时间调整吗?\n" + - "办理退休手续可以委托多人代办吗?\n" + - "退休人员去世后,养老金如何处理?\n" + - "办理退休手续后,如果发现信息有误如何更正?\n" + - "不同地区的办理流程和材料是否相同?\n" + - "线上办理途径是否只能通过“深圳社保”公众号?\n" + - "怎么办理退休?\n" + - "办理材料是否需要原件和复印件?\n" + - "材料提交后多久能办理完成?\n" + - "如果材料不齐全,可以线上补充提交吗?\n" + - "办理过程中如果有疑问,可以通过哪些方式咨询?\n" + - "退休人员的养老金是否会受到其他因素的影响?\n" + - "办理退休手续后,还需要注意哪些事项?\n" + - "缴费年限不足 15 年,是否可以一次性补缴?\n" + - "办理退休手续时,是否需要提供健康证明?\n" + - "退休人员是否需要进行资格认证?\n" + - "办理退休手续后,是否可以更改领取养老金的银行账户?\n" + - "退休人员的养老金是否会按时足额发放?\n" + - "如果对养老金金额有疑问,如何查询和核实?\n" + - "办理退休手续的过程中,如何保障个人信息的安全?\n" + - "我社保交够15年,是不是就可以办理退休了\n" + - "社保交够15年,是不是就不用交了\n" + - "企业女职工退休年龄如何确定怎么确定是50周岁退休还是55周岁退休\n" + - "领取失业金对退休金金额是否有影响\n" + - "有高级职称,退休时退休金高吗\n" + - "到退休年龄了,缴费不够15年,怎么办能一次性补齐吗\n" + - "退休金的计算公式是什么能领多少退休金\n" + - "职工的养老金何时领?\n" + - "单位如何为职工办理养老金申领手续?\n" + - "今后的养老金发放信息哪里查?\n" + - "社保缴费中断过,会影响养老金申领吗?\n" + - "养老保险缴费年限不够怎么办?\n" + - "现在退休证还有么,怎么办理?\n" + - "基本养老保险有哪些?\n" + - "个人养老金如何开账户?\n" + - "退休后去哪里领取个人养老金\n" + - "基本养老金的构成包括哪些方面\n" + - "职工社保和灵活就业都买了,多少岁退休\n" + - "之前单位缴过社保,现在自己交社保,退休年龄怎么算\n" + - "深户女的有营业执照的多大年龄退休\n" + - "港资公司女员工退休年龄\n"; - - - - return CollUtil.newArrayList(question.split("\n")); - } }