基于DeepSeek与LangGraph的智能病历数据库交互系统开发指南
一、医疗AI技术栈构建
# 安装核心依赖
pip install langchain deepseek-coder psycopg2-binary python-dotenv sqlalchemy graphviz
# 环境变量配置(.env文件)
POSTGRES_MEDICAL_USER=med_user
POSTGRES_MEDICAL_PASSWORD=secure_med_pass
POSTGRES_MEDICAL_HOST=med-db-server
POSTGRES_MEDICAL_PORT=5432
POSTGRES_MEDICAL_DB=medical_records
二、病历数据库建模
from langchain.utilities import SQLDatabase
# 初始化医疗数据库连接
medical_db = SQLDatabase.from_uri(
f"postgresql+psycopg2://{os.getenv('POSTGRES_MEDICAL_USER')}:"
f"{os.getenv('POSTGRES_MEDICAL_PASSWORD')}@{os.getenv('POSTGRES_MEDICAL_HOST')}:"
f"{os.getenv('POSTGRES_MEDICAL_PORT')}/{os.getenv('POSTGRES_MEDICAL_DB')}",
include_tables=["patients", "diagnoses", "prescriptions"],
sample_rows_in_table_info=3,
custom_table_info="""
patients: 患者主表
id: 患者ID(主键)
name: 患者姓名(脱敏处理)
gender: 性别
birth_date: 出生日期
registration_date: 建档日期
diagnoses: 诊断记录表
id: 诊断ID(主键)
patient_id: 患者ID(外键)
diagnosis_date: 诊断日期
diagnosis_code: ICD-11编码
diagnosis_description: 诊断描述
prescriptions: 处方记录表
id: 处方ID(主键)
patient_id: 患者ID(外键)
prescription_date: 处方日期
medication: 药物名称
dosage: 剂量
"""
)
三、DeepSeek模型配置
from langchain.llms import DeepSeek
# 医疗专用模型配置
medical_llm = DeepSeek(
model_name="deepseek-16b",
temperature=0.6,
max_tokens=4096,
top_p=0.85,
repetition_penalty=1.1,
callbacks=[
MedicalCallbackHandler() # 自定义医疗合规回调
],
medical_mode=True # 启用医疗领域优化
)
四、LangGraph流程构建
from langchain.graphs import Graph
from langchain.chains import SQLDatabaseChain
# 构建医疗查询流程
medical_graph = Graph()
# 定义查询阶段
parse_step = medical_graph.add_node(
"语义解析",
MedicalQueryParser(llm=medical_llm)
)
sql_gen_step = medical_graph.add_node(
"SQL生成",
SQLDatabaseChain(
llm=medical_llm,
database=medical_db,
use_query_checker=True,
return_intermediate_steps=True
)
)
execute_step = medical_graph.add_node(
"数据库执行",
MedicalDBExecutor(
allowed_operations=["SELECT"],
max_query_time=10 # 限制查询时间
)
)
format_step = medical_graph.add_node(
"结果格式化",
MedicalResultFormatter(
sensitive_fields=["name", "email"] # 敏感字段脱敏
)
)
# 连接流程节点
medical_graph.add_edge(parse_step, sql_gen_step)
medical_graph.add_edge(sql_gen_step, execute_step)
medical_graph.add_edge(execute_step, format_step)
五、核心功能实现
1. 多模态病历查询
# 自然语言查询示例
query = """
查找2024年1月至2024年3月期间,
年龄在50岁以上且诊断为糖尿病(ICD-11编码:FB80)的患者,
显示他们的最近一次处方信息
"""
# 执行查询流程
result = medical_graph.run({
"input": query,
"user": {
"role": "physician",
"department": "内分泌科"
}
})
print("原始查询:", query)
print("脱敏结果:", result["formatted_output"])
print("执行日志:", result["execution_log"])
2. 上下文医疗对话
# 初始化对话历史
medical_session = MedicalSession(
patient_id="P001",
context={
"last_diagnosis": "2型糖尿病",
"allergies": ["青霉素"]
}
)
# 连续对话示例
response1 = medical_graph.run({
"input": "查看该患者最近的血糖检测记录",
"session": medical_session
})
response2 = medical_graph.run({
"input": "针对该患者的糖尿病,推荐合适的药物",
"session": medical_session
})
3. 复杂医疗数据分析
# 多表关联查询
query = """
统计2023年度各科室糖尿病患者的平均年龄,
并按科室名称升序排列,
结果保留两位小数
"""
# 执行分析
analysis = medical_graph.run({
"input": query,
"security_level": "high" # 高安全等级查询
})
# 生成可视化图表
plot = MedicalVisualizer().create_bar_chart(
data=analysis["result"],
title="科室糖尿病患者年龄分布"
)
六、医疗数据安全增强
1. 动态数据脱敏
from langchain.security import DynamicDataMasking
# 定义脱敏规则
masking_strategy = DynamicDataMasking(
fields={
"patients.name": lambda x: f"患者{x[-4:]}",
"patients.ssn": "***-**-****",
"prescriptions.dosage": lambda x: round(x * 0.8, 1) # 剂量调整
},
exceptions=[
{"role": "admin", "allowed_fields": ["*"]}
]
)
# 应用脱敏策略
medical_db = SQLDatabase.from_uri(
connection_uri,
data_masking=masking_strategy
)
2. 医疗合规审计
from langchain.callbacks import AuditCallbackHandler
# 初始化审计日志
medical_chain = SQLDatabaseChain(
llm=medical_llm,
database=medical_db,
callbacks=[
AuditCallbackHandler(
log_path="medical_audits.json",
required_fields=["user_role", "query_time", "affected_rows"]
)
]
)
3. 细粒度权限控制
# 创建角色权限映射
role_permissions = {
"resident_doctor": {
"allowed_tables": ["patients", "diagnoses"],
"denied_columns": ["patients.ssn", "prescriptions.medication"]
},
"specialist": {
"allowed_tables": ["*"],
"required_approvers": ["department_head"]
}
}
# 初始化权限系统
medical_db = SQLDatabase.from_uri(
connection_uri,
permissions=role_permissions
)
七、完整系统集成
# 完整实现代码
from langchain.graphs import Graph
from langchain.llms import DeepSeek
from langchain.utilities import SQLDatabase
from dotenv import load_dotenv
import os
load_dotenv()
# 初始化医疗数据库
medical_db = SQLDatabase.from_uri(
f"postgresql+psycopg2://{os.getenv('POSTGRES_MEDICAL_USER')}:"
f"{os.getenv('POSTGRES_MEDICAL_PASSWORD')}@{os.getenv('POSTGRES_MEDICAL_HOST')}:"
f"{os.getenv('POSTGRES_MEDICAL_PORT')}/{os.getenv('POSTGRES_MEDICAL_DB')}",
custom_table_info=MEDICAL_SCHEMA_DESCRIPTION,
data_masking=MEDICAL_MASKING_STRATEGY
)
# 配置医疗专用模型
medical_llm = DeepSeek(
model_name="deepseek-16b",
temperature=0.6,
medical_mode=True,
callbacks=[MedicalAuditCallback()]
)
# 构建查询流程
medical_graph = Graph()
medical_graph.add_nodes_from([
("解析", MedicalQueryParser()),
("生成SQL", SQLDatabaseChain(llm=medical_llm, database=medical_db)),
("执行", MedicalDBExecutor()),
("格式化", MedicalResultFormatter())
])
medical_graph.add_edges_from([
("解析", "生成SQL"),
("生成SQL", "执行"),
("执行", "格式化")
])
# 执行医疗查询
query = "查找心内科2024年Q1急性心肌梗死患者的平均年龄"
result = medical_graph.run({
"input": query,
"user": {"role": "cardiologist"}
})
# 输出结果
print("查询结果:", result["formatted_output"])
print("执行时间:", result["execution_time"])
八、医疗场景扩展
1. 临床决策支持
from langchain.chains import LLMChain
# 创建治疗建议链
treatment_chain = LLMChain(
llm=medical_llm,
prompt=PromptTemplate(
input_variables=["diagnosis", "patient_info"],
template="根据{diagnosis}诊断和{patient_info},"
"请提供三个治疗建议方案"
)
)
# 结合数据库查询
diagnosis_result = medical_graph.run("查询患者P001的最新诊断结果")
treatment_suggestions = treatment_chain.run(
diagnosis=diagnosis_result["result"],
patient_info="65岁男性,有高血压病史"
)
2. 自动化报告生成
from langchain.chains import SequentialChain
# 定义报告生成流程
report_chain = SequentialChain(
chains=[
medical_graph,
ReportGeneratorChain(
template_path="medical_report_template.docx"
)
],
input_variables=["medical_query"],
output_variables=["generated_report"]
)
# 生成完整报告
final_report = report_chain.run({
"medical_query": "生成2023年度糖尿病患者统计报告"
})
九、医疗合规最佳实践
- 数据最小化原则:
medical_db = SQLDatabase.from_uri(
connection_uri,
minimal_columns=True # 仅加载必要字段
)
- 传输加密:
from sqlalchemy.engine import create_engine
engine = create_engine(
connection_uri,
connect_args={
"sslmode": "verify-full",
"sslrootcert": "root.crt"
}
)
- 会话超时控制:
medical_session = MedicalSession(
timeout=30, # 30分钟无操作自动注销
max_attempts=5 # 密码错误限制
)
通过该系统,医疗工作者可以安全高效地进行:
- 复杂病历检索
- 多维度数据分析
- 临床决策支持
- 自动化报告生成
建议在实际部署中:
- 定期更新医疗术语知识库
- 实施模型输出人工审核机制
- 部署入侵检测系统(IDS)监控数据库访问
- 定期进行合规性审计
这种技术组合不仅能提升医疗数据的利用效率,更能为精准医疗提供有力支撑。随着医疗大模型的不断发展,该系统将成为智能医疗生态的重要组成部分。