|
|
@@ -93,7 +93,7 @@ public class SseServiceImpl implements ISseService {
|
|
|
@Autowired
|
|
|
private ThinkProjectMapper thinkProjectMapper;
|
|
|
@Autowired
|
|
|
- private ThinkModelMapper thinkModelMapper;
|
|
|
+ private ThinkModelMapper thinkModelMapper;
|
|
|
@Autowired
|
|
|
private ThinkRagMapper thinkRagMapper;
|
|
|
|
|
|
@@ -182,24 +182,24 @@ public class SseServiceImpl implements ISseService {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 构建消息列表
|
|
|
+ * 构建消息列表
|
|
|
*/
|
|
|
private void buildChatMessageList(ChatRequest chatRequest) throws IOException {
|
|
|
String sysPrompt;
|
|
|
// 矫正模型名称 如果是gpt-image 则查询image类型模型 获取模型名称
|
|
|
- if(chatRequest.getModel().equals("gpt-image")) {
|
|
|
+ if (chatRequest.getModel().equals("gpt-image")) {
|
|
|
chatModelVo = chatModelService.selectModelByCategory("image");
|
|
|
if (chatModelVo == null) {
|
|
|
log.error("未找到image类型的模型配置");
|
|
|
throw new IllegalStateException("未找到image类型的模型配置");
|
|
|
}
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
chatModelVo = chatModelService.selectModelByName(chatRequest.getModel());
|
|
|
}
|
|
|
// 获取对话消息列表
|
|
|
List<Message> messages = chatRequest.getMessages();
|
|
|
// 查询向量库相关信息加入到上下文
|
|
|
- if(StringUtils.isNotEmpty(chatRequest.getKid())){
|
|
|
+ if (StringUtils.isNotEmpty(chatRequest.getKid())) {
|
|
|
List<Message> knMessages = new ArrayList<>();
|
|
|
String content = messages.get(messages.size() - 1).getContent().toString();
|
|
|
// 通过kid查询知识库信息
|
|
|
@@ -215,11 +215,15 @@ public class SseServiceImpl implements ISseService {
|
|
|
queryVectorBo.setVectorModelName(knowledgeInfoVo.getVectorModelName());
|
|
|
queryVectorBo.setEmbeddingModelName(knowledgeInfoVo.getEmbeddingModelName());
|
|
|
queryVectorBo.setMaxResults(knowledgeInfoVo.getRetrieveLimit());
|
|
|
- List<Map<String,Object>> nearestList = vectorStoreService.getQueryVector(queryVectorBo);
|
|
|
+ List<Map<String, Object>> nearestList = vectorStoreService.getQueryVector(queryVectorBo);
|
|
|
// 查询重排序模型 重排序模型现在只用到了bge-reranker-v2-m3,后续可以动态获取
|
|
|
- ChatModelVo rerankModelVo = chatModelService.selectModelByName(rerankModelName);
|
|
|
- List<Map<String, Object>> maps = RerankUtil.rerankNearestList(content, nearestList, rerankModelVo.getApiHost(),rerankModelName);
|
|
|
- for (Map prompt : maps) {
|
|
|
+ List<Map<String, Object>> rerankMap = new ArrayList<>();
|
|
|
+ if (nearestList.size() > 0) {
|
|
|
+ ChatModelVo rerankModelVo = chatModelService.selectModelByName(rerankModelName);
|
|
|
+ rerankMap = RerankUtil.rerankNearestList(content, nearestList, rerankModelVo.getApiHost(), rerankModelName);
|
|
|
+
|
|
|
+ }
|
|
|
+ for (Map prompt : rerankMap) {
|
|
|
StringBuilder context = new StringBuilder();
|
|
|
String text = String.valueOf(prompt.get("text"));
|
|
|
String filename = String.valueOf(prompt.get("filename"));
|
|
|
@@ -231,7 +235,7 @@ public class SseServiceImpl implements ISseService {
|
|
|
messages.addAll(knMessages);
|
|
|
// 设置知识库系统提示词
|
|
|
sysPrompt = knowledgeInfoVo.getSystemPrompt();
|
|
|
- if(StringUtils.isEmpty(sysPrompt)){
|
|
|
+ if (StringUtils.isEmpty(sysPrompt)) {
|
|
|
sysPrompt = "你是一个专业的问答助手,根据提供的资料进行回答。\n" +
|
|
|
"\n" +
|
|
|
"资料格式如下,每条资料包含正文内容和来源文件名: \n" +
|
|
|
@@ -257,21 +261,34 @@ public class SseServiceImpl implements ISseService {
|
|
|
"\n" +
|
|
|
"来源: \n" +
|
|
|
"① 文件A.docx" +
|
|
|
- "注意,不能出现同一个来源出现不同的标注和来源"+
|
|
|
+ "注意,不能出现同一个来源出现不同的标注和来源" +
|
|
|
"当前时间:" + DateUtils.getDate();
|
|
|
|
|
|
}
|
|
|
- }else {
|
|
|
+ } else {
|
|
|
sysPrompt = chatModelVo.getSystemPrompt();
|
|
|
- if(StringUtils.isEmpty(sysPrompt)){
|
|
|
- sysPrompt ="你是一个由EMOON AI开发的医疗助手。你擅长中英文对话,能够理解并处理各种问题,提供安全、有帮助、准确的回答。" +
|
|
|
- "当前时间:"+ DateUtils.getDate()+
|
|
|
+ if (StringUtils.isEmpty(sysPrompt)) {
|
|
|
+ sysPrompt = "你是一个医疗数据分析智能体,负责查询门诊人次和住院人次。\n" +
|
|
|
+ "\n" +
|
|
|
+ "使用规则:\n" +
|
|
|
+ "1. 用户可能给出以下查询方式:\n" +
|
|
|
+ " - 单日(如 \"2025-03-01\")\n" +
|
|
|
+ " - 日期范围(如 \"2025-03-01 到 2025-03-05\")\n" +
|
|
|
+ " - 模糊日期(如 \"昨天\"、\"上周\"、\"本月\")\n" +
|
|
|
+ "2. 如果用户只给出单日,则自动扩展为「该日 + 前 3 天」,形成连续四天的日期范围。但是不需要显示前三天的数据,只需用在后面分析即可\n" +
|
|
|
+ " 例如:用户输入 `2025-03-01` → 查询 `2025-02-27 ~ 2025-03-01 数据在返回的`\n" +
|
|
|
+ "3. 如果用户给出范围或模糊时间,则按用户意图解析为日期范围,不做额外扩展。\n" +
|
|
|
+ "4. 查询时,只调用一次 API,并传入 `开始日期` 和 `结束日期`。\n" +
|
|
|
+ "5. 输出需包含:\n" +
|
|
|
+ " - 提问时间原始数据\n" +
|
|
|
+ " - 未来趋势分析 结合这几天的数据给未来几天做个分析,但是不要告诉过去几天的数据\n" +
|
|
|
+ " 当前时间为:" + DateUtils.getDate() +
|
|
|
"#注意:回复之前注意结合上下文和工具返回内容进行回复。";
|
|
|
}
|
|
|
}
|
|
|
// 设置系统默认提示词
|
|
|
Message sysMessage = Message.builder().content(sysPrompt).role(Message.Role.SYSTEM).build();
|
|
|
- messages.add(0,sysMessage);
|
|
|
+ messages.add(0, sysMessage);
|
|
|
|
|
|
chatRequest.setSysPrompt(sysPrompt);
|
|
|
// 用户对话内容
|
|
|
@@ -398,10 +415,10 @@ public class SseServiceImpl implements ISseService {
|
|
|
queryVectorBo.setVectorModelName(knowledgeInfoVo.getVectorModelName());
|
|
|
queryVectorBo.setEmbeddingModelName(knowledgeInfoVo.getEmbeddingModelName());
|
|
|
queryVectorBo.setMaxResults(knowledgeInfoVo.getRetrieveLimit());
|
|
|
- List<Map<String,Object>> nearestList = vectorStoreService.getQueryVector(queryVectorBo, maxDistance);
|
|
|
+ List<Map<String, Object>> nearestList = vectorStoreService.getQueryVector(queryVectorBo, maxDistance);
|
|
|
// 查询重排序模型 重排序模型现在只用到了bge-reranker-v2-m3,后续可以动态获取
|
|
|
ChatModelVo rerankModelVo = chatModelService.selectModelByName(rerankModelName);
|
|
|
- List<Map<String, Object>> maps = RerankUtil.rerankNearestList(prompt, nearestList, rerankModelVo.getApiHost(),rerankModelName);
|
|
|
+ List<Map<String, Object>> maps = RerankUtil.rerankNearestList(prompt, nearestList, rerankModelVo.getApiHost(), rerankModelName);
|
|
|
|
|
|
schema.setNearest(maps);
|
|
|
|
|
|
@@ -518,8 +535,9 @@ public class SseServiceImpl implements ISseService {
|
|
|
throw new RuntimeException("查询失败: " + e.getMessage(), e);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
@Override
|
|
|
- public int addProject(Map<String,Object> map) {
|
|
|
+ public int addProject(Map<String, Object> map) {
|
|
|
return thinkProjectMapper.insertProject(map);
|
|
|
}
|
|
|
|