
在大模型带来今天这般便利之前,传统的医疗知识问答系统无法像大模型一样理解自然语言并生成句子。它们更像是一个定制化超级搜索引擎,基于明确的规则和逻辑符号,需要行业专家将知识翻译成计算机能理解的规则和框架,使得系统能严格按这些预定义的规则执行,同时需要预先定义大量的问题模板和关键词匹配规则,否则将导致匹配失败,这种模式极度依赖预先定义的模板,无法处理复杂句式或未预见过的问题问法,维护成本高,系统效能也受限,无法发挥最大的优势,使结果的置信度也大打折扣。
如今人工智能,特别是自然语言处理技术的飞跃,为破解这些难题提供了全新的解决方案。从早期的关键词匹配和规则系统,到如今的大语言模型、向量检索和知识图谱,我们正在构建一个能够理解、推理并辅助决策的“智能医疗大脑”。整合近期的RAG和想来数据库知识结合医疗的两大实际场景了解一下医学知识精准问答和临床智能辅助决策CDSS系统的构建过程。

这是一个基于人工智能的超级医学百科全书。它能够理解医护人员用自然语言提出的医学问题,并从海量的、经过验证的权威医学知识库中,精准地检索、提取、并生成直接、准确的答案。

from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings # 使用开源Embedding模型
from langchain.vectorstores import FAISS
import os
# 1. 加载和分割文档
loader = TextLoader("./medical_data.txt", encoding="utf-8")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = text_splitter.split_documents(documents)
# 2. 选择嵌入模型 (这里使用开源模型 `BGE`)
model_name = "BAAI/bge-base-zh"
model_kwargs = {'device': 'cpu'} # 或 'cuda'
encode_kwargs = {'normalize_embeddings': True}
embeddings = HuggingFaceEmbeddings(
model_name=model_name,
model_kwargs=model_kwargs,
encode_kwargs=encode_kwargs
)
# 3. 创建FAISS向量数据库
# 如果之前没有创建过,就创建并保存
if not os.path.exists("./faiss_medical_index"):
db = FAISS.from_documents(docs, embeddings)
db.save_local("./faiss_medical_index")
print("向量数据库已创建并保存。")
else:
print("向量数据库已存在。")模型介绍:
初次使用时,本地如未加载,会先进行下载:

