From cc89f48e5e4133e22f3935ce0ea90e07ed180051 Mon Sep 17 00:00:00 2001 From: liu Date: Fri, 22 Mar 2024 09:27:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E7=9F=A5=E8=AF=86=E5=BA=93?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MatchToolController.java | 35 ++++++ .../com/supervision/domain/IrKnowledge.java | 5 - .../dto/MatchQuestionAnswerDTO.java | 13 +++ .../supervision/dto/MatchToolQuestionDTO.java | 13 +++ .../com/supervision/dto/QuestionReqDTO.java | 11 ++ .../supervision/service/MatchToolService.java | 12 ++ .../service/impl/MatchToolServiceImpl.java | 103 ++++++++++++++++++ src/main/resources/application.yml | 4 +- .../supervision/CaseAskApplicationTests.java | 21 +++- 9 files changed, 206 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/supervision/controller/MatchToolController.java create mode 100644 src/main/java/com/supervision/dto/MatchQuestionAnswerDTO.java create mode 100644 src/main/java/com/supervision/dto/MatchToolQuestionDTO.java create mode 100644 src/main/java/com/supervision/dto/QuestionReqDTO.java create mode 100644 src/main/java/com/supervision/service/MatchToolService.java create mode 100644 src/main/java/com/supervision/service/impl/MatchToolServiceImpl.java diff --git a/src/main/java/com/supervision/controller/MatchToolController.java b/src/main/java/com/supervision/controller/MatchToolController.java new file mode 100644 index 0000000..a9c06d0 --- /dev/null +++ b/src/main/java/com/supervision/controller/MatchToolController.java @@ -0,0 +1,35 @@ +package com.supervision.controller; + +import com.supervision.dto.MatchQuestionAnswerDTO; +import com.supervision.service.MatchToolService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@Slf4j +@Api(tags = "相似度匹配工具") +@RestController +@RequestMapping("matchTool") +@RequiredArgsConstructor +public class MatchToolController { + + private final MatchToolService matchToolService; + + @ApiOperation("刷新匹配工具知识库") + @GetMapping("refreshMatchToolLibrary") + public void refreshMatchToolLibrary() { + matchToolService.refreshMatchToolLibrary(); + } + + @ApiOperation("进行问答") + @GetMapping("execMatch") + public List execMatch(String question) { + return matchToolService.execMatch(question); + } +} diff --git a/src/main/java/com/supervision/domain/IrKnowledge.java b/src/main/java/com/supervision/domain/IrKnowledge.java index d54bae7..f848126 100644 --- a/src/main/java/com/supervision/domain/IrKnowledge.java +++ b/src/main/java/com/supervision/domain/IrKnowledge.java @@ -24,11 +24,6 @@ public class IrKnowledge implements Serializable { @TableId private String id; - /** - * 问题编码(和代码问题枚举对应) - */ - private Integer questionCode; - /** * 标准问题 */ diff --git a/src/main/java/com/supervision/dto/MatchQuestionAnswerDTO.java b/src/main/java/com/supervision/dto/MatchQuestionAnswerDTO.java new file mode 100644 index 0000000..912aa2a --- /dev/null +++ b/src/main/java/com/supervision/dto/MatchQuestionAnswerDTO.java @@ -0,0 +1,13 @@ +package com.supervision.dto; + +import lombok.Data; + +@Data +public class MatchQuestionAnswerDTO { + + private String matchQuestion; + + private String matchQuestionCode; + + private Double matchScore; +} diff --git a/src/main/java/com/supervision/dto/MatchToolQuestionDTO.java b/src/main/java/com/supervision/dto/MatchToolQuestionDTO.java new file mode 100644 index 0000000..1c81375 --- /dev/null +++ b/src/main/java/com/supervision/dto/MatchToolQuestionDTO.java @@ -0,0 +1,13 @@ +package com.supervision.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class MatchToolQuestionDTO { + + private String questionId; + + private List questionList; +} diff --git a/src/main/java/com/supervision/dto/QuestionReqDTO.java b/src/main/java/com/supervision/dto/QuestionReqDTO.java new file mode 100644 index 0000000..98bca44 --- /dev/null +++ b/src/main/java/com/supervision/dto/QuestionReqDTO.java @@ -0,0 +1,11 @@ +package com.supervision.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class QuestionReqDTO { + + private String question; +} diff --git a/src/main/java/com/supervision/service/MatchToolService.java b/src/main/java/com/supervision/service/MatchToolService.java new file mode 100644 index 0000000..155045c --- /dev/null +++ b/src/main/java/com/supervision/service/MatchToolService.java @@ -0,0 +1,12 @@ +package com.supervision.service; + +import com.supervision.dto.MatchQuestionAnswerDTO; + +import java.util.List; + +public interface MatchToolService { + + void refreshMatchToolLibrary(); + + List execMatch(String question); +} diff --git a/src/main/java/com/supervision/service/impl/MatchToolServiceImpl.java b/src/main/java/com/supervision/service/impl/MatchToolServiceImpl.java new file mode 100644 index 0000000..0e28b29 --- /dev/null +++ b/src/main/java/com/supervision/service/impl/MatchToolServiceImpl.java @@ -0,0 +1,103 @@ +package com.supervision.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import com.fasterxml.jackson.core.type.TypeReference; +import com.supervision.config.domain.GlobalResult; +import com.supervision.domain.IrKnowledge; +import com.supervision.domain.IrKnowledgeSimilar; +import com.supervision.dto.MatchQuestionAnswerDTO; +import com.supervision.dto.MatchToolQuestionDTO; +import com.supervision.dto.QuestionReqDTO; +import com.supervision.exception.BusinessException; +import com.supervision.service.IrKnowledgeService; +import com.supervision.service.IrKnowledgeSimilarService; +import com.supervision.service.MatchToolService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.lang.reflect.Type; +import java.net.HttpURLConnection; +import java.util.*; +import java.util.stream.Collectors; + +@Slf4j +@Service +@RequiredArgsConstructor +public class MatchToolServiceImpl implements MatchToolService { + + private final IrKnowledgeService irKnowledgeService; + + private final IrKnowledgeSimilarService irKnowledgeSimilarService; + + @Value("${matchTool.url}") + private String matchToolUrl; + + @Override + public void refreshMatchToolLibrary() { + // 获取所有的问题 + List knowledgeList = irKnowledgeService.list(); + // 获取相似问题 + List similarList = irKnowledgeSimilarService.list(); + Map> similarKnowledgeMap = similarList.stream().collect(Collectors.groupingBy(IrKnowledgeSimilar::getKnowledgeId)); + Map> questionLibrary = knowledgeList.stream().collect(Collectors.toMap(IrKnowledge::getId, e -> CollUtil.newArrayList(e.getStandardQuestion()))); + List matchToolQuestionDTOList = new ArrayList<>(); + + for (Map.Entry> entry : questionLibrary.entrySet()) { + String questionId = entry.getKey(); + List similarKnowledgeList = similarKnowledgeMap.get(questionId); + if (CollUtil.isNotEmpty(similarKnowledgeList)) { + Set similarQuestionSet = similarKnowledgeList.stream().map(IrKnowledgeSimilar::getSimilarQuestion).collect(Collectors.toSet()); + entry.getValue().addAll(similarQuestionSet); + } + MatchToolQuestionDTO matchToolQuestionDTO = new MatchToolQuestionDTO(); + matchToolQuestionDTO.setQuestionId(questionId); + matchToolQuestionDTO.setQuestionList(entry.getValue()); + matchToolQuestionDTOList.add(matchToolQuestionDTO); + } + // 调用tool服务进行更新操作 + submitRefresh(matchToolQuestionDTOList); + } + + @Override + public List execMatch(String question) { + log.info("开始调用talkQaSimilarity,问题:{}", question); + try { + String post = HttpUtil.post(matchToolUrl + "/matchQuestion", JSONUtil.toJsonStr(new QuestionReqDTO(question))); + log.info("相似度匹配答案:{}", post); + TypeReference>> globalResultTypeReference = new TypeReference>>() { + }; + GlobalResult> result = JSONUtil.toBean(post, globalResultTypeReference.getType(), true); + if (result.getCode() != 200) { + throw new BusinessException("匹配失败"); + } + + return result.getData(); + } catch (Exception e) { + log.error("调用talkQaSimilarity error ", e); + return null; + } + } + + private void submitRefresh(List matchToolQuestionDTOList) { + log.info("开始调用matchTool服务进行更新操作"); + try { + String post = HttpUtil.post(matchToolUrl + "/updateDatabase", JSONUtil.toJsonStr(matchToolQuestionDTOList)); + log.info(post); + if (!JSONUtil.isTypeJSON(post)) { + throw new BusinessException("更新失败"); + } + } catch (Exception e) { + log.error("调用matchTool服务更新失败", e); + throw new BusinessException("更新失败"); + } + log.info("成功调用matchTool服务更新数据库"); + + + } + + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b7fb565..137bc90 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -40,4 +40,6 @@ spring: enabled: true log-slow-sql: true slow-sql-millis: 5000 - merge-sql: false \ No newline at end of file + merge-sql: false +matchTool: + url: http://192.168.10.137:8080 \ No newline at end of file diff --git a/src/test/java/com/supervision/CaseAskApplicationTests.java b/src/test/java/com/supervision/CaseAskApplicationTests.java index 0ac7521..3d2094e 100644 --- a/src/test/java/com/supervision/CaseAskApplicationTests.java +++ b/src/test/java/com/supervision/CaseAskApplicationTests.java @@ -1,15 +1,26 @@ package com.supervision; +import com.supervision.domain.IrKnowledge; +import com.supervision.domain.IrKnowledgeSimilar; +import com.supervision.service.IrKnowledgeService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -@MapperScan(basePackages = {"com.supervision.**.mapper"}) -@SpringBootTest +@Slf4j +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@RunWith(SpringJUnit4ClassRunner.class) +@RequiredArgsConstructor class AskApplicationTests { - @Test - void contextLoads() { - } + @Autowired + private IrKnowledgeService irKnowledgeService; + + }