中医辨证论治与 AI 诊断推理:当望闻问切遇上知识图谱

发布时间:2026/6/10 0:27:26

中医辨证论治与 AI 诊断推理:当望闻问切遇上知识图谱 中医辨证论治与 AI 诊断推理当望闻问切遇上知识图谱一、中医诊断的黑箱困境经验丰富但难以传承中医辨证论治是一个高度依赖经验的推理过程。老中医通过望闻问切收集四诊信息在大脑中匹配数十年积累的证型模式最终给出辨证结论和处方。这个推理过程是隐性的——老中医说不清为什么这个舌象加上这个脉象就判断为肝郁脾虚它是一种模式识别的直觉。AI 辅助中医诊断的核心挑战在于如何将这种隐性知识显性化、结构化中医知识图谱将证型、症状、方剂、中药之间的关系建模为图结构推理引擎基于图上的路径搜索和规则匹配模拟辨证过程。但中医知识的模糊性同一症状可能对应多种证型和个体差异性不同体质对同一证型的表现不同使得 AI 诊断的准确性远低于纯文本问答。二、中医知识图谱与辨证推理模型中医辨证论治的推理过程可以建模为症状 → 证型 → 治法 → 方药的链式推理。知识图谱将这个链条上的实体和关系显式编码推理引擎在图上搜索从症状到方药的最优路径。flowchart TD A[四诊信息br/望闻问切] -- B[症状实体识别br/NLP 提取] B -- C[症状集合br/舌红、脉弦、胁痛、易怒] C -- D[知识图谱推理br/症状 → 证型匹配] D -- E[候选证型br/肝郁气滞 0.85br/肝火上炎 0.60br/脾虚血少 0.30] E -- F[治法推荐br/疏肝理气] F -- G[方剂匹配br/逍遥散] G -- H[中药配伍br/柴胡、当归、白芍、白术、茯苓、甘草、薄荷、生姜] subgraph 知识图谱结构 I[症状] --|见于| J[证型] J --|治以| K[治法] K --|选方| L[方剂] L --|组成| M[中药] M --|归经| N[经络] M --|性味| O[四气五味] end知识图谱的核心实体类型症状舌红、脉弦、胁痛、易怒、纳差、便溏证型肝郁气滞、肝火上炎、脾虚湿盛、气血两虚治法疏肝理气、清热泻火、健脾化湿、益气养血方剂逍遥散、龙胆泻肝汤、参苓白术散、八珍汤中药柴胡、当归、白芍、白术、茯苓、甘草三、AI 辅助辨证系统的实现# tcm_diagnostic_system.py — AI 辅助中医辨证推理系统 # 设计意图基于知识图谱和规则推理模拟中医辨证论治过程 # 将隐性经验转化为可解释的结构化推理链 from dataclasses import dataclass, field from typing import List, Dict, Optional, Tuple from collections import defaultdict import json dataclass class Symptom: 症状 name: str category: str # 望/闻/问/切 severity: float 1.0 # 0-1严重程度 dataclass class Syndrome: 证型 name: str description: str symptoms: Dict[str, float] # 症状名 → 权重该症状对该证型的贡献度 treatment: str # 治法 prescription: str # 推荐方剂 herbs: List[str] # 中药组成 dataclass class DiagnosisResult: 诊断结果 primary_syndrome: str # 主证 confidence: float # 置信度 secondary_syndromes: List[Tuple[str, float]] # 兼证 treatment: str # 治法 prescription: str # 方剂 herbs: List[str] # 中药 reasoning_chain: List[str] # 推理链可解释性 class TCMKnowledgeGraph: 中医知识图谱 def __init__(self): self.symptoms: Dict[str, Symptom] {} self.syndromes: Dict[str, Syndrome] {} self.symptom_syndrome_map: Dict[str, List[str]] defaultdict(list) self._initialize_knowledge_base() def _initialize_knowledge_base(self): 初始化知识库 # 定义证型及其症状权重 syndrome_defs [ Syndrome( name肝郁气滞, description肝失疏泄气机郁滞, symptoms{ 胁肋胀痛: 0.9, 情志抑郁: 0.85, 善太息: 0.7, 脉弦: 0.8, 舌苔薄白: 0.5, 乳房胀痛: 0.6, 月经不调: 0.5, 咽中如有物阻: 0.6, }, treatment疏肝理气, prescription逍遥散, herbs[柴胡, 当归, 白芍, 白术, 茯苓, 甘草, 薄荷, 生姜], ), Syndrome( name肝火上炎, description肝经气郁化火上扰头目, symptoms{ 头痛眩晕: 0.8, 面红目赤: 0.85, 急躁易怒: 0.8, 口苦咽干: 0.7, 脉弦数: 0.9, 舌红苔黄: 0.75, 失眠多梦: 0.5, 耳鸣: 0.6, }, treatment清肝泻火, prescription龙胆泻肝汤, herbs[龙胆草, 黄芩, 栀子, 泽泻, 木通, 车前子, 当归, 生地, 柴胡, 甘草], ), Syndrome( name脾虚湿盛, description脾气虚弱湿浊内停, symptoms{ 纳差食少: 0.85, 腹胀便溏: 0.8, 面色萎黄: 0.7, 神疲乏力: 0.75, 舌淡苔白腻: 0.9, 脉濡缓: 0.8, 肢体困重: 0.6, 水肿: 0.5, }, treatment健脾化湿, prescription参苓白术散, herbs[人参, 白术, 茯苓, 山药, 莲子, 薏苡仁, 砂仁, 桔梗, 扁豆, 甘草], ), Syndrome( name气血两虚, description气虚与血虚同时存在, symptoms{ 面色淡白: 0.8, 头晕心悸: 0.75, 气短懒言: 0.8, 舌淡苔薄: 0.7, 脉细弱: 0.85, 失眠健忘: 0.6, 手足麻木: 0.5, 月经量少: 0.6, }, treatment益气养血, prescription八珍汤, herbs[人参, 白术, 茯苓, 甘草, 当归, 川芎, 白芍, 熟地], ), ] for syndrome in syndrome_defs: self.syndromes[syndrome.name] syndrome for symptom_name in syndrome.symptoms: self.symptom_syndrome_map[symptom_name].append(syndrome.name) def get_candidate_syndromes(self, symptoms: List[str]) - Dict[str, float]: 根据症状获取候选证型及其匹配分数 scores: Dict[str, float] defaultdict(float) for symptom_name in symptoms: if symptom_name in self.symptom_syndrome_map: for syndrome_name in self.symptom_syndrome_map[symptom_name]: syndrome self.syndromes[syndrome_name] # 累加症状权重 weight syndrome.symptoms.get(symptom_name, 0) scores[syndrome_name] weight # 归一化分数 if scores: max_score max(scores.values()) if max_score 0: scores {k: v / max_score for k, v in scores.items()} return scores class TCMDiagnosticEngine: 中医辨证推理引擎 def __init__(self, knowledge_graph: TCMKnowledgeGraph): self.kg knowledge_graph def diagnose(self, symptoms: List[Symptom]) - DiagnosisResult: 执行辨证推理 symptom_names [s.name for s in symptoms] reasoning_chain [] # Step 1: 症状归集 reasoning_chain.append( f收集四诊信息{, .join(symptom_names)} ) # Step 2: 候选证型匹配 candidate_scores self.kg.get_candidate_syndromes(symptom_names) sorted_candidates sorted( candidate_scores.items(), keylambda x: x[1], reverseTrue ) if not sorted_candidates: return DiagnosisResult( primary_syndrome未明证型, confidence0.0, secondary_syndromes[], treatment建议进一步四诊收集, prescription, herbs[], reasoning_chainreasoning_chain, ) # Step 3: 确定主证 primary_name, primary_score sorted_candidates[0] primary_syndrome self.kg.syndromes[primary_name] reasoning_chain.append( f主证匹配{primary_name}匹配度 {primary_score:.1%} ) # Step 4: 分析匹配依据 matched_symptoms [] for s_name in symptom_names: if s_name in primary_syndrome.symptoms: weight primary_syndrome.symptoms[s_name] matched_symptoms.append(f{s_name}(权重{weight:.1f})) reasoning_chain.append( f匹配依据{, .join(matched_symptoms)} ) # Step 5: 确定兼证匹配度 0.3 且非主证 secondary [ (name, score) for name, score in sorted_candidates[1:] if score 0.3 ] if secondary: reasoning_chain.append( f兼证考虑{, .join(f{n}({s:.1%}) for n, s in secondary)} ) # Step 6: 治法与方剂 reasoning_chain.append( f治法{primary_syndrome.treatment}方剂{primary_syndrome.prescription} ) # Step 7: 中药配伍分析 reasoning_chain.append( f方药组成{、.join(primary_syndrome.herbs)} ) return DiagnosisResult( primary_syndromeprimary_name, confidenceprimary_score, secondary_syndromessecondary, treatmentprimary_syndrome.treatment, prescriptionprimary_syndrome.prescription, herbsprimary_syndrome.herbs, reasoning_chainreasoning_chain, ) class SymptomExtractor: 症状提取器从自然语言描述中提取结构化症状 def __init__(self, llm_clientNone): self.llm llm_client # 症状关键词映射 self.symptom_keywords { 胁肋胀痛: [胁痛, 肋骨痛, 两肋胀, 胁肋不适], 情志抑郁: [心情不好, 郁闷, 抑郁, 不开心, 情绪低落], 急躁易怒: [容易发火, 脾气大, 急躁, 易怒, 烦躁], 头痛眩晕: [头痛, 头晕, 眩晕, 头胀], 口苦咽干: [口苦, 口干, 咽干, 嗓子干], 纳差食少: [食欲差, 不想吃, 吃不下, 纳差, 食少], 腹胀便溏: [腹胀, 肚子胀, 大便稀, 便溏, 腹泻], 神疲乏力: [乏力, 没精神, 疲劳, 疲倦, 无力], 面色萎黄: [面色黄, 脸色差, 面色萎黄], 失眠多梦: [失眠, 睡不着, 多梦, 睡眠差], } def extract(self, description: str) - List[Symptom]: 从自然语言描述中提取症状 symptoms [] for standard_name, keywords in self.symptom_keywords.items(): for keyword in keywords: if keyword in description: symptoms.append(Symptom( namestandard_name, category问诊, severity1.0, )) break return symptoms四、AI 辅助中医诊断的 Trade-offs知识图谱的完备性当前知识库仅包含常见证型和方剂中医的证型体系远比此复杂——同一证型在不同体质、不同季节、不同地域的表现不同。知识图谱的覆盖度直接影响诊断准确性。需要持续从中医典籍和临床数据中扩充知识库。辨证的模糊性中医辨证本身具有模糊性——肝郁气滞和肝火上炎的界限并不清晰同一患者可能同时具有两个证型的特征。加权评分机制只能给出倾向性而非确定性诊断结果需要结合临床判断。个体差异的忽略当前系统基于症状-证型的统计匹配忽略了患者的体质、年龄、性别等个体差异。同一种症状在不同体质的人身上可能对应不同证型。需要引入体质辨识模块将个体特征纳入推理过程。法律与伦理风险AI 辅助诊断系统不能替代中医师的诊断仅能作为参考工具。系统输出的诊断结果必须明确标注仅供参考并提示用户咨询专业医师。在医疗领域部署 AI 系统需要严格遵守相关法规。五、总结AI 辅助中医辨证系统通过知识图谱和规则推理将中医的隐性经验转化为显性的结构化推理链。症状提取器从自然语言中识别症状知识图谱匹配候选证型推理引擎生成可解释的诊断结果。但知识图谱完备性、辨证模糊性、个体差异忽略和法律伦理风险是当前方案的主要局限。在实际落地中建议将系统定位为辅助工具而非诊断工具持续从临床数据中扩充知识库引入体质辨识模块提升个性化能力严格遵守医疗 AI 的法规要求。AI 与中医的融合不是用算法替代望闻问切而是用结构化推理辅助辨证决策。

相关新闻