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 6244c15..b037801 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 @@ -24,6 +24,7 @@ public class ItemExtractHandler { * @param question 问题 * @return 提取结果 */ + @Deprecated public String itemExtract(String question) { List messageList = new ArrayList<>(); messageList.add(new MessageDTO("system", "假设你是一个命名实体识别模型且精通社保实体识别." + @@ -43,6 +44,7 @@ public class ItemExtractHandler { * @param question 问题 * @return 提取结果 */ + @Deprecated public List itemExtractByPossibleItem(String question, List possible) { String template = "请根据以下事项列表,从句子中识别并标注出对应的社保业务事项名称。若句子中不能直接对应到任何事项,就找可能性最高的事项。请确保只识别并标注一种可能性最高的社保业务事项。" + "事项名称列表:\n" + @@ -60,6 +62,46 @@ public class ItemExtractHandler { return Collections.singletonList(item); } + /** + * 提供示例的实体提取 + * + * @param question 问题 + * @param possible 可能的实体 + */ + public List itemExtractByPossibleItemWithExample(String question, List possible) { + String template = "请根据以下事项列表,从句子中识别并标注出对应的社保业务事项名称。若句子中不能直接对应到任何事项,就找可能性最高的事项。" + + "请确保只识别并标注一种可能性最高的社保业务事项。\n" + + "事项列表:{}" + + "我现在有一些示例,可供你学习。\n" + + "输入:企业职工多少岁可以退休?输出:企业职工退休\n" + + "输入:深圳的职工退休手续怎么办?输出:深圳企业职工退休\n" + + "输入:如果我是广州人,我在深圳应该怎么办退休手续?输出:广东省其他地区企业职工退休\n" + + "输入:退休的要求是什么?输出:退休\n" + + "输入:本地的农民,如果退休有什么限制?输出:深圳城乡居民退休\n" + + "输入:我是香港企业的法人,如果我想在深圳退休可以吗?输出:港澳台和外籍人员企业职工退休\n" + + "输入:企业的女性干部退休有什么要求吗?输出:企业职工退休\n" + + "输入:普通居民可以退休吗?输出:城乡居保退休\n" + + "输入:单位延缴或个人延缴的情况下,办理退休有哪些注意事项?输出:企业职工退休\n" + + "输入:我是南京市户口,可以在深圳办理退休吗?输出:省外户口企业职工退休\n" + + "输入:我是澳门人,在深圳好多年了,可以根据城乡居民来办理退休吗?输出:港澳台和外籍人员城乡居民退休\n" + + "输入:今天中午吃什么?输出:无关问题\n" + + "现在我给你一句话,请给我输出:\n" + + "输入:{}\n" + + "请直接回答输出:"; + List messageList = new ArrayList<>(); + messageList.add(new MessageDTO("user", StrUtil.format(template, CollUtil.join(possible, ";"), question))); + + log.info("itemExtractByPossibleItemWithExample查询语句为:{}", JSONUtil.toJsonStr(messageList)); + String item = AiUtil.chatByMessage(messageList); + log.info("itemExtractByPossibleItemWithExample结果为:{}", item); + if (StrUtil.equals("无关问题", item)) { + throw new ItemExtractException("无关事项"); + } + return Collections.singletonList(item); + + } + + @Deprecated public String itemExtractBusiness(String question) { List messageList = new ArrayList<>(); messageList.add(new MessageDTO("user", "我现在是要进行实体抽取任务,并且精通社保业务,现在需要抽取[业务]这个实体类型的内容。\n" + diff --git a/kbqa-graph/src/main/java/com/supervision/service/impl/AskServiceImpl.java b/kbqa-graph/src/main/java/com/supervision/service/impl/AskServiceImpl.java index 3fa80d0..442753c 100644 --- a/kbqa-graph/src/main/java/com/supervision/service/impl/AskServiceImpl.java +++ b/kbqa-graph/src/main/java/com/supervision/service/impl/AskServiceImpl.java @@ -317,20 +317,17 @@ public class AskServiceImpl implements AskService { public SingleTalkResVO singleTalk(SingleTalkReqVO singleTalkReqVO) { // 单轮对话,直接根据用户的问题去找意图 String intent = identifyIntentHandler.identifyIntent(singleTalkReqVO.getUserTalk()); - // 提供用户问题中的业务 - - List allItemNode = findItemNodeHandler.findAllItemNode(); - List extractValue = itemExtractHandler.itemExtractByPossibleItem(singleTalkReqVO.getUserTalk(), allItemNode); - -// String extractValue = itemExtractHandler.itemExtractBusiness(singleTalkReqVO.getUserTalk()); - // 根据提取的内容,开始在知识图谱中寻找节点(首先找叶子节点,如果叶子节点有数据,直接返回,如果叶子节点没数据,再去找分支节点) - List allMatchLeafNode = findItemNodeHandler.findAllMatchLeafNode(extractValue); - // 然后根据叶子节点,还有意图,去找到所有的对应数据 // 根据用户的意图找到对应的节点 IdentifyIntentEnum intentEnum = IdentifyIntentEnum.getEnumByIntent(intent); if (ObjectUtil.isEmpty(intentEnum) || null == intentEnum) { throw new BusinessException("暂不支持该意图的问答"); } + List allItemNode = findItemNodeHandler.findAllItemNode(); + List extractValue = itemExtractHandler.itemExtractByPossibleItemWithExample(singleTalkReqVO.getUserTalk(), allItemNode); +// String extractValue = itemExtractHandler.itemExtractBusiness(singleTalkReqVO.getUserTalk()); + // 根据提取的内容,开始在知识图谱中寻找节点(首先找叶子节点,如果叶子节点有数据,直接返回,如果叶子节点没数据,再去找分支节点) + List allMatchLeafNode = findItemNodeHandler.findAllMatchLeafNode(extractValue); + // 然后根据叶子节点,还有意图,去找到所有的对应数据 Map> detailMap = new HashMap<>(); for (ItemLeaf itemLeaf : allMatchLeafNode) { try {