From 0ba38c64df65c2d849204e40e3ca44c0b6251e4f Mon Sep 17 00:00:00 2001 From: xueqingkun Date: Thu, 6 Jun 2024 18:35:35 +0800 Subject: [PATCH] =?UTF-8?q?1:=20=E4=BF=AE=E6=94=B9=20AskTemplateQuestionLi?= =?UTF-8?q?brary=E4=B8=AD=E7=9A=84question?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manage/dto/MedicalRecAnswerExcelDTO.java | 9 ++-- .../manage/dto/UploadQuestionLibraryDTO.java | 4 +- .../AskQuestionLibraryManageServiceImpl.java | 39 ++++++++++------ .../impl/MedicalRecManageServiceImpl.java | 9 ++-- .../impl/OfflineAnswerVideoResource.java | 5 ++- .../dto/AskTemplateQuestionLibraryDTO.java | 14 ++++++ .../AskTemplateQuestionSimilarityService.java | 20 +++++++++ ...AskTemplateQuestionLibraryServiceImpl.java | 10 ++++- ...TemplateQuestionSimilarityServiceImpl.java | 35 +++++++++++++++ .../controller/TestController.java | 12 ++++- .../com/supervision/AskTemplateIdTest.java | 19 +++++--- .../java/com/supervision/RedisVecTest.java | 19 ++++---- .../test/java/com/supervision/VecTest.java | 45 +++++++++++-------- 13 files changed, 180 insertions(+), 60 deletions(-) create mode 100644 virtual-patient-model/src/main/java/com/supervision/dto/AskTemplateQuestionLibraryDTO.java diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/dto/MedicalRecAnswerExcelDTO.java b/virtual-patient-manage/src/main/java/com/supervision/manage/dto/MedicalRecAnswerExcelDTO.java index 05f721e0..76f46983 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/dto/MedicalRecAnswerExcelDTO.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/dto/MedicalRecAnswerExcelDTO.java @@ -85,7 +85,8 @@ public class MedicalRecAnswerExcelDTO { public void doAction(List questionLibraryList, List askPatientAnswerList, List materialLibraryList, - List questionTypeDicList){ + List questionTypeDicList, + Map> questionMap){ if (StrUtil.isNotEmpty(this.answerVideoName)){ List split = StrUtil.split(this.answerVideoName, "."); @@ -96,7 +97,7 @@ public class MedicalRecAnswerExcelDTO { } this.absentCheck(); this.matchQuestionDicId(questionTypeDicList); - this.matchQuestion(questionLibraryList); + this.matchQuestion(questionLibraryList,questionMap); this.matchAskPatientAnswer(askPatientAnswerList); this.matchAnswerResource(materialLibraryList); } @@ -148,7 +149,7 @@ public class MedicalRecAnswerExcelDTO { * 匹配问题库 * @param questionLibraryList 问题库 */ - public void matchQuestion(List questionLibraryList){ + public void matchQuestion(List questionLibraryList,Map> questionMap){ if (StrUtil.isEmpty(this.question)){ return; } @@ -157,7 +158,7 @@ public class MedicalRecAnswerExcelDTO { } for (AskTemplateQuestionLibrary questionLibrary : questionLibraryList) { String description = questionLibrary.getDescription(); - List questionList = questionLibrary.getQuestion(); + List questionList = questionMap.get(questionLibrary.getId()); if (this.question.equals(description)){ this.libraryQuestionId = questionLibrary.getId(); return; diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/dto/UploadQuestionLibraryDTO.java b/virtual-patient-manage/src/main/java/com/supervision/manage/dto/UploadQuestionLibraryDTO.java index eb499224..9d219380 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/dto/UploadQuestionLibraryDTO.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/dto/UploadQuestionLibraryDTO.java @@ -94,7 +94,7 @@ public class UploadQuestionLibraryDTO { * 匹配问题库 * @param questionLibraryList 问题库 */ - public void matchQuestion(List questionLibraryList){ + /*public void matchQuestion(List questionLibraryList){ if (StrUtil.isEmpty(this.question)){ return; } @@ -110,7 +110,7 @@ public class UploadQuestionLibraryDTO { return; } } - } + }*/ public void matchQuestionDicId(List questionTypeDicList){ if (StrUtil.isEmpty(this.questionTypeTwo)){ return; diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/AskQuestionLibraryManageServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/AskQuestionLibraryManageServiceImpl.java index ca419662..d1daa633 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/AskQuestionLibraryManageServiceImpl.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/AskQuestionLibraryManageServiceImpl.java @@ -11,15 +11,18 @@ import cn.hutool.poi.excel.ExcelReader; import cn.hutool.poi.excel.ExcelUtil; import cn.hutool.poi.excel.ExcelWriter; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.supervision.dto.AskTemplateQuestionLibraryDTO; import com.supervision.manage.dto.UploadQuestionLibraryDTO; import com.supervision.manage.pojo.vo.UploadQuestionLibraryResVo; import com.supervision.manage.service.AskQuestionLibraryManageService; import com.supervision.manage.service.FileManageService; import com.supervision.manage.service.QaKnowledgeManageService; import com.supervision.model.AskTemplateQuestionLibrary; +import com.supervision.model.AskTemplateQuestionSimilarity; import com.supervision.model.CommonDic; import com.supervision.model.FileResource; import com.supervision.service.AskTemplateQuestionLibraryService; +import com.supervision.service.AskTemplateQuestionSimilarityService; import com.supervision.service.CommonDicService; import com.supervision.util.RedisSequenceUtil; import com.supervision.vo.manage.AskQuestionLibraryReqVo; @@ -28,6 +31,7 @@ import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.core.SimpleAliasRegistry; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.stereotype.Service; @@ -52,6 +56,8 @@ public class AskQuestionLibraryManageServiceImpl implements AskQuestionLibraryMa private final AskTemplateQuestionLibraryService askTemplateQuestionLibraryService; + private final AskTemplateQuestionSimilarityService askTemplateQuestionSimilarityService; + private final CommonDicService commonDicService; private final FileManageService fileManageService; @@ -94,25 +100,32 @@ public class AskQuestionLibraryManageServiceImpl implements AskQuestionLibraryMa Assert.notNull(commonDic,"字典信息不存在"); // 不存在,则新增 AskTemplateQuestionLibrary one = askTemplateQuestionLibraryService.lambdaQuery().eq(AskTemplateQuestionLibrary::getDictId, askTemplateQuestionLibrary.getDictId()).one(); + Map> questionMap = askTemplateQuestionSimilarityService.querySimilarityQuestionMapByLibraryLists(CollUtil.newArrayList(one)); + + + // 原始数据已经存在,更新数据 if (Objects.nonNull(one)){ // 更新数据 - List question = one.getQuestion(); - if (CollUtil.isEmpty(question)){ - question = CollUtil.newArrayList(askTemplateQuestionLibrary.getDescription()); - } else if (!question.contains(askTemplateQuestionLibrary.getDescription())) { - question.add(0, askTemplateQuestionLibrary.getDescription()); - } - one.setQuestion(question); - askTemplateQuestionLibraryService.updateById(one); + if (CollUtil.isEmpty(questionMap.get(one.getId()))){ + // 相似问不为空。查看相似问是否存在 + List questionList = questionMap.get(one.getId()); + if (CollUtil.isEmpty(questionList) || !questionList.contains(askTemplateQuestionLibrary.getDescription())){ + // 不存在相似问,新增一条相似问数据 + AskTemplateQuestionSimilarity similarity = new AskTemplateQuestionSimilarity(); + similarity.setSimilarityQuestion(askTemplateQuestionLibrary.getDescription()); + similarity.setLibraryId(one.getId()); + askTemplateQuestionSimilarityService.save(similarity); + } + } return one.getId(); }else { // 新增数据 - askTemplateQuestionLibrary.setQuestion(CollUtil.newArrayList(askTemplateQuestionLibrary.getDescription())); - if (StrUtil.isNotEmpty(commonDic.getDescription())){ - askTemplateQuestionLibrary.setDescription(commonDic.getDescription()); - askTemplateQuestionLibrary.getQuestion().add(commonDic.getDescription()); - } +// askTemplateQuestionLibrary.setQuestion(CollUtil.newArrayList(askTemplateQuestionLibrary.getDescription())); +// if (StrUtil.isNotEmpty(commonDic.getDescription())){ +// askTemplateQuestionLibrary.setDescription(commonDic.getDescription()); +// askTemplateQuestionLibrary.getQuestion().add(commonDic.getDescription()); +// } // 获取nexCode String nextCode = RedisSequenceUtil.getQuestionLibraryCode(() -> { diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MedicalRecManageServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MedicalRecManageServiceImpl.java index f8b5fc73..1a1d0dec 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MedicalRecManageServiceImpl.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MedicalRecManageServiceImpl.java @@ -50,6 +50,8 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService { private final AskTemplateQuestionLibraryService askTemplateQuestionLibraryService; + private final AskTemplateQuestionSimilarityService askTemplateQuestionSimilarityService; + private final CommonDicService commonDicService; private final DiseaseQuestionService diseaseQuestionService; @@ -164,6 +166,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService { Set libraryQuestionIdSet = list.stream().map(DiseaseQuestion::getQuestionId).collect(Collectors.toSet()); List askTemplateQuestionLibraryList = askTemplateQuestionLibraryService.listByIds(libraryQuestionIdSet); Map askQuestionMap = askTemplateQuestionLibraryList.stream().collect(Collectors.toMap(AskTemplateQuestionLibrary::getId, Function.identity())); + Map> libraryIdMapQuestion = askTemplateQuestionSimilarityService.querySimilarityQuestionMapByLibraryLists(askTemplateQuestionLibraryList); // 获取字典 Set dictIdSet = askTemplateQuestionLibraryList.stream().map(AskTemplateQuestionLibrary::getDictId).collect(Collectors.toSet()); Map dictMap = commonDicService.listByIds(dictIdSet).stream().collect(Collectors.toMap(CommonDic::getId, Function.identity())); @@ -174,13 +177,11 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService { MedicalRecQaVO medicalRecQaVO = new MedicalRecQaVO(); medicalRecQaVO.setLibraryQuestionId(diseaseQuestion.getQuestionId()); // 问题 - medicalRecQaVO.setQuestionList(questionLibrary.getQuestion()); + medicalRecQaVO.setQuestionList(libraryIdMapQuestion.get(questionLibrary.getId())); // 类目 medicalRecQaVO.setDictId(questionLibrary.getDictId()); // 类目名称 medicalRecQaVO.setDictNamePath(dictMap.getOrDefault(questionLibrary.getDictId(), new CommonDic()).getNameZhPath()); - // 默认回答 - medicalRecQaVO.setDefaultAnswer(questionLibrary.getDefaultAnswer()); result.add(medicalRecQaVO); } } @@ -277,6 +278,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService { // 获取问题 Set libraryQuestionIdSet = medicalRecQaList.stream().map(MedicalRecQaVO::getLibraryQuestionId).collect(Collectors.toSet()); List askTemplateQuestionLibraryList = askTemplateQuestionLibraryService.listByIds(libraryQuestionIdSet); + Map> libraryMapQuestion = askTemplateQuestionSimilarityService.querySimilarityQuestionMapByLibraryLists(askTemplateQuestionLibraryList); Map askQuestionMap = askTemplateQuestionLibraryList.stream().collect(Collectors.toMap(AskTemplateQuestionLibrary::getId, Function.identity())); // 获取字典 Set dictIdSet = askTemplateQuestionLibraryList.stream().map(AskTemplateQuestionLibrary::getDictId).collect(Collectors.toSet()); @@ -291,6 +293,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService { videoInfoMaps.putAll(videoInfoMapsTmp); } + for (MedicalRecQaVO medicalRecQaVO : medicalRecQaList) { AskTemplateQuestionLibrary questionLibrary = askQuestionMap.get(medicalRecQaVO.getLibraryQuestionId()); if (ObjectUtil.isNotEmpty(questionLibrary)) { diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/OfflineAnswerVideoResource.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/OfflineAnswerVideoResource.java index 56422a34..234689b9 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/OfflineAnswerVideoResource.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/OfflineAnswerVideoResource.java @@ -43,6 +43,8 @@ public class OfflineAnswerVideoResource implements AnswerVideoResourceService { private final AskTemplateQuestionLibraryService askTemplateQuestionLibraryService; + private final AskTemplateQuestionSimilarityService askTemplateQuestionSimilarityService; + private final AskQuestionLibraryManageService askQuestionLibraryManageService; private final MaterialLibraryService materialLibraryService; @@ -109,6 +111,7 @@ public class OfflineAnswerVideoResource implements AnswerVideoResourceService { // 查询问题库问题 List questionLibraryList = askTemplateQuestionLibraryService.list(); + Map> questionMap = askTemplateQuestionSimilarityService.querySimilarityQuestionMapByLibraryLists(questionLibraryList); // 疾病id为空,不查询数据 List askPatientAnswerList = StrUtil.isEmpty(medicalId) ? CollUtil.newArrayList() : @@ -119,7 +122,7 @@ public class OfflineAnswerVideoResource implements AnswerVideoResourceService { List questionTypeDicList = commonDicService.lambdaQuery().eq(CommonDic::getGroupCode, "AQT").list(); medicalRecAnswerExcelDTOS.forEach(dto->dto.doAction( - questionLibraryList,askPatientAnswerList,materialLibraryList,questionTypeDicList)); + questionLibraryList,askPatientAnswerList,materialLibraryList,questionTypeDicList,questionMap)); } public void updateAskPatientAnswer(List medicalRecAnswerExcelDTOS,String medicalId){ diff --git a/virtual-patient-model/src/main/java/com/supervision/dto/AskTemplateQuestionLibraryDTO.java b/virtual-patient-model/src/main/java/com/supervision/dto/AskTemplateQuestionLibraryDTO.java new file mode 100644 index 00000000..8d93b499 --- /dev/null +++ b/virtual-patient-model/src/main/java/com/supervision/dto/AskTemplateQuestionLibraryDTO.java @@ -0,0 +1,14 @@ +package com.supervision.dto; + +import com.supervision.model.AskTemplateQuestionLibrary; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Data +public class AskTemplateQuestionLibraryDTO extends AskTemplateQuestionLibrary { + + private List question; +} diff --git a/virtual-patient-model/src/main/java/com/supervision/service/AskTemplateQuestionSimilarityService.java b/virtual-patient-model/src/main/java/com/supervision/service/AskTemplateQuestionSimilarityService.java index 516ba247..65cfb78b 100644 --- a/virtual-patient-model/src/main/java/com/supervision/service/AskTemplateQuestionSimilarityService.java +++ b/virtual-patient-model/src/main/java/com/supervision/service/AskTemplateQuestionSimilarityService.java @@ -1,8 +1,12 @@ package com.supervision.service; +import com.supervision.model.AskTemplateQuestionLibrary; import com.supervision.model.AskTemplateQuestionSimilarity; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import java.util.Map; + /** * @author Administrator * @description 针对表【vp_ask_template_question_similarity(相似问问题库)】的数据库操作Service @@ -10,4 +14,20 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface AskTemplateQuestionSimilarityService extends IService { + + /** + * 根据libraryIdList查询相似问题 + * @param libraryIdList 问题列表 + * @return key:问题id value:相似问题列表 + */ + Map> querySimilarityQuestionMapByLibraryIds(List libraryIdList); + + + /** + * 根据libraryList查询相似问题 + * @param libraryList 问题列表 + * @return + */ + Map> querySimilarityQuestionMapByLibraryLists(List libraryList); + } diff --git a/virtual-patient-model/src/main/java/com/supervision/service/impl/AskTemplateQuestionLibraryServiceImpl.java b/virtual-patient-model/src/main/java/com/supervision/service/impl/AskTemplateQuestionLibraryServiceImpl.java index 878c9839..280d76ac 100644 --- a/virtual-patient-model/src/main/java/com/supervision/service/impl/AskTemplateQuestionLibraryServiceImpl.java +++ b/virtual-patient-model/src/main/java/com/supervision/service/impl/AskTemplateQuestionLibraryServiceImpl.java @@ -7,9 +7,11 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.supervision.dto.QaKnowledgeDTO; import com.supervision.mapper.AskTemplateQuestionLibraryMapper; import com.supervision.model.AskTemplateQuestionLibrary; +import com.supervision.model.AskTemplateQuestionSimilarity; import com.supervision.model.ConfigAncillaryItem; import com.supervision.model.ConfigPhysicalTool; import com.supervision.service.AskTemplateQuestionLibraryService; +import com.supervision.service.AskTemplateQuestionSimilarityService; import com.supervision.service.ConfigAncillaryItemService; import com.supervision.service.ConfigPhysicalToolService; import com.supervision.vo.manage.AskQuestionLibraryReqVo; @@ -20,7 +22,9 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; /** * @author flevance @@ -37,6 +41,8 @@ public class AskTemplateQuestionLibraryServiceImpl extends ServiceImpl queryList(AskQuestionLibraryReqVo askQuestionLibraryReqVo) { @@ -67,10 +73,12 @@ public class AskTemplateQuestionLibraryServiceImpl extends ServiceImpl knowledgeList = new ArrayList<>(); + Map> librarySimilarityMap = askTemplateQuestionSimilarityService.querySimilarityQuestionMapByLibraryIds(null); + for (AskTemplateQuestionLibrary library : libraryList) { QaKnowledgeDTO qaKnowledgeDTO = new QaKnowledgeDTO(); qaKnowledgeDTO.setQuestionCode(library.getId()); - qaKnowledgeDTO.setQuestionList(library.getQuestion()); + qaKnowledgeDTO.setQuestionList(librarySimilarityMap.get(library.getId())); knowledgeList.add(qaKnowledgeDTO); } diff --git a/virtual-patient-model/src/main/java/com/supervision/service/impl/AskTemplateQuestionSimilarityServiceImpl.java b/virtual-patient-model/src/main/java/com/supervision/service/impl/AskTemplateQuestionSimilarityServiceImpl.java index 666a4240..b6e71d47 100644 --- a/virtual-patient-model/src/main/java/com/supervision/service/impl/AskTemplateQuestionSimilarityServiceImpl.java +++ b/virtual-patient-model/src/main/java/com/supervision/service/impl/AskTemplateQuestionSimilarityServiceImpl.java @@ -1,11 +1,18 @@ package com.supervision.service.impl; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.supervision.model.AskTemplateQuestionLibrary; import com.supervision.model.AskTemplateQuestionSimilarity; import com.supervision.service.AskTemplateQuestionSimilarityService; import com.supervision.mapper.AskTemplateQuestionSimilarityMapper; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + /** * @author Administrator * @description 针对表【vp_ask_template_question_similarity(相似问问题库)】的数据库操作Service实现 @@ -15,6 +22,34 @@ import org.springframework.stereotype.Service; public class AskTemplateQuestionSimilarityServiceImpl extends ServiceImpl implements AskTemplateQuestionSimilarityService{ + @Override + public Map> querySimilarityQuestionMapByLibraryIds(List libraryIdList) { + List similarityList = super.lambdaQuery() + .in(CollUtil.isNotEmpty(libraryIdList), AskTemplateQuestionSimilarity::getLibraryId, libraryIdList).list(); + + Map> similarityMap = similarityList.stream() + .collect(Collectors.groupingBy(AskTemplateQuestionSimilarity::getLibraryId, + Collectors.mapping(AskTemplateQuestionSimilarity::getSimilarityQuestion, Collectors.toList()))); + + if (CollUtil.isNotEmpty(libraryIdList)){ + for (String libraryId : libraryIdList) { + if (!similarityMap.containsKey(libraryId)){ + similarityMap.put(libraryId, new ArrayList<>()); + } + } + } + + return similarityMap; + } + + @Override + public Map> querySimilarityQuestionMapByLibraryLists(List libraryList) { + List libraryIdList = new ArrayList<>(); + if (CollUtil.isNotEmpty(libraryList)){ + libraryIdList = libraryList.stream().map(AskTemplateQuestionLibrary::getId).collect(Collectors.toList()); + } + return querySimilarityQuestionMapByLibraryIds(libraryIdList); + } } diff --git a/virtual-patient-web/src/main/java/com/supervision/controller/TestController.java b/virtual-patient-web/src/main/java/com/supervision/controller/TestController.java index 2e552746..1ad4abc3 100644 --- a/virtual-patient-web/src/main/java/com/supervision/controller/TestController.java +++ b/virtual-patient-web/src/main/java/com/supervision/controller/TestController.java @@ -1,5 +1,6 @@ package com.supervision.controller; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.digest.MD5; import cn.hutool.http.HttpUtil; @@ -10,6 +11,7 @@ import com.supervision.model.AskTemplateQuestionLibrary; import com.supervision.model.ConfigPhysicalTool; import com.supervision.model.DiagnosisAiRecord; import com.supervision.service.AskTemplateQuestionLibraryService; +import com.supervision.service.AskTemplateQuestionSimilarityService; import com.supervision.service.ConfigPhysicalToolService; import com.supervision.service.DiagnosisAiRecordService; import com.supervision.util.MinioUtil; @@ -49,6 +51,8 @@ public class TestController { private final OllamaChatClient chatClient; + private final AskTemplateQuestionSimilarityService askTemplateQuestionSimilarityService; + @GetMapping("testMatchQuestion") public String test(String question) { @@ -80,6 +84,12 @@ public class TestController { @GetMapping("testRedisVectorStore") public void testRedisVectorStore() { List list = askTemplateQuestionLibraryService.list(); + + if (CollUtil.isEmpty(list)){ + return; + } + + Map> similarityQuestionMap = askTemplateQuestionSimilarityService.querySimilarityQuestionMapByLibraryLists(list); for (AskTemplateQuestionLibrary askTemplateQuestionLibrary : list) { String description = askTemplateQuestionLibrary.getDescription(); redisVectorStore.add(List.of(new Document(description, @@ -87,7 +97,7 @@ public class TestController { "standardQuestionId", askTemplateQuestionLibrary.getId(), "questionId", askTemplateQuestionLibrary.getId(), "dictId", String.valueOf(askTemplateQuestionLibrary.getDictId()))))); - List question = askTemplateQuestionLibrary.getQuestion(); + List question = similarityQuestionMap.get(askTemplateQuestionLibrary.getId()); for (String s : question) { redisVectorStore.add(List.of(new Document(s, Map.of("type", "2", diff --git a/virtual-patient-web/src/test/java/com/supervision/AskTemplateIdTest.java b/virtual-patient-web/src/test/java/com/supervision/AskTemplateIdTest.java index c8b6fea4..ef80e5c6 100644 --- a/virtual-patient-web/src/test/java/com/supervision/AskTemplateIdTest.java +++ b/virtual-patient-web/src/test/java/com/supervision/AskTemplateIdTest.java @@ -17,10 +17,7 @@ import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator; import com.supervision.model.AskPatientAnswer; import com.supervision.model.AskTemplateQuestionLibrary; import com.supervision.model.CommonDic; -import com.supervision.service.AskPatientAnswerService; -import com.supervision.service.AskService; -import com.supervision.service.AskTemplateQuestionLibraryService; -import com.supervision.service.CommonDicService; +import com.supervision.service.*; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.junit.Test; @@ -52,6 +49,9 @@ public class AskTemplateIdTest { @Autowired private AskService askService; + @Autowired + private AskTemplateQuestionSimilarityService askTemplateQuestionSimilarityService; + @Test public void creatAskId() { Object o = new Object(); @@ -105,6 +105,8 @@ public class AskTemplateIdTest { List aqtList = commonDicService.lambdaQuery().eq(CommonDic::getGroupCode, "AQT").isNotNull(CommonDic::getParentId).ne(CommonDic::getParentId, 179).list(); Map dictMap = aqtList.stream().collect(Collectors.toMap(CommonDic::getId, Function.identity())); List list = askTemplateQuestionLibraryService.list(); + + Map> similarQuestionMap = askTemplateQuestionSimilarityService.querySimilarityQuestionMapByLibraryLists(list); for (AskTemplateQuestionLibrary ask : list) { try { CommonDic dic = dictMap.get(ask.getDictId()); @@ -112,8 +114,9 @@ public class AskTemplateIdTest { String description = ask.getDescription(); Map map = new HashMap<>(); map.put("role", "user"); + map.put("content", "假设你是一个精通RASA NLU调优的工程师,我现在有一个意图,有一个问题示例,请你根据这个意图,针对这个问题示例,提出30条与这个问题示例类似的问题,注意,问题不要超出这个意图的范围,回答请使用json array的格式,示例:[\"相似问题1\",\"相似问题2\"]\n" + - "### 下面是意图和问题示例\n" + dic.getNameZhPath() + ":" + ask.getQuestion()); + "### 下面是意图和问题示例\n" + dic.getNameZhPath() + ":" + similarQuestionMap.get(ask.getId())); HashMap param = new HashMap<>(); param.put("messages", CollUtil.newArrayList(map)); String askAnswer = HttpUtil.post("https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=" + accessToken, JSONUtil.toJsonStr(param)); @@ -122,7 +125,7 @@ public class AskTemplateIdTest { String s = ReUtil.get("\\[(.*?)\\]", result, 0); List question = JSONUtil.toList(s, String.class); question.add(0, description); - askTemplateQuestionLibraryService.lambdaUpdate().set(AskTemplateQuestionLibrary::getQuestion, JSONUtil.toJsonStr(question)).eq(AskTemplateQuestionLibrary::getId, ask.getId()).update(); +// askTemplateQuestionLibraryService.lambdaUpdate().set(AskTemplateQuestionLibrary::getQuestion, JSONUtil.toJsonStr(question)).eq(AskTemplateQuestionLibrary::getId, ask.getId()).update(); } } catch (Exception e) { @@ -201,6 +204,8 @@ public class AskTemplateIdTest { Map dictMap = aqtList.stream().collect(Collectors.toMap(CommonDic::getNameZhPath, Function.identity())); List libraryList = askTemplateQuestionLibraryService.list(); Map libraryMap = libraryList.stream().collect(Collectors.toMap(AskTemplateQuestionLibrary::getDictId, Function.identity())); + + Map> similarityQuestionMap = askTemplateQuestionSimilarityService.querySimilarityQuestionMapByLibraryLists(libraryList); // 遍历match_result.json文件 JSONArray jsonArray = JSONUtil.readJSONArray(FileUtil.file("/Users/flevance/Desktop/知识图谱调优/matching_results.json"), StandardCharsets.UTF_8); // 根据测试问题判断,匹配度最高的问题,是不是包含在question列表内,如果不是,就提示 @@ -225,7 +230,7 @@ public class AskTemplateIdTest { if (ObjectUtil.isEmpty(askTemplateQuestionLibrary)) { log.info("测试问题:{},对应意图:{},期望的意图找到了,但是期望意图对应的知识库数据未找到", testQuestion, intent); } - Set dataBaseQuestionSet = new HashSet<>(askTemplateQuestionLibrary.getQuestion()); + Set dataBaseQuestionSet = new HashSet<>(similarityQuestionMap.get(askTemplateQuestionLibrary.getId())); if (!dataBaseQuestionSet.contains(question)) { log.info("测试问题:{},对应意图:{},实际匹配相似度最高的问题为:{},但并不是实际期待匹配的意图", testQuestion, intent, question); } else { diff --git a/virtual-patient-web/src/test/java/com/supervision/RedisVecTest.java b/virtual-patient-web/src/test/java/com/supervision/RedisVecTest.java index 70fd3e75..6ea5d54c 100644 --- a/virtual-patient-web/src/test/java/com/supervision/RedisVecTest.java +++ b/virtual-patient-web/src/test/java/com/supervision/RedisVecTest.java @@ -109,15 +109,16 @@ public class RedisVecTest { List questionLibraryList = askTemplateQuestionLibraryService.lambdaQuery().notIn(AskTemplateQuestionLibrary::getDictId, dicIds).list(); - for (AskTemplateQuestionLibrary library : questionLibraryList) { - List questionList = library.getQuestion(); - for (String question : questionList) { - AskTemplateQuestionSimilarity similarity = new AskTemplateQuestionSimilarity(); - similarity.setLibraryId(library.getId()); - similarity.setSimilarityQuestion(question); - askTemplateQuestionSimilarityService.save(similarity); - } - } + +// for (AskTemplateQuestionLibrary library : questionLibraryList) { +// List questionList = library.getQuestion(); +// for (String question : questionList) { +// AskTemplateQuestionSimilarity similarity = new AskTemplateQuestionSimilarity(); +// similarity.setLibraryId(library.getId()); +// similarity.setSimilarityQuestion(question); +// askTemplateQuestionSimilarityService.save(similarity); +// } +// } } diff --git a/virtual-patient-web/src/test/java/com/supervision/VecTest.java b/virtual-patient-web/src/test/java/com/supervision/VecTest.java index 17fb40fc..63a4a14d 100644 --- a/virtual-patient-web/src/test/java/com/supervision/VecTest.java +++ b/virtual-patient-web/src/test/java/com/supervision/VecTest.java @@ -19,6 +19,7 @@ import com.supervision.model.AskTemplateQuestionLibrary; import com.supervision.model.CommonDic; import com.supervision.service.AskPatientAnswerService; import com.supervision.service.AskTemplateQuestionLibraryService; +import com.supervision.service.AskTemplateQuestionSimilarityService; import com.supervision.service.CommonDicService; import lombok.extern.slf4j.Slf4j; import org.junit.Test; @@ -47,6 +48,8 @@ public class VecTest { private CommonDicService commonDicService; @Autowired private AskPatientAnswerService askPatientAnswerService; + @Autowired + private AskTemplateQuestionSimilarityService askTemplateQuestionSimilarityService; @Test public void questionCompareGenerateTest() { @@ -117,9 +120,9 @@ public class VecTest { @Test public void questionEqualGenerateTest() { - List libraries = askTemplateQuestionLibraryService.list() - .stream().peek(library -> library.getQuestion().forEach(StrUtil::trim)) - .collect(Collectors.toList()); + // askTemplateQuestionSimilarityService + List libraries = askTemplateQuestionLibraryService.list(); + Map> similarQuestionMap = askTemplateQuestionSimilarityService.querySimilarityQuestionMapByLibraryLists(libraries); List commonDics = commonDicService.lambdaQuery().eq(CommonDic::getGroupCode, "AQT").list(); Map dicMap = commonDics.stream().collect(Collectors.toMap(CommonDic::getId, v -> v)); @@ -127,14 +130,14 @@ public class VecTest { // 构建问题map id -->> question --->> library Map> questionMap = new HashMap<>(); for (AskTemplateQuestionLibrary library : libraries) { - Map map = library.getQuestion().stream().collect(Collectors.toMap(v -> v, v -> library)); + Map map = similarQuestionMap.get(library.getId()).stream().collect(Collectors.toMap(v -> v, v -> library)); questionMap.put(library.getId(), map); } // 循环处理数据 List> result = new ArrayList<>(); for (AskTemplateQuestionLibrary library : libraries) { - List questionList = library.getQuestion(); + List questionList = similarQuestionMap.get(library.getId()); for (String sourceQuestion : questionList) { //确认同组数据中是否存在相同的问题 long count = questionList.stream().filter(v -> StrUtil.equals(sourceQuestion, v)).count(); @@ -201,6 +204,7 @@ public class VecTest { public void questionSimilarityGenerateTest() { List questionLibraries = askTemplateQuestionLibraryService.list(); + Map> similarQuestionMap = askTemplateQuestionSimilarityService.querySimilarityQuestionMapByLibraryLists(questionLibraries); List commonDics = commonDicService.lambdaQuery().eq(CommonDic::getGroupCode, "AQT").list(); Map dicMap = commonDics.stream().collect(Collectors.toMap(CommonDic::getId, v -> v)); @@ -209,7 +213,7 @@ public class VecTest { List> result = new ArrayList<>(); for (AskTemplateQuestionLibrary questionLibrary : questionLibraries) { - List questionList = questionLibrary.getQuestion(); + List questionList = similarQuestionMap.get(questionLibrary.getId()); for (String question : questionList) { List> maps = questionMatch(question); if (CollUtil.isEmpty(maps)) { @@ -256,13 +260,14 @@ public class VecTest { @Test public void questionSimilarityTopGenerateTest() { List questionLibraries = askTemplateQuestionLibraryService.list(); + Map> similarQuestionMap = askTemplateQuestionSimilarityService.querySimilarityQuestionMapByLibraryLists(questionLibraries); List commonDics = commonDicService.lambdaQuery().eq(CommonDic::getGroupCode, "AQT").list(); Map dicMap = commonDics.stream().collect(Collectors.toMap(CommonDic::getId, v -> v)); Map libraryMap = questionLibraries.stream().collect(Collectors.toMap(AskTemplateQuestionLibrary::getId, library -> library)); List> result = new ArrayList<>(); for (AskTemplateQuestionLibrary questionLibrary : questionLibraries) { - for (String question : questionLibrary.getQuestion()) { + for (String question : similarQuestionMap.get(questionLibrary.getId())) { List> maps = questionMatch(question); // 只获取前四条数据 @@ -407,12 +412,12 @@ public class VecTest { @Test public void initVecData() { List questionLibraries = askTemplateQuestionLibraryService.list(); - + Map> similarQuestionMap = askTemplateQuestionSimilarityService.querySimilarityQuestionMapByLibraryLists(questionLibraries); // load vec data List> vecData = questionLibraries.stream().map(library -> { Map map = new HashMap<>(); map.put("questionCode", library.getId()); - map.put("questionList", library.getQuestion()); + map.put("questionList", similarQuestionMap.get(library.getId())); return map; }).collect(Collectors.toList()); saveVec(vecData); @@ -434,11 +439,12 @@ public class VecTest { @Test public void initQuestionJoinVecData() { List questionLibraries = askTemplateQuestionLibraryService.list(); + Map> similarQuestionMap = askTemplateQuestionSimilarityService.querySimilarityQuestionMapByLibraryLists(questionLibraries); // load vec data List> vecData = questionLibraries.stream().map(library -> { Map map = new HashMap<>(); map.put("questionCode", library.getId()); - List joinList = library.getQuestion().stream() + List joinList = similarQuestionMap.get(library.getId()).stream() .map(question -> question + " "/* + library.getDefaultAnswer()*/).collect(Collectors.toList()); map.put("questionList", joinList); return map; @@ -453,11 +459,12 @@ public class VecTest { List answerList = askPatientAnswerService.lambdaQuery().eq(AskPatientAnswer::getMedicalId, medicalId).list(); Map answerMap = answerList.stream().collect(Collectors.toMap(AskPatientAnswer::getLibraryQuestionId, v -> v)); List questionLibraries = askTemplateQuestionLibraryService.list(); + Map> similarQuestionMap = askTemplateQuestionSimilarityService.querySimilarityQuestionMapByLibraryLists(questionLibraries); List> result = new ArrayList<>(); for (AskTemplateQuestionLibrary questionLibrary : questionLibraries) { - if (!questionLibrary.getDescription().contains(questionLibrary.getDescription())) { + /*if (!questionLibrary.getDescription().contains(questionLibrary.getDescription())) { questionLibrary.getQuestion().add(questionLibrary.getDescription()); - } + }*/ AskPatientAnswer askPatientAnswer = answerMap.get(questionLibrary.getId()); if (ObjectUtil.isEmpty(askPatientAnswer)) { @@ -466,7 +473,7 @@ public class VecTest { } Map map = new HashMap<>(); map.put("questionCode", questionLibrary.getId()); - map.put("questionList", questionLibrary.getQuestion()); + map.put("questionList", similarQuestionMap.get(questionLibrary.getId())); result.add(map); } saveVec(result); @@ -591,19 +598,19 @@ public class VecTest { Map answerMap = answerList.stream().collect(Collectors.toMap(AskPatientAnswer::getLibraryQuestionId, v -> v)); List questionLibraries = askTemplateQuestionLibraryService.list(); - + Map> similarQuestionMap = askTemplateQuestionSimilarityService.querySimilarityQuestionMapByLibraryLists(questionLibraries); List> result = new ArrayList<>(); for (AskTemplateQuestionLibrary questionLibrary : questionLibraries) { - if (!questionLibrary.getDescription().contains(questionLibrary.getDescription())) { + /*if (!questionLibrary.getDescription().contains(questionLibrary.getDescription())) { questionLibrary.getQuestion().add(questionLibrary.getDescription()); - } + }*/ AskPatientAnswer askPatientAnswer = answerMap.get(questionLibrary.getId()); if (ObjectUtil.isEmpty(askPatientAnswer)) { log.info("问题:id:{} desc:{},未设置回复答案,跳过", questionLibrary.getId(), questionLibrary.getDescription()); continue; } - for (String question : questionLibrary.getQuestion()) { + for (String question : similarQuestionMap.get(questionLibrary.getId())) { HashMap map = new HashMap<>(); map.put("Q", question); map.put("A", askPatientAnswer.getAnswer()); @@ -622,11 +629,11 @@ public class VecTest { @Test public void questionListClean() { List questionLibraries = askTemplateQuestionLibraryService.lambdaQuery().eq(AskTemplateQuestionLibrary::getId, "1761963910199513090").orderByDesc(AskTemplateQuestionLibrary::getId).list(); - + Map> similarQuestionMap = askTemplateQuestionSimilarityService.querySimilarityQuestionMapByLibraryLists(questionLibraries); Console console = System.console(); for (AskTemplateQuestionLibrary questionLibrary : questionLibraries) { String description = questionLibrary.getDescription(); - List question = questionLibrary.getQuestion(); + List question = similarQuestionMap.get(questionLibrary.getId()); List addList = new ArrayList<>();