|
|
@ -18,9 +18,11 @@ import com.supervision.pojo.qaSimilarity.QaSimilarityQuestion;
|
|
|
|
import com.supervision.pojo.qaSimilarity.QaSimilarityQuestionAnswer;
|
|
|
|
import com.supervision.pojo.qaSimilarity.QaSimilarityQuestionAnswer;
|
|
|
|
import com.supervision.pojo.vo.TalkResultResVO;
|
|
|
|
import com.supervision.pojo.vo.TalkResultResVO;
|
|
|
|
import com.supervision.pojo.vo.TalkVideoReqVO;
|
|
|
|
import com.supervision.pojo.vo.TalkVideoReqVO;
|
|
|
|
|
|
|
|
import com.supervision.pojo.vo.TalkVideoTtsResultResVO;
|
|
|
|
import com.supervision.service.*;
|
|
|
|
import com.supervision.service.*;
|
|
|
|
import com.supervision.util.AsrUtil;
|
|
|
|
import com.supervision.util.AsrUtil;
|
|
|
|
import com.supervision.util.MinioUtil;
|
|
|
|
import com.supervision.util.MinioUtil;
|
|
|
|
|
|
|
|
import com.supervision.util.TtsUtil;
|
|
|
|
import com.supervision.util.UserUtil;
|
|
|
|
import com.supervision.util.UserUtil;
|
|
|
|
import com.supervision.vo.rasa.RasaTalkVo;
|
|
|
|
import com.supervision.vo.rasa.RasaTalkVo;
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
@ -29,6 +31,7 @@ import org.springframework.stereotype.Service;
|
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
|
|
|
|
|
|
import java.io.InputStream;
|
|
|
|
import java.io.InputStream;
|
|
|
|
|
|
|
|
import java.util.Comparator;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.Optional;
|
|
|
|
import java.util.Optional;
|
|
|
|
|
|
|
|
|
|
|
@ -55,6 +58,10 @@ public class AskServiceImpl implements AskService {
|
|
|
|
|
|
|
|
|
|
|
|
private final CommonDicService commonDicService;
|
|
|
|
private final CommonDicService commonDicService;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final AiService aiService;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final MedicalRecService medicalRecService;
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public String receiveVoiceFile(MultipartFile file) {
|
|
|
|
public String receiveVoiceFile(MultipartFile file) {
|
|
|
|
if (file.getSize() <= 0) {
|
|
|
|
if (file.getSize() <= 0) {
|
|
|
@ -221,6 +228,20 @@ public class AskServiceImpl implements AskService {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public QaSimilarityQuestionAnswer talkQaSimilarityWithScore(String question, String sessionId) {
|
|
|
|
|
|
|
|
log.info("开始调用talkQaSimilarity,问题:{}", question);
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
GlobalResult<List<QaSimilarityQuestionAnswer>> result = askQaSimilarityFeignClient.askQuestionSimilarityAnswer(new QaSimilarityQuestion(question));
|
|
|
|
|
|
|
|
// 排序,降序,取最高的
|
|
|
|
|
|
|
|
result.getData().sort(Comparator.comparing(QaSimilarityQuestionAnswer::getMatchScore).reversed());
|
|
|
|
|
|
|
|
log.info("调用talkQaSimilarity结束,问题:{},返回结果:{}", question, JSONUtil.toJsonStr(result));
|
|
|
|
|
|
|
|
return CollUtil.getFirst(result.getData());
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
|
|
log.error("调用talkQaSimilarity error ", e);
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private AskPatientAnswer getMedicalRecErrorAnswer(String medicalRecId) {
|
|
|
|
private AskPatientAnswer getMedicalRecErrorAnswer(String medicalRecId) {
|
|
|
|
//Optional.ofNullable(medicalRecErrorAnswer).orElseGet(() ->new AskPatientAnswer()).getAnswer()
|
|
|
|
//Optional.ofNullable(medicalRecErrorAnswer).orElseGet(() ->new AskPatientAnswer()).getAnswer()
|
|
|
|
Assert.notEmpty(medicalRecId, "病历id不能为空");
|
|
|
|
Assert.notEmpty(medicalRecId, "病历id不能为空");
|
|
|
@ -262,4 +283,59 @@ public class AskServiceImpl implements AskService {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 使用无声视频+语音转文字的形式来做
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param talkReqVO 请求
|
|
|
|
|
|
|
|
* @return 返回结果
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public TalkVideoTtsResultResVO talkByVideoAndTts(TalkVideoReqVO talkReqVO) {
|
|
|
|
|
|
|
|
// 根据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());
|
|
|
|
|
|
|
|
TalkVideoTtsResultResVO talkVideoTtsResultResVO = new TalkVideoTtsResultResVO();
|
|
|
|
|
|
|
|
// 如果匹配度没有匹配到任何数据,则走大模型
|
|
|
|
|
|
|
|
if (ObjectUtil.isEmpty(qaSimilarityQuestionAnswer)) {
|
|
|
|
|
|
|
|
String talk = aiService.talk(talkReqVO.getText(), medicalRec.getMedicalRecordAi());
|
|
|
|
|
|
|
|
talkVideoTtsResultResVO.setAnswerMessage(talk);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
// 如果阈值过低,也走大模型
|
|
|
|
|
|
|
|
if (qaSimilarityQuestionAnswer.getMatchScore() < 0.5) {
|
|
|
|
|
|
|
|
log.info("{}:匹配到的结果阈值过低,走大模型回答", qaSimilarityQuestionAnswer);
|
|
|
|
|
|
|
|
String talk = aiService.talk(talkReqVO.getText(), medicalRec.getMedicalRecordAi());
|
|
|
|
|
|
|
|
talkVideoTtsResultResVO.setAnswerMessage(talk);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
// 如果查到的问题不在问题库中,走大模型回答
|
|
|
|
|
|
|
|
AskTemplateQuestionLibrary library = askTemplateQuestionLibraryService.getById(qaSimilarityQuestionAnswer.getMatchQuestionCode());
|
|
|
|
|
|
|
|
if (ObjectUtil.isEmpty(library)) {
|
|
|
|
|
|
|
|
log.info("{}:未从问题库中找到,走大模型回答", qaSimilarityQuestionAnswer);
|
|
|
|
|
|
|
|
String talk = aiService.talk(talkReqVO.getText(), medicalRec.getMedicalRecordAi());
|
|
|
|
|
|
|
|
talkVideoTtsResultResVO.setAnswerMessage(talk);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
// 根据问题找这个病历配置的答案
|
|
|
|
|
|
|
|
AskPatientAnswer askPatientAnswer = askPatientAnswerService.lambdaQuery().eq(AskPatientAnswer::getMedicalId, process.getMedicalRecId())
|
|
|
|
|
|
|
|
.eq(AskPatientAnswer::getLibraryQuestionId, library.getId()).last("limit 1").one();
|
|
|
|
|
|
|
|
// 如果找到了,就走病历配置的内容回答
|
|
|
|
|
|
|
|
if (ObjectUtil.isNotEmpty(askPatientAnswer)) {
|
|
|
|
|
|
|
|
String resText = askPatientAnswer.getAnswer();
|
|
|
|
|
|
|
|
log.info("{}:找到了病历配置的回答语句:{},回答内容:{},走病历回答", qaSimilarityQuestionAnswer.getMatchQuestionCode(), askPatientAnswer.getId(), resText);
|
|
|
|
|
|
|
|
talkVideoTtsResultResVO.setAnswerMessage(resText);
|
|
|
|
|
|
|
|
// 保存记录
|
|
|
|
|
|
|
|
saveQaRecord(talkReqVO.getProcessId(), "patient", askPatientAnswer.getId(), talkReqVO.getText(), library, resText);
|
|
|
|
|
|
|
|
return talkVideoTtsResultResVO;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
// 如果问题的答案没有配置,还是走大模型的回答
|
|
|
|
|
|
|
|
log.info("{}:病历配置,从AskPatientAnswer中未找到回答结果,走大模型", qaSimilarityQuestionAnswer.getMatchQuestionCode());
|
|
|
|
|
|
|
|
String talk = aiService.talk(talkReqVO.getText(), medicalRec.getMedicalRecordAi());
|
|
|
|
|
|
|
|
talkVideoTtsResultResVO.setAnswerMessage(talk);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
talkVideoTtsResultResVO.setVoiceBase64(TtsUtil.ttsTransform(talkVideoTtsResultResVO.getAnswerMessage()));
|
|
|
|
|
|
|
|
return talkVideoTtsResultResVO;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|