Kaynağa Gözat

缓存数据调整

liuchengsen 1 ay önce
ebeveyn
işleme
b6432899b6

+ 18 - 2
backend-java/src/main/java/com/pharmacopoeia/controller/ChatController.java

@@ -655,13 +655,14 @@ public class ChatController {
     }
 
     private List<Map<String, Object>> buildSources(List<Map<String, Object>> docs) {
+        Set<String> rawSeen = new HashSet<>();
         Set<String> seen = new HashSet<>();
         return docs.stream()
+                // 第一层:按原始 name|section 去重,消除同一栏目的多个分块
                 .filter(d -> {
                     String key = d.getOrDefault("name", "") + "|" + d.getOrDefault("section", "");
-                    return seen.add(key);
+                    return rawSeen.add(key);
                 })
-                .limit(8)  // 去重后最多 8 条,覆盖更多栏目
                 .map(d -> {
                     String content = (String) d.getOrDefault("content", "");
                     String drugName = (String) d.getOrDefault("name", "");
@@ -678,6 +679,10 @@ public class ChatController {
                     if (sectionDisplay == null || sectionDisplay.isEmpty()) {
                         sectionDisplay = realSection(content, storedSection);
                     }
+                    // 跳过"正文"类无意义栏目
+                    if ("正文".equals(sectionDisplay)) {
+                        return null;
+                    }
 
                     // 构建完整来源引用
                     StringBuilder sourceBuilder = new StringBuilder();
@@ -704,6 +709,17 @@ public class ChatController {
                             "excerpt", excerpt
                     );
                 })
+                .filter(Objects::nonNull)
+                // 第二层:按显示名去重,避免别名映射(如"功能""主治"→"功能与主治")导致重复
+                .filter(m -> {
+                    String key = m.get("name") + "|" + m.get("section");
+                    return seen.add(key);
+                })
+                // 每种药最多 5 个栏目,总数最多 8 条
+                .collect(Collectors.groupingBy(m -> (String) m.get("name"), LinkedHashMap::new, Collectors.toList()))
+                .values().stream()
+                .flatMap(list -> list.stream().limit(5))
+                .limit(8)
                 .collect(Collectors.toList());
     }
 

+ 5 - 5
backend-java/src/main/java/com/pharmacopoeia/service/PromptService.java

@@ -38,7 +38,7 @@ public class PromptService {
             回答格式(紧凑排版,段落标题后直接接内容,不得有空行):
             【结论】   2-3句话概括。
             【详细信息】分栏目引用原文,标注来源版本和栏目名称。
-            【来源明细】列出本题引用的所有资料名称及出处(含版本号如"2025版药典一部")。
+            【来源明细】列出本题引用的所有资料名称及出处(含版本号如"2025版药典一部"),相同来源只列一次,禁止重复
             """ + COMPLIANCE + AI_DISCLAIMER;
 
     // ============================================================
@@ -64,7 +64,7 @@ public class PromptService {
             【禁忌】   标注来源名称。
             【不良反应】标注来源名称。
             【注意事项】孕妇/儿童/老年/肝肾不全等特殊人群提示。
-            【来源明细】列出本题引用的所有资料名称及出处。
+            【来源明细】列出本题引用的所有资料名称及出处,相同来源只列一次,禁止重复
             【安全提醒】「请在医师或药师指导下用药」
             """ + COMPLIANCE + AI_DISCLAIMER;
 
@@ -80,7 +80,7 @@ public class PromptService {
             【原文引用】逐字引用原文条款,保留编号和术语原貌。
             【条款出处】编号 + 页码(如"2025版药典四部通则0631")。
             【关联条款】其他相关条款编号及简要说明(如有)。
-            【来源明细】列出本题引用的所有资料名称及出处。
+            【来源明细】列出本题引用的所有资料名称及出处,相同来源只列一次,禁止重复
             """ + COMPLIANCE + AI_DISCLAIMER;
 
     // ============================================================
@@ -97,7 +97,7 @@ public class PromptService {
                        教学延伸标注【教学补充,非药典原文】。
             【记忆技巧】口诀、对比表格、联想记忆等。
             【考试频率】高频 / 中频 / 低频。
-            【来源明细】大纲章节 + 药典出处 + 参考资料名称。
+            【来源明细】大纲章节 + 药典出处 + 参考资料名称,相同来源只列一次
             """ + COMPLIANCE + AI_DISCLAIMER;
 
     // ============================================================
@@ -123,7 +123,7 @@ public class PromptService {
             【非药物建议】休息、饮食、物理方法等。
             【注意事项】各方案的禁忌人群、药物相互作用、特殊人群提示(孕妇/儿童/老年)。
             【就医指征】列出必须就医的警示信号(如体温>39°C持续、呼吸困难等)。
-            【来源明细】列出引用的所有资料名称。
+            【来源明细】列出引用的所有资料名称,相同来源只列一次
             【免责声明】⚠️ 本回答为AI用药参考,不构成处方建议,请以药品说明书及医师指导为准。
             """ + COMPLIANCE + AI_DISCLAIMER;