|
|
|
@ -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("saveOrUpdateQuestionLibrary:questionIds为空");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
List<AskTemplateQuestionLibrary> questionLibraries = askTemplateQuestionLibraryService.lambdaQuery().in(AskTemplateQuestionLibrary::getId, questionIds).list();
|
|
|
|
|
if (CollUtil.isEmpty(questionLibraries)){
|
|
|
|
|
log.info("saveOrUpdateQuestionLibrary:questionIds={}数据不存在", 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("deleteQuestionLibrary:questionIds为空");
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|