Эх сурвалжийг харах

提交重排序模型数据为空的时候报错原因

feng 8 сар өмнө
parent
commit
19c0964d69

+ 37 - 19
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java

@@ -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);
     }