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