代码分析:
from openai import OpenAI
# 假设FAISS索引已构建好
db = FAISS.load_local("./faiss_medical_index", embeddings, allow_dangerous_deserialization=True)
# 初始化Qwen客户端 (通过DashScope API)
# 需要安装 pip install dashscope
import dashscope
from dashscope import Generation
dashscope.api_key = '你的DASHSCOPE_API_KEY'
def ask_qwen_with_rag(question, k=3):
# 1. 检索:根据用户问题检索最相关的文档块
relevant_docs = db.similarity_search(question, k=k)
context = "\n".join([doc.page_content for doc in relevant_docs])
# 2. 构建Prompt,将检索到的上下文和问题组合
prompt = f"""
你是一个专业的医疗助手,请严格根据以下提供的医学知识来回答问题。
如果提供的信息不足以回答问题,请明确告知用户“根据现有资料无法完整回答该问题”,并建议咨询专业医生。
【参考知识】:
{context}
【用户问题】:
{question}
【回答】:
"""
# 3. 调用Qwen模型生成回答
response = Generation.call(
model='qwen-max', # 或 'qwen-plus', 'qwen-turbo'
prompt=prompt,
seed=12345,
top_p=0.8,
result_format='message',
)
# 提取回答内容
answer = response.output.choices[0].message.content
return answer
# 日常使用示例
if __name__ == '__main__':
user_question = "糖尿病患者应该怎么选择主食?"
answer = ask_qwen_with_rag(user_question)
print(f"用户问题: {user_question}")
print(f"AI回答: {answer}")
# 另一个示例
user_question2 = "阿司匹林的主要副作用是什么?"
answer2 = ask_qwen_with_rag(user_question2)
print(f"\n用户问题: {user_question2}")
print(f"AI回答: {answer2}")代码分析:
输出结果:
向量数据库已存在。
用户问题: 糖尿病患者应该怎么选择主食?
AI回答: 糖尿病患者在选择主食时,应该遵循以下原则来帮助控制血糖水平:
1. **选择低GI(血糖生成指数)的食物**:低GI食物能够更缓慢地被消化吸收,有助于避免餐后血糖迅速升高。例如,糙米、全麦面包、燕麦等都是较好的选择。
2. **适量摄入碳水化合物**:虽然碳水化合物是身体能量的主要来源之一,但对于糖尿病患者来说,需要合理控制其摄入量以维持血糖稳定。建议咨询营养师或医生确定个人化的每日碳水化合物适宜摄入量。
3. **多样化搭配**:不要单一依赖某一种主食,而是应该尝试多种不同的健康选项,比如红薯、玉米、小米等粗粮,它们不仅富含膳食纤维,还含有维生素和矿物质。
4. **注意分量控制**:即使是健康的食品,过量食用也可能导致血糖上升。使用小盘子可以帮助减少食物的份量,同时确保每顿饭都有足够的蔬菜补充。
5. **定期监测血糖变化**:开始新的饮食计划后,应注意观察自己的血糖反应,并据此调整食物种类与数量。如果可能的话,在专业人员指导下进行更为理想。
总之,合理的饮食结构对于糖尿病患者非常重要,通过科学地选择并控制主食,可以有效地帮助管理病情。但请注意,以上建议仅供参考,具体方案应根据个人情况及医嘱制定。
如果有任何疑问,请及时咨询专业的医疗保健提供者。这个示例提供了一个完整的、可实践的起点,用于构建一个医疗领域的智能问答系统。核心思想是RAG:利用FAISS负责海量权威知识的记忆和检索,利用Qwen负责深度的“理解”和“表达”,两者结合,取长补短,从而创造出既有专业知识又安全可靠的AI医疗应用。
任何此类系统在投入真实临床环境使用前,必须经过严格的临床验证和医生团队的审核。代码中的医疗数据仅为示例,请务必使用经认证的权威资料。
CDSS是一个更高级、更复杂的系统。它不再是简单地回答知识性问题,而是融入临床工作流程,通过分析具体的患者数据,为医生提供个性化的诊断、治疗、风险评估等决策建议。它是“站在医生身边的专家顾问”。
传统的QA是“问是什么”,而CDSS是“该怎么办”。CDSS就是要实现从问答到决策支持,这意味着系统需要:

