You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
virtual-patient/virtual-patient-web/src/main/java/com/supervision/service/impl/AiServiceImpl.java

62 lines
2.5 KiB
Java

package com.supervision.service.impl;
import cn.hutool.core.util.StrUtil;
import com.supervision.pojo.ai.AiTalkAnswerDTO;
import com.supervision.service.AiService;
import com.supervision.util.AiChatUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.stereotype.Service;
import java.util.*;
@Slf4j
@Service
public class AiServiceImpl implements AiService {
public static final String userPromptTemplate = """
---
{medicalRecord}
---
json:{"answer":"扮演病人并根据病历回复的内容"}
""";
private static final String systemPrompt = """
,
,
'//'",!
'',','!!!
""";
/**
*
*
* @param question
* @return
*/
public String talk(String question, String medicalRecord) {
Map<String, String> paramMap = new HashMap<>();
paramMap.put("medicalRecord", medicalRecord);
List<Message> messageHistoryList = new ArrayList<>();
messageHistoryList.add(new SystemMessage(systemPrompt));
messageHistoryList.add(new UserMessage(StrUtil.format(userPromptTemplate, paramMap)));
messageHistoryList.add(new AssistantMessage("好的,已了解我要扮演病人的病历。已准备好对话了。"));
messageHistoryList.add(new UserMessage(question));
Optional<AiTalkAnswerDTO> chat = AiChatUtil.chat(messageHistoryList, AiTalkAnswerDTO.class);
if (chat.isPresent()) {
AiTalkAnswerDTO aiTalkAnswerDTO = chat.get();
if (StrUtil.isNotBlank(aiTalkAnswerDTO.getAnswer())) {
return aiTalkAnswerDTO.getAnswer();
}
}
return "医生,我没有听懂你说的是什么";
}
}