1: AskTemplateQuestionLibrary中的数据同步到redis-vector中

pull/1/head
xueqingkun 11 months ago
parent a40a202d7f
commit 11578270eb

@ -90,8 +90,6 @@
<artifactId>virtual-patient-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>

@ -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"})

@ -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<String> questionIds);
/**
*
* @param askTemplateQuestionLibrarys id
* @param askTemplateQuestionSimilaritys id
* @return true false:
*/
boolean saveOrUpdateQuestionLibrary(List<AskTemplateQuestionLibrary> askTemplateQuestionLibrarys,
List<AskTemplateQuestionSimilarity> askTemplateQuestionSimilaritys);
/**
*
* @param questionIds id
* @return true false:
*/
boolean deleteQuestionLibrary(List<String> questionIds);
}

@ -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;
}

@ -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<String,Object> toMap(){
return Map.of("type", type,
"libraryQuestionId", libraryQuestionId,
"questionId", questionId,
"dictId", String.valueOf(dictId));
}
}
public void refreshQaKnowledge() {
// 修改为手动刷新向量库
List<AskTemplateQuestionLibrary> 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<String, Object> questionVector = new QuestionMetadata("1",
askTemplateQuestionLibrary.getId(), askTemplateQuestionLibrary.getId(),
askTemplateQuestionLibrary.getDictId()).toMap();
redisVectorStore.add(List.of(new Document(askTemplateQuestionLibrary.getId(),description, questionVector)));
List<AskTemplateQuestionSimilarity> 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<String, Object> 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<String> questionIds) {
if (CollUtil.isEmpty(questionIds)){
log.info("saveOrUpdateQuestionLibraryquestionIds为空");
return false;
}
List<AskTemplateQuestionLibrary> questionLibraries = askTemplateQuestionLibraryService.lambdaQuery().in(AskTemplateQuestionLibrary::getId, questionIds).list();
if (CollUtil.isEmpty(questionLibraries)){
log.info("saveOrUpdateQuestionLibraryquestionIds={}数据不存在", questionIds);
return false;
}
List<String> libraryIds = questionLibraries.stream().map(AskTemplateQuestionLibrary::getId).toList();
List<AskTemplateQuestionSimilarity> similarityList = askTemplateQuestionSimilarityService.lambdaQuery()
.in(AskTemplateQuestionSimilarity::getLibraryId, libraryIds).list();
return this.saveOrUpdateQuestionLibrary(questionLibraries, similarityList);
}
@Override
public boolean saveOrUpdateQuestionLibrary(List<AskTemplateQuestionLibrary> askTemplateQuestionLibrary,
List<AskTemplateQuestionSimilarity> askTemplateQuestionSimilarity) {
List<Document> documentList = new ArrayList<>();
// 组装问题库中标准问题的document
if (CollUtil.isNotEmpty(askTemplateQuestionLibrary)){
List<Document> 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<String, Long> libraryIdDictIdMap = askTemplateQuestionLibrary.stream().collect(Collectors.toMap(AskTemplateQuestionLibrary::getId, AskTemplateQuestionLibrary::getDictId,(v1,v2)->v1));
// 组装相似问题的document
if (CollUtil.isNotEmpty(askTemplateQuestionSimilarity)){
List<Document> 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<String> questionIds) {
if (CollUtil.isEmpty(questionIds)){
log.info("deleteQuestionLibraryquestionIds为空");
return false;
}
// 没有办法直接根据questionIds找到数据对用的id需要从mysql数据库中查找
List<String> libraryQuestionIdList = askTemplateQuestionLibraryService.lambdaQuery()
.in(AskTemplateQuestionLibrary::getId, questionIds).list()
.stream().map(AskTemplateQuestionLibrary::getId).toList();
List<String> similarityQuestionIdList = askTemplateQuestionSimilarityService.lambdaQuery()
.in(AskTemplateQuestionSimilarity::getLibraryId, libraryQuestionIdList).list()
.stream().map(AskTemplateQuestionSimilarity::getId).collect(Collectors.toList());
similarityQuestionIdList.addAll(libraryQuestionIdList);
return redisVectorStore.delete(similarityQuestionIdList).orElse(false);
}
}

@ -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<Map<String, String>> mapList = loadItems();
@Autowired
QaKnowledgeManageService qaKnowledgeManageService;
@Test
public void vecTest(){
qaKnowledgeManageService.saveOrUpdateQuestionLibrary(List.of("123232"));
boolean b = qaKnowledgeManageService.deleteQuestionLibrary(List.of("123232"));
}
}

Loading…
Cancel
Save