现代CDSS往往是混合系统,结合了多种技术:
代码的主要功能是模拟从医院系统获取患者数据,计算临床评分(SOFA评分),然后基于患者信息和医学知识库(FAISS向量数据库)生成诊疗建议。
主要步骤:
# 1. 加载和分割文档
loader = TextLoader("./medical_data_deep.txt", encoding="utf-8")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = text_splitter.split_documents(documents)
# 2. 选择嵌入模型
model_name = "BAAI/bge-base-en" # 中文可用 `BAAI/bge-base-zh`
model_kwargs = {'device': 'cpu'} # 或 'cuda'
encode_kwargs = {'normalize_embeddings': True}
embeddings = HuggingFaceEmbeddings(
model_name=model_name,
model_kwargs=model_kwargs,
encode_kwargs=encode_kwargs
)
# 3. 创建FAISS向量数据库
if not os.path.exists("./faiss_medical_deep_index"):
db = FAISS.from_documents(docs, embeddings)
db.save_local("./faiss_medical_deep_index")
print("向量数据库已创建并保存。")
else:
print("向量数据库已存在。")代码分析:
def fetch_real_time_patient_data(patient_id: str) -> Dict:
"""模拟从医院HIS、LIS、PACS系统获取实时患者数据"""
return {
"patient_id": patient_id,
"age": 68,
"sex": "男",
# ... 详细的患者数据
}
def calculate_sofa_score(patient_data: Dict) -> Dict:
"""计算SOFA评分"""
# 呼吸系统评分 (简化版,使用SpO2/FiO2近似替代PaO2/FiO2)
spo2 = vitals["spo2"]
fio2 = 0.21 # 默认室内空气
if spo2 < 90:
fio2 = 0.6 # 假设使用面罩吸氧
elif spo2 < 94:
fio2 = 0.28 # 假设使用鼻导管吸氧
# 简化计算: SpO2/FiO2比率
sf_ratio = spo2 / fio2
resp_score = 0
if sf_ratio < 200:
resp_score = 3
# ... 其他系统评分计算代码分析:
def complex_cdss_advice(patient_id: str) -> Dict:
# 1. 获取实时患者数据
patient_data = fetch_real_time_patient_data(patient_id)
# 2. 计算临床评分
sofa_score = calculate_sofa_score(patient_data)
patient_data["sofa_score"] = sofa_score
# 3. 构建详细的临床查询
query_text = f"""
患者 {patient_data['age']}岁 {patient_data['sex']},既往有{', '.join(patient_data['past_history'])}。
主诉: {', '.join(patient_data['symptoms'])}。
# ... 详细的患者信息汇总
"""
# 4. 检索相关医学知识
relevant_docs = db.similarity_search(query_text, k=5)
context = "\n---\n".join([doc.page_content for doc in relevant_docs])
# 5. 构建复杂的多步骤推理Prompt
prompt = f"""
# 角色
你是一名重症医学专家,正在急诊室会诊一位危重患者...
# 患者实时数据
{query_text}
# 相关临床指南
{context}
# 推理任务
请按以下步骤进行严谨的临床推理:
1. **初步诊断假设**...
2. **严重程度评估**...
# ... 详细的任务说明
# 输出格式要求
请以纯JSON格式输出,包含以下字段:
{{
"primary_diagnosis": [字符串数组,按可能性排序],
"differential_diagnosis": [字符串数组,其他需要考虑的诊断],
# ... 其他字段
}}
"""代码分析:
# 6. 调用Qwen模型
response = Generation.call(
model='qwen-max',
prompt=prompt,
result_format='text',
seed=12345
)
# 7. 解析响应
try:
answer_text = response.output.text
start_index = answer_text.find('{')
end_index = answer_text.rfind('}') + 1
if start_index != -1 and end_index != 0:
json_str = answer_text[start_index:end_index]
advice_json = json.loads(json_str)
# 添加时间戳和患者标识
advice_json["patient_id"] = patient_id
advice_json["generated_at"] = datetime.now().isoformat()
advice_json["sofa_score_details"] = sofa_score
return advice_json
else:
raise ValueError("未找到有效的JSON结构")
except (json.JSONDecodeError, ValueError) as e:
return {"error": f"解析响应失败: {str(e)}", "raw_response": answer_text}代码分析:
if __name__ == '__main__':
patient_id = "P20240610001"
print(f"生成针对患者 {patient_id} 的CDSS建议...\n")
try:
advice = complex_cdss_advice(patient_id)
print("CDSS分析结果:")
print(json.dumps(advice, indent=2, ensure_ascii=False))
# 模拟将建议发送到医院信息系统
print("\n正在将建议发送到医院HIS系统...")
# integration_with_his(advice) # 实际环境中实现此函数
except Exception as e:
print(f"生成CDSS建议时出错: {str(e)}")代码分析:
模型返回内容:

输出结果:
CDSS分析结果:
{
"primary_diagnosis": [
"脓毒症合并脓毒性休克",
"社区获得性肺炎",
"急性心力衰竭"
],
"differential_diagnosis": [
"急性肺栓塞",
"急性冠脉综合征"
],
"severity_assessment": {
"score_name": "SOFA评分",
"score_value": 9,
"interpretation": "严重,存在多器官功能障碍"
},
"immediate_actions": [
"立即开始广谱抗生素治疗(1小时内完成)",
"快速输注晶体液30mL/kg(1小时内完成)",
"获取血培养样本(1小时内完成)",
"测量血乳酸水平(1小时内完成)",
"如果液体复苏后仍低血压,应用血管升压药维持MAP≥65mmHg(1小时内完成)",
"提供氧气支持,确保SpO2≥92%",
"启动血糖控制措施,目标血糖140-180mg/dL",
"预防深静脉血栓和应激性溃疡"
],
"diagnostic_plan": [
"动脉血气分析",
"血液生化检查",
"痰培养和药敏试验",
"心脏超声",
"D-二聚体检测以排除肺栓塞",
"心肌损伤标志物检测(如肌钙蛋白)"
],
"treatment_recommendations": {
"antibiotics": [
"碳青霉烯类或β-内酰胺类/β-内酰胺酶抑制剂联合大环内酯类/氟喹诺酮类"
],
"fluid_management": "初始快速输注30mL/kg晶体液,随后根据中心静脉压、尿量及临床表现调整",
"vasopressors": "如果液体复苏后仍低血压,首选去甲肾上腺素维持MAP≥65mmHg;必要时可加用氢化可的松200mg/天",
"respiratory_support": "高流量鼻导管吸氧或无创机械通气,必要时进行气管插管和有创机械通气",
"other_treatments": [
"监测并控制血糖在140-180mg/dL",
"使用低分子肝素预防深静脉血栓",
"使用PPI或H2受体拮抗剂预防应激性溃疡"
]
},
"monitoring_parameters": [
"生命体征:每小时监测一次体温、心率、呼吸频率、血压和血氧饱和度",
"中心静脉压(CVP)和尿量:评估容量状态",
"血乳酸水平:每2-4小时监测一次,直至稳定",
"电解质和肾功能:每日监测",
"凝血功能:每日监测",
"心电图:动态监测"
],
"consultation_recommendations": [
"感染科医生",
"重症医学科医生",
"呼吸内科医生",
"心血管内科医生"
],
"prognosis": "患者病情危重,存在多器官功能障碍,短期内预后较差,需要密切监护和积极治疗。",
"critical_warnings": [
"持续低血压无法纠正",
"意识水平进一步下降",
"血氧饱和度持续低于90%",
"尿量减少或无尿",
"新出现的心律失常或心肌梗死迹象"
],
"patient_id": "P20240610001",
"generated_at": "2025-09-12T17:06:20.449462",
"sofa_score_details": {
"respiratory": 3,
"coagulation": 2,
"liver": 0,
"cardiovascular": 1,
"cns": 1,
"renal": 2,
"total": 9
}
}通过这种方式,我们成功地将一个简单的问答系统升级为了一个初级的CDSS提示系统。 然而,必须极其清醒地认识到:
特性 | 医学知识精准问答系统 | 临床智能辅助决策系统 (CDSS) |
|---|---|---|
核心目标 | 回答知识 | 辅助决策 |
输入 | 自然语言问题 | 结构化的患者数据 |
输出 | 知识性答案 | 个性化的诊断、治疗建议、预警 |
模式 | 被动响应(用户提问) | 主动干预(触发式预警) |
比喻 | 一部权威的、会对话的医学百科全书 | 一位站在你身边、经验丰富的专家教授 |
两个系统结合针对现代医疗体系核心痛点的增加了很多解决方案:
1. 应对“知识爆炸”与“认知过载”
2. 降低医疗差错,保障患者安全
3. 减少诊疗变异,提升医疗质量同质化
4. 提高诊疗效率,缓解医生负担
5. 赋能基层医疗,促进分级诊疗
它们并非相互替代,而是相辅相成、协同工作的:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。