From 7b9fd6d21c574ecb72d8a5c0f4d0346b9869f3bb Mon Sep 17 00:00:00 2001 From: liu Date: Wed, 5 Jun 2024 16:07:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=90=91=E9=87=8F=E5=8C=96?= =?UTF-8?q?=E7=9A=84=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/VectorSimilarityConfiguration.java | 2 ++ .../service/impl/AskServiceImpl.java | 24 +++++++++++++------ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/virtual-patient-common/src/main/java/com/supervision/config/VectorSimilarityConfiguration.java b/virtual-patient-common/src/main/java/com/supervision/config/VectorSimilarityConfiguration.java index 7c0cc4e1..c65435e5 100644 --- a/virtual-patient-common/src/main/java/com/supervision/config/VectorSimilarityConfiguration.java +++ b/virtual-patient-common/src/main/java/com/supervision/config/VectorSimilarityConfiguration.java @@ -26,6 +26,8 @@ public class VectorSimilarityConfiguration { .withMetadataFields( // 问题的ID RedisVectorStore.MetadataField.tag("questionId"), + // 标准问ID + RedisVectorStore.MetadataField.tag("standardQuestionId"), // 类型 1标准问 2相似问 3自定义 RedisVectorStore.MetadataField.tag("type")) .build(); diff --git a/virtual-patient-web/src/main/java/com/supervision/service/impl/AskServiceImpl.java b/virtual-patient-web/src/main/java/com/supervision/service/impl/AskServiceImpl.java index da69cea8..b9bccb2d 100644 --- a/virtual-patient-web/src/main/java/com/supervision/service/impl/AskServiceImpl.java +++ b/virtual-patient-web/src/main/java/com/supervision/service/impl/AskServiceImpl.java @@ -27,6 +27,8 @@ import com.supervision.util.UserUtil; import com.supervision.vo.rasa.RasaTalkVo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.ai.document.Document; +import org.springframework.ai.vectorstore.RedisVectorStore; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -65,7 +67,8 @@ public class AskServiceImpl implements AskService { private final DiagnosisAiRecordService diagnosisAiRecordService; - @Value("${qaSimilarityThreshold:0.4}") + private final RedisVectorStore redisVectorStore; + @Value("${qaSimilarityThreshold:0.7}") private String qaSimilarityThreshold; @Override @@ -234,14 +237,21 @@ public class AskServiceImpl implements AskService { } } - public QaSimilarityQuestionAnswer talkQaSimilarityWithScore(String question, String sessionId) { + public QaSimilarityQuestionAnswer talkRedisVectorWithScore(String question) { log.info("开始调用talkQaSimilarity,问题:{}", question); try { - GlobalResult> result = askQaSimilarityFeignClient.askQuestionSimilarityAnswer(new QaSimilarityQuestion(question)); + // 走Redis进行比较 + List documents = redisVectorStore.similaritySearch(question); + Optional first = documents.stream().map(document -> { + QaSimilarityQuestionAnswer qaSimilarityQuestionAnswer = new QaSimilarityQuestionAnswer(); + qaSimilarityQuestionAnswer.setMatchQuestion(document.getContent()); + qaSimilarityQuestionAnswer.setMatchQuestionCode(String.valueOf(document.getMetadata().get("standardQuestionId"))); + qaSimilarityQuestionAnswer.setMatchScore(Double.parseDouble(String.valueOf(document.getMetadata().get("standardQuestionId")))); + return qaSimilarityQuestionAnswer; + }).max(Comparator.comparing(QaSimilarityQuestionAnswer::getMatchScore)); // 排序,降序,取最高的 - result.getData().sort(Comparator.comparing(QaSimilarityQuestionAnswer::getMatchScore).reversed()); - log.info("调用talkQaSimilarity结束,问题:{},返回结果:{}", question, JSONUtil.toJsonStr(result)); - return CollUtil.getFirst(result.getData()); + log.info("调用talkQaSimilarity结束,问题:{},返回结果:{}", question, JSONUtil.toJsonStr(first.orElse(null))); + return first.orElse(null); } catch (Exception e) { log.error("调用talkQaSimilarity error ", e); return null; @@ -301,7 +311,7 @@ public class AskServiceImpl implements AskService { // 根据processId找到对应的病人 Process process = Optional.ofNullable(processService.getById(talkReqVO.getProcessId())).orElseThrow(() -> new BusinessException("未找到诊疗进程")); MedicalRec medicalRec = medicalRecService.getById(process.getMedicalRecId()); - QaSimilarityQuestionAnswer qaSimilarityQuestionAnswer = talkQaSimilarityWithScore(talkReqVO.getText(), UserUtil.getUser().getId()); + QaSimilarityQuestionAnswer qaSimilarityQuestionAnswer = talkRedisVectorWithScore(talkReqVO.getText()); TalkVideoTtsResultResVO talkVideoTtsResultResVO = new TalkVideoTtsResultResVO(); // 如果匹配度没有匹配到任何数据,则走大模型 if (ObjectUtil.isEmpty(qaSimilarityQuestionAnswer)) {