Browse Source

移除2020药典数据,仅保留2025版 + AI兜底,加上日志文件控制

liuchengsen 1 month ago
parent
commit
0825350973

+ 2 - 45
backend-java/src/main/java/com/pharmacopoeia/service/RetrieverService.java

@@ -146,7 +146,7 @@ public class RetrieverService {
         return "drug_query";
     }
 
-    /** 检索主入口:2025 优先,2025 结果不足时降级到全部版本(含 2020 补充) */
+    /** 检索:仅 2025 年版药典,AI 兜底补充 */
     public List<Map<String, Object>> search(String query, String intent, int topK) {
         List<Float> vec = embedWithCache(query);
         String vecStr = vec.stream()
@@ -154,22 +154,7 @@ public class RetrieverService {
                 .collect(Collectors.joining(",", "[", "]"));
 
         String drugName = extractDrugName(query);
-
-        // ============================================================
-        // 第一轮:限定 2025 年版
-        // ============================================================
-        List<Map<String, Object>> results = searchWithVersion(vecStr, drugName, "2025年版", topK);
-
-        // ============================================================
-        // 如果 2025 结果不足(<3 条 或 最高相似度 <0.4),降级到全部版本
-        // ============================================================
-        if (results.size() < 3 || maxSimilarity(results) < 0.4) {
-            List<Map<String, Object>> fallback = searchWithVersion(vecStr, drugName, null, topK);
-            // 合并:2025 结果排在前面,2020 补充排在后面,去重
-            results = mergeResults(results, fallback, topK);
-        }
-
-        return results;
+        return searchWithVersion(vecStr, drugName, "2025年版", topK);
     }
 
     /** 带版本过滤的向量检索。version 为 null 时不限制版本。 */
@@ -227,34 +212,6 @@ public class RetrieverService {
         return jdbc.queryForList(sql, params);
     }
 
-    /** 合并两轮结果:2025 在前,去重,不超过 topK */
-    private List<Map<String, Object>> mergeResults(
-            List<Map<String, Object>> first, List<Map<String, Object>> second, int topK) {
-        Set<String> seen = new HashSet<>();
-        List<Map<String, Object>> merged = new ArrayList<>();
-
-        for (Map<String, Object> r : first) {
-            String key = (String) r.getOrDefault("drug_id", "") + "|" + r.getOrDefault("section", "");
-            if (seen.add(key)) merged.add(r);
-        }
-        for (Map<String, Object> r : second) {
-            String key = (String) r.getOrDefault("drug_id", "") + "|" + r.getOrDefault("section", "");
-            if (seen.add(key)) merged.add(r);
-        }
-        return merged.subList(0, Math.min(topK, merged.size()));
-    }
-
-    private double maxSimilarity(List<Map<String, Object>> results) {
-        return results.stream()
-                .mapToDouble(r -> toDouble(r.get("similarity")))
-                .max().orElse(0.0);
-    }
-
-    private double toDouble(Object o) {
-        if (o instanceof Number n) return n.doubleValue();
-        return 0.0;
-    }
-
     // 剂型后缀(长后缀优先,避免"缓释胶囊"被错误截断为"缓释")
     private static final List<String> FORMULATION_SUFFIXES = List.of(
         "缓释胶囊", "缓释片", "肠溶胶囊", "肠溶片", "分散片", "咀嚼片",

+ 3 - 1
backend-java/src/main/resources/application.yml

@@ -75,4 +75,6 @@ rate-limit:
 logging:
   level:
     com.pharmacopoeia: INFO
-    org.springframework.web: INFO
+    org.springframework.web: WARN
+  file:
+    path: ${LOG_DIR:/var/log/pharmacopoeia}

+ 74 - 0
backend-java/src/main/resources/logback-spring.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <!-- 日志目录,线上默认 /var/log/pharmacopoeia -->
+    <property name="LOG_DIR" value="${LOG_DIR:-/var/log/pharmacopoeia}"/>
+    <!-- 单个文件最大 100MB -->
+    <property name="MAX_SIZE" value="100MB"/>
+    <!-- 保留最近 30 天的日志 -->
+    <property name="MAX_HISTORY" value="30"/>
+    <!-- 总大小上限 10GB -->
+    <property name="TOTAL_SIZE" value="10GB"/>
+
+    <!-- 控制台输出(开发调试用) -->
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+    </appender>
+
+    <!-- 全量日志:SizeAndTimeBasedRollingPolicy,按天+大小滚动 -->
+    <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_DIR}/backend.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_DIR}/backend.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
+            <maxFileSize>${MAX_SIZE}</maxFileSize>
+            <maxHistory>${MAX_HISTORY}</maxHistory>
+            <totalSizeCap>${TOTAL_SIZE}</totalSizeCap>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+            <charset>UTF-8</charset>
+            <!-- 流式写入,不缓存 -->
+            <immediateFlush>true</immediateFlush>
+        </encoder>
+    </appender>
+
+    <!-- 错误日志:单独输出 ERROR 级别 -->
+    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_DIR}/backend-error.log</file>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>ERROR</level>
+        </filter>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_DIR}/backend-error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
+            <maxFileSize>${MAX_SIZE}</maxFileSize>
+            <maxHistory>${MAX_HISTORY}</maxHistory>
+            <totalSizeCap>512MB</totalSizeCap>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+            <charset>UTF-8</charset>
+            <immediateFlush>true</immediateFlush>
+        </encoder>
+    </appender>
+
+    <!-- 业务日志:com.pharmacopoeia 包 INFO 级别 -->
+    <logger name="com.pharmacopoeia" level="INFO" additivity="false">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="FILE_ALL"/>
+        <appender-ref ref="FILE_ERROR"/>
+    </logger>
+
+    <!-- Spring/框架日志:WARN 级别,减少噪音 -->
+    <logger name="org.springframework" level="WARN"/>
+    <logger name="org.hibernate" level="WARN"/>
+    <logger name="com.zaxxer.hikari" level="WARN"/>
+
+    <!-- 根日志 -->
+    <root level="INFO">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="FILE_ALL"/>
+        <appender-ref ref="FILE_ERROR"/>
+    </root>
+</configuration>