Kaynağa Gözat

调整过敏解答

liuchengsen 1 ay önce
ebeveyn
işleme
dfda2d497c

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

@@ -47,6 +47,16 @@ public class PromptService {
     private static final String USAGE_GUIDE = """
             你是中华药典用药指导助手。用户询问用法、用量、副作用、禁忌等问题。
 
+            ⚠️ 安全规则(最高优先级):
+            —— 如果用户在描述【已知的药物过敏】(如"青霉素过敏""头孢过敏"),
+               这不是症状求药,而是药物安全咨询。此时应当:
+               ① 说明该药物过敏的处理方法(停药、抗组胺药、肾上腺素等)
+               ② 列出安全的替代药物选择
+               ③ 强调就医指征
+               【禁止】推荐任何新药来"治疗"该过敏症状本身。
+            —— 检索资料中如无相关临床指导内容,必须标注【通用药学知识】,不得编造用药方案。
+            —— 禁止编造检索资料中不存在的药品名称和用量。
+
             回答格式(紧凑排版,段落标题后直接接内容,不得有空行):
 
             【结论】   2-3句话建议。
@@ -96,6 +106,16 @@ public class PromptService {
     private static final String SYMPTOM_ADVICE = """
             你是AI药典用药助手。用户描述症状寻求用药建议。
 
+            ⚠️ 安全规则(最高优先级):
+            —— 如果用户在描述【已知的药物过敏】(如"青霉素过敏""头孢过敏"),
+               这不是症状求药,而是药物安全咨询。此时应当:
+               ① 说明该药物过敏的处理方法(停药、抗组胺药、肾上腺素等)
+               ② 列出安全的替代药物选择
+               ③ 强调就医指征
+               【禁止】推荐任何新药来"治疗"该过敏症状本身。
+            —— 检索资料中如无相关临床指导内容,必须标注【通用药学知识】,不得编造用药方案。
+            —— 禁止编造检索资料中不存在的药品名称和用量。
+
             回答格式(紧凑排版,段落标题后直接接内容,不得有空行):
 
             【病情评估】严重程度判断 + 是否需要立即就医。

+ 38 - 0
backend-java/src/main/java/com/pharmacopoeia/service/RetrieverService.java

@@ -126,9 +126,47 @@ public class RetrieverService {
         return false;
     }
 
+    /** 已知药物过敏检测:用户明确询问对某药物的过敏处理方法 */
+    private static final List<String> KNOWN_ALLERGY_DRUGS = List.of(
+        "青霉素", "头孢", "磺胺", "阿莫西林", "布洛芬",
+        "阿司匹林", "链霉素", "庆大霉素", "四环素",
+        "红霉素", "氯霉素", "万古霉素", "喹诺酮",
+        "普鲁卡因", "利多卡因", "碘", "破伤风"
+    );
+
+    private static final java.util.regex.Pattern[] KNOWN_ALLERGY_REGEX = {
+        java.util.regex.Pattern.compile("对.{1,6}过敏"),      // 对青霉素过敏
+        java.util.regex.Pattern.compile(".{1,6}药过敏"),      // 头孢药过敏
+        java.util.regex.Pattern.compile("药物过敏"),           // 药物过敏
+        java.util.regex.Pattern.compile(".+过敏(处理|怎么办|急救|替代|注意|救治|抢救|应急)"),
+    };
+
+    private boolean isKnownDrugAllergy(String query) {
+        // 必须包含"过敏"
+        if (!query.contains("过敏")) return false;
+
+        // 精确匹配已知过敏药物清单
+        for (String drug : KNOWN_ALLERGY_DRUGS) {
+            if (query.contains(drug)) return true;
+        }
+
+        // 正则模式匹配(对XX过敏 / XX药过敏 / 药物过敏 / 过敏处理/急救等)
+        for (var pattern : KNOWN_ALLERGY_REGEX) {
+            if (pattern.matcher(query).find()) return true;
+        }
+
+        return false;
+    }
+
     public String classifyIntent(String query) {
         String q = query.trim();
 
+        // 0. 已知药物过敏检测(最高优先级,必须在 "过敏" 通用匹配之前)
+        //    如 "青霉素过敏处理" "头孢过敏怎么办" → 用药安全咨询,非症状求药
+        if (isKnownDrugAllergy(q)) {
+            return "usage_guide";
+        }
+
         // 1. 用药安全/用法用量(优先级最高,避免"过敏"与症状类冲突)
         if (anyMatch(q, "怎么吃", "吃多少", "怎么用", "怎么服用", "孕妇", "儿童用量",
                 "副作用多大", "伤肝", "伤肾", "安全吗", "副作用", "不良反应",

+ 10 - 0
backend-python/app/rag/prompt.py

@@ -117,6 +117,16 @@ EXAM_TUTOR = f"""你是执业药师考试辅导助手。
 # ============================================================
 SYMPTOM_ADVICE = f"""你是AI药典用药助手。用户描述症状寻求用药建议。
 
+⚠️ 安全规则(最高优先级):
+—— 如果用户在描述【已知的药物过敏】(如"青霉素过敏""头孢过敏"),
+   这不是症状求药,而是药物安全咨询。此时应当:
+   ① 说明该药物过敏的处理方法(停药、抗组胺药、肾上腺素等)
+   ② 列出安全的替代药物选择
+   ③ 强调就医指征
+   【禁止】推荐任何新药来"治疗"该过敏症状本身。
+—— 检索资料中如无相关临床指导内容,必须标注【通用药学知识】,不得编造用药方案。
+—— 禁止编造检索资料中不存在的药品名称和用量。
+
 回答格式(紧凑排版,段落标题后直接接内容,不得有空行):
 
 【病情评估】

+ 21 - 0
backend-python/app/rag/retriever.py

@@ -23,6 +23,27 @@ def classify_intent(query: str) -> str:
     """基于关键词的意图分类,含否定语义处理和置信度兜底。"""
     q = query.strip()
 
+    # --- 已知药物过敏检测:XX过敏处理/怎么办/急救/替代 → 用药安全咨询 ---
+    # 必须在 symptom_keywords 之前检测,否则会被 "过敏" 误判为症状求药
+    known_allergy_drugs = [
+        "青霉素", "头孢", "磺胺", "阿莫西林", "布洛芬",
+        "阿司匹林", "链霉素", "庆大霉素", "四环素",
+        "红霉素", "氯霉素", "万古霉素", "喹诺酮",
+        "普鲁卡因", "利多卡因", "碘", "破伤风",
+    ]
+    if "过敏" in q and any(drug in q for drug in known_allergy_drugs):
+        return "usage_guide"
+
+    # --- 已知药物过敏通用模式:对XX过敏 / XX药过敏 / 药物过敏 ---
+    known_allergy_patterns = [
+        r"对.{1,6}过敏",           # 对青霉素过敏
+        r".{1,6}药过敏",           # 头孢药过敏
+        r"药物过敏",               # 药物过敏
+        r".+过敏(处理|怎么办|急救|替代|注意|救治|抢救|应急)",
+    ]
+    if any(re.search(pat, q) for pat in known_allergy_patterns):
+        return "usage_guide"
+
     # --- 否定语义检测:先检查是否包含否定模式 ---
     negation_patterns = [
         r"不是", r"没有", r"并非", r"不算", r"不属于",