From 11578270eb9ec2faf617264d1d73f6b413379a8c Mon Sep 17 00:00:00 2001 From: xueqingkun Date: Fri, 7 Jun 2024 17:20:48 +0800 Subject: [PATCH] =?UTF-8?q?1:=20AskTemplateQuestionLibrary=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE=E5=90=8C=E6=AD=A5=E5=88=B0redis-vec?= =?UTF-8?q?tor=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- virtual-patient-manage/pom.xml | 2 - .../VirtualPatientManageApplication.java | 1 - .../service/QaKnowledgeManageService.java | 28 +++++ .../AskQuestionLibraryManageServiceImpl.java | 4 +- .../impl/QaKnowledgeManageServiceImpl.java | 110 ++++++++++++++++-- .../VirtualPatientManageApplicationTests.java | 11 +- 6 files changed, 139 insertions(+), 17 deletions(-) diff --git a/virtual-patient-manage/pom.xml b/virtual-patient-manage/pom.xml index 037a417f..3ba34ae7 100644 --- a/virtual-patient-manage/pom.xml +++ b/virtual-patient-manage/pom.xml @@ -90,8 +90,6 @@ virtual-patient-common ${project.version} - - org.projectlombok lombok diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/VirtualPatientManageApplication.java b/virtual-patient-manage/src/main/java/com/supervision/manage/VirtualPatientManageApplication.java index fb09bda9..52510975 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/VirtualPatientManageApplication.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/VirtualPatientManageApplication.java @@ -6,7 +6,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.ComponentScans; @SpringBootApplication @MapperScan(basePackages = {"com.supervision.**.mapper"}) diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/QaKnowledgeManageService.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/QaKnowledgeManageService.java index f163e540..0550a5a5 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/QaKnowledgeManageService.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/QaKnowledgeManageService.java @@ -1,6 +1,34 @@ package com.supervision.manage.service; +import com.supervision.model.AskTemplateQuestionLibrary; +import com.supervision.model.AskTemplateQuestionSimilarity; + +import java.util.List; + public interface QaKnowledgeManageService { void refreshQaKnowledge(); + + /** + * 保存或者更新问题库 + * @param questionIds 问题id + * @return true:成功 false:失败 + */ + boolean saveOrUpdateQuestionLibrary(List questionIds); + + /** + * 保存或者更新问题库 + * @param askTemplateQuestionLibrarys 问题id + * @param askTemplateQuestionSimilaritys 相似问题id + * @return true:成功 false:失败 + */ + boolean saveOrUpdateQuestionLibrary(List askTemplateQuestionLibrarys, + List askTemplateQuestionSimilaritys); + + /** + * 删除问题库 + * @param questionIds 问题id + * @return true:成功 false:失败 + */ + boolean deleteQuestionLibrary(List questionIds); } 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 923a578e..c6eb475b 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 @@ -136,6 +136,7 @@ public class AskQuestionLibraryManageServiceImpl implements AskQuestionLibraryMa askTemplateQuestionLibrary.setCode(nextCode); askTemplateQuestionLibraryService.save(askTemplateQuestionLibrary); + qaKnowledgeManageService.saveOrUpdateQuestionLibrary(CollUtil.newArrayList(askTemplateQuestionLibrary.getId())); return askTemplateQuestionLibrary.getId(); } } @@ -173,8 +174,9 @@ public class AskQuestionLibraryManageServiceImpl implements AskQuestionLibraryMa Assert.notEmpty(id, "id不能为空"); askTemplateQuestionLibraryService.removeById(id); + askTemplateQuestionSimilarityService.lambdaUpdate().in(AskTemplateQuestionSimilarity::getLibraryId, id).remove(); // 对问题库进行更新操作 - qaKnowledgeManageService.refreshQaKnowledge(); + qaKnowledgeManageService.deleteQuestionLibrary(CollUtil.newArrayList(id)); return true; } diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/QaKnowledgeManageServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/QaKnowledgeManageServiceImpl.java index 290b8c60..15357115 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/QaKnowledgeManageServiceImpl.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/QaKnowledgeManageServiceImpl.java @@ -12,8 +12,10 @@ import org.springframework.ai.document.Document; import org.springframework.ai.vectorstore.RedisVectorStore; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -26,28 +28,114 @@ public class QaKnowledgeManageServiceImpl implements QaKnowledgeManageService { private final RedisVectorStore redisVectorStore; - + public record QuestionMetadata(String type, String libraryQuestionId, String questionId, Long dictId) { + public Map toMap(){ + return Map.of("type", type, + "libraryQuestionId", libraryQuestionId, + "questionId", questionId, + "dictId", String.valueOf(dictId)); + } + } public void refreshQaKnowledge() { // 修改为手动刷新向量库 List list = askTemplateQuestionLibraryService.list(); + + // 清空向量库 + log.info("refreshQaKnowledge:开始刷新redis向量库..."); + redisVectorStore.getJedis().flushDB(); + log.info("refreshQaKnowledge:向量库已清空..."); + if (CollUtil.isEmpty(list)) { return; } + for (AskTemplateQuestionLibrary askTemplateQuestionLibrary : list) { String description = askTemplateQuestionLibrary.getStandardQuestion(); - redisVectorStore.add(List.of(new Document(description, - Map.of("type", "1", - "libraryQuestionId", askTemplateQuestionLibrary.getId(), - "questionId", askTemplateQuestionLibrary.getId(), - "dictId", String.valueOf(askTemplateQuestionLibrary.getDictId()))))); + Map questionVector = new QuestionMetadata("1", + askTemplateQuestionLibrary.getId(), askTemplateQuestionLibrary.getId(), + askTemplateQuestionLibrary.getDictId()).toMap(); + redisVectorStore.add(List.of(new Document(askTemplateQuestionLibrary.getId(),description, questionVector))); + List similarityList = askTemplateQuestionSimilarityService.lambdaQuery().eq(AskTemplateQuestionSimilarity::getLibraryId, askTemplateQuestionLibrary.getId()).list(); for (AskTemplateQuestionSimilarity askTemplateQuestionSimilarity : similarityList) { - redisVectorStore.add(List.of(new Document(askTemplateQuestionSimilarity.getSimilarityQuestion(), - Map.of("type", "2", - "libraryQuestionId", askTemplateQuestionSimilarity.getLibraryId(), - "questionId", askTemplateQuestionSimilarity.getId(), - "dictId", String.valueOf(askTemplateQuestionLibrary.getDictId()))))); + Map questionVectorNest = new QuestionMetadata("2", + askTemplateQuestionSimilarity.getLibraryId(), askTemplateQuestionSimilarity.getId(), + askTemplateQuestionLibrary.getDictId()).toMap(); + redisVectorStore.add(List.of(new Document(askTemplateQuestionLibrary.getId(), + askTemplateQuestionSimilarity.getSimilarityQuestion(), + questionVectorNest))); } } } + + + + + @Override + public boolean saveOrUpdateQuestionLibrary(List questionIds) { + + if (CollUtil.isEmpty(questionIds)){ + log.info("saveOrUpdateQuestionLibrary:questionIds为空"); + return false; + } + List questionLibraries = askTemplateQuestionLibraryService.lambdaQuery().in(AskTemplateQuestionLibrary::getId, questionIds).list(); + if (CollUtil.isEmpty(questionLibraries)){ + log.info("saveOrUpdateQuestionLibrary:questionIds={}数据不存在", questionIds); + return false; + } + + List libraryIds = questionLibraries.stream().map(AskTemplateQuestionLibrary::getId).toList(); + List similarityList = askTemplateQuestionSimilarityService.lambdaQuery() + .in(AskTemplateQuestionSimilarity::getLibraryId, libraryIds).list(); + + return this.saveOrUpdateQuestionLibrary(questionLibraries, similarityList); + } + + @Override + public boolean saveOrUpdateQuestionLibrary(List askTemplateQuestionLibrary, + List askTemplateQuestionSimilarity) { + + List documentList = new ArrayList<>(); + // 组装问题库中标准问题的document + if (CollUtil.isNotEmpty(askTemplateQuestionLibrary)){ + List documents = askTemplateQuestionLibrary.stream().map(question -> { + QuestionMetadata questionMetadata = new QuestionMetadata("1", question.getId(), question.getId(), question.getDictId()); + return new Document(question.getId(), question.getStandardQuestion(), questionMetadata.toMap()); + }).toList(); + documentList.addAll(documents); + } + + Map libraryIdDictIdMap = askTemplateQuestionLibrary.stream().collect(Collectors.toMap(AskTemplateQuestionLibrary::getId, AskTemplateQuestionLibrary::getDictId,(v1,v2)->v1)); + // 组装相似问题的document + if (CollUtil.isNotEmpty(askTemplateQuestionSimilarity)){ + List documents = askTemplateQuestionSimilarity.stream().map(similarity -> { + QuestionMetadata questionMetadata = new QuestionMetadata("2", similarity.getLibraryId(), similarity.getId(), libraryIdDictIdMap.get(similarity.getLibraryId())); + return new Document(similarity.getId(), similarity.getSimilarityQuestion(), questionMetadata.toMap()); + }).toList(); + documentList.addAll(documents); + } + redisVectorStore.add(documentList); + return true; + } + + @Override + public boolean deleteQuestionLibrary(List questionIds) { + + if (CollUtil.isEmpty(questionIds)){ + log.info("deleteQuestionLibrary:questionIds为空"); + return false; + } + // 没有办法直接根据questionIds找到数据对用的id,需要从mysql数据库中查找 + List libraryQuestionIdList = askTemplateQuestionLibraryService.lambdaQuery() + .in(AskTemplateQuestionLibrary::getId, questionIds).list() + .stream().map(AskTemplateQuestionLibrary::getId).toList(); + + List similarityQuestionIdList = askTemplateQuestionSimilarityService.lambdaQuery() + .in(AskTemplateQuestionSimilarity::getLibraryId, libraryQuestionIdList).list() + .stream().map(AskTemplateQuestionSimilarity::getId).collect(Collectors.toList()); + similarityQuestionIdList.addAll(libraryQuestionIdList); + + return redisVectorStore.delete(similarityQuestionIdList).orElse(false); + } + } diff --git a/virtual-patient-manage/src/test/java/com/supervision/manage/VirtualPatientManageApplicationTests.java b/virtual-patient-manage/src/test/java/com/supervision/manage/VirtualPatientManageApplicationTests.java index 1eeaa65e..e78ca86f 100644 --- a/virtual-patient-manage/src/test/java/com/supervision/manage/VirtualPatientManageApplicationTests.java +++ b/virtual-patient-manage/src/test/java/com/supervision/manage/VirtualPatientManageApplicationTests.java @@ -12,6 +12,7 @@ import com.supervision.manage.pojo.vo.MedicalAnswerVideoResVo; import com.supervision.manage.pojo.vo.UploadQuestionLibraryResVo; import com.supervision.manage.service.AnswerVideoResourceService; import com.supervision.manage.service.AskQuestionLibraryManageService; +import com.supervision.manage.service.QaKnowledgeManageService; import com.supervision.model.CommonDic; import com.supervision.service.AskPatientAnswerService; import com.supervision.service.AskTemplateQuestionLibraryService; @@ -179,8 +180,14 @@ class VirtualPatientManageApplicationTests { } - public static void main(String[] args) { - List> mapList = loadItems(); + @Autowired + QaKnowledgeManageService qaKnowledgeManageService; + + @Test + public void vecTest(){ + qaKnowledgeManageService.saveOrUpdateQuestionLibrary(List.of("123232")); + + boolean b = qaKnowledgeManageService.deleteQuestionLibrary(List.of("123232")); } }