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 ",";
}
}