|
|
|
|
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 "医生,我没有听懂你说的是什么";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|