DUTMed
基于 Neo4j 知识图谱与通义千问 LLM 的多模态医学问答系统,支持多跳推理、医学影像分割与分析、文档自动入库,提供 Web 界面与命令行两种交互模式。A multimodal medical QA system powered by Neo4j knowledge graph and LLM, supporting multi-hop reasoning, medical image segmentation & analysis, and automated document ingestion. Web UI & CLI included.
Install / Use
/learn @feiyu1104/DUTMedREADME
DUTMed — 基于 Neo4j + LLM 的多模态医学问答系统
DUTMed 是一个结合 知识图谱(Neo4j) 与 大语言模型(阿里云通义千问) 的智能医学问答助手,支持文本问答、图像分析,适用于医学教育、临床辅助、科研探索等场景。

🌟 核心功能
- ✅ 智能问答:基于医学知识图谱 + LLM,精准回答疾病、症状、药品、检查等问题
- ✅ 多跳推理:支持单跳/多跳查询,深入挖掘关联实体
- ✅ 预算控制:支持
Deep/Deeper模式,平衡速度与深度 - ✅ 图像理解:上传医学图像 → 自动分割 → AI 影像描述 → 摘要提炼 → 关联知识图谱
- ✅ 文档入库:上传 TXT / JSON / MD 等格式文件→ 自动切片、LLM 抽取实体关系、写入 Neo4j,文档切片作为参考资料
- ✅ 多轮对话:浏览器 Session 级别的对话记忆,支持指代消解与上下文连贯问答
- ✅ 流式响应:实时显示思考过程,透明可解释
- ✅ 快速使用:提供交互式前端,可一键部署使用
🚀 快速开始
1. 克隆项目
git clone https://github.com:feiyu1104/DUTMed.git
cd DUTMed
2.安装依赖
pip install -r requirements.txt
3.数据导入
# 安装依赖
pip install neo4j==5.14.1
# 确保Neo4j数据库已启动
# 默认连接信息:
# URI: bolt://localhost:7687
# 用户名: xxx
# 密码: xxxxx
python neo4j_import.py # 运行脚本将数据导入Neo4j中,需要等待十几分钟
4.配置环境变量
创建.env文件:
# Neo4j 数据库配置
NEO4J_URI=your_url_here
NEO4J_USER=your_name_here
NEO4J_PASSWORD=your_password_here
# 阿里云通义千问 API
ALI_API_KEY=your_api_key_here
ALI_BASE_URL=https://dashscope.aliyuncs.com/api/v1
ALI_MODEL0=qwen-plus # 用于实体识别、答案生成、文档抽取、影像摘要
ALI_MODEL1=qwen-vl-plus # 用于医学图像描述(多模态)
# 可选:文件上传大小限制(单位 MB,默认 50)
# MAX_UPLOAD_MB=50
# 可选:对话记忆保留时长(单位小时,默认 2)
# SESSION_MAX_AGE_HOURS=2
💡 如无阿里云账号,可替换为其他 LLM API(如 OpenAI、本地模型),需修改
q_a.py中call_llm方法。
5.启动应用
python app.py
访问 👉 http://localhost:5001 即可使用!
🧭 使用说明
本项目支持 Web 界面交互 和 终端命令行问答 两种模式,满足不同场景需求:
1.Web 界面模式
适合:演示、团队协作、非技术人员使用 特点:图形化界面、支持图像上传与文档入库、多轮对话记忆、实时日志流、模式切换
启动方式:见🚀 快速开始
工具栏说明
| 按钮/控件 | 功能 | |-----------|------| | 🧠 深度搜索 (多跳/单跳) | 切换多跳推理模式 | | 🗑️ 清除记忆 | 清除当前会话对话历史,开启新会话 | | 搜索预算 Deep / Deeper | 控制知识图谱查询范围与深度 | | 📎 上传图片 | 上传医学图像,自动分割 → 描述 → 摘要 → 知识图谱关联分析 | | 📄 上传文档 | 上传 TXT/JSON/MD/CSV/PDF,自动抽取实体关系写入 Neo4j |
2. 终端命令行模式
适合:快速测试、批量问答、脚本集成、无 GUI 环境 特点:轻量、快速、支持参数控制、无依赖前端
启动方式:
# 默认模式(多跳 + Deeper)
python q_a.py
# 多跳 + Deeper
python q_a.py --search_budget Deep
# 禁用多跳 + Deep 模式(轻量快速)
python q_a.py --disable_multi_hop --search_budget Deep
# 禁用多跳 + Deeper
python q_a.py --disable_multi_hop
3.模式对比表
| | | |
| -------- | ------------------ | ------------------------- |
| 启动命令 | python app.py | python q_a.py [参数] |
| 交互方式 | 浏览器图形界面 | 终端命令行问答 |
| 图像支持 | ✅ 支持上传与分割 | ❌ 仅文本问答 |
| 实时日志 | ✅ 可视化“思考过程” | ✅ 终端彩色输出(Rich 库) |
| 模式切换 | ✅ 界面按钮/下拉框 | ✅ 命令行参数 |
🎥 使用演示
1.Web 界面模式
-
文本问答

-
影像分析

-
用户历史信息问答

-
文档入库

2. 终端命令行模式


🛠️ 技术架构

Frontend (HTML/CSS/JS)
↓ SSE / Fetch
Flask (app.py)
├── /ask 问答接口(SSE 流式)
├── /upload_image 图像上传接口
├── /upload_document 文档上传接口
└── /clear_history 清除对话记忆
↓
Neo4jRAGSystem (q_a.py)
├── 多轮对话改写(指代消解)
├── 实体关系抽取(LLM)
├── 知识图谱查询(Neo4j)
│ ├── 一跳查询 + Embedding 相似度排序
│ ├── 多跳推理(可选)
│ └── SourceChunk 原文片段检索
└── 答案生成(LLM + 对话历史注入)
↓
图像模块
├── 图像分割(FastSAM) → image_segmentation.py
├── 图像描述(Qwen-VL) → image_description.py
└── 影像摘要(Qwen-Plus) → image_description.py
↓
文档入库模块(document_ingestion.py)
├── 文本切片(800字/120重叠)
├── 实体关系抽取(LLM)
└── 写入 Neo4j(SourceDocument / SourceChunk / 实体节点)
📊 数据说明
数据文件见data/症状.json文件,其包含了丰富的疾病信息,每条记录包含24个字段的医疗数据。
1.节点类型(9种)
| 节点类型 | 标签 | 描述 | 示例 |
| -------- | ------------ | ------------------ | ---------------------------- |
| 疾病 | Disease | 疾病信息(主节点) | 肺炎、糖尿病、高血压 |
| 分类 | Category | 疾病分类 | 内科、呼吸内科、心血管内科 |
| 症状 | Symptom | 疾病症状 | 发热、咳嗽、胸痛 |
| 科室 | Department | 治疗科室 | 内科、外科、急诊科 |
| 治疗方法 | Treatment | 治疗方式 | 药物治疗、手术治疗、康复治疗 |
| 检查项目 | Check | 诊断检查 | 血常规、胸部CT、心电图 |
| 药物 | Drug | 药物信息 | 阿奇霉素、青霉素、布洛芬 |
| 食物 | Food | 食物信息 | 鸡蛋、牛奶、辣椒 |
| 食谱 | Recipe | 推荐食谱 | 百合粥、银耳汤、蒸蛋羹 |
2.关系类型(11种)
| 关系类型 | 描述 | 示例 |
| -------------------- | ------------------ | -------------------------------------- |
| BELONGS_TO | 疾病属于某分类 | (肺炎)-[:BELONGS_TO]->(呼吸内科) |
| HAS_SYMPTOM | 疾病有某症状 | (肺炎)-[:HAS_SYMPTOM]->(发热) |
| TREATED_BY | 疾病由某科室治疗 | (肺炎)-[:TREATED_BY]->(呼吸内科) |
| USES_TREATMENT | 疾病使用某治疗方法 | (肺炎)-[:USES_TREATMENT]->(药物治疗) |
| REQUIRES_CHECK | 疾病需要某检查 | (肺炎)-[:REQUIRES_CHECK]->(胸部CT) |
| RECOMMENDS_DRUG | 疾病推荐某药物 | (肺炎)-[:RECOMMENDS_DRUG]->(阿奇霉素) |
| COMMONLY_USES_DRUG | 疾病常用某药物 | (肺炎)-[:COMMONLY_USES_DRUG]->(青霉素) |
| SHOULD_EAT | 疾病宜吃某食物 | (肺炎)-[:SHOULD_EAT]->(鸡蛋) |
| SHOULD_NOT_EAT | 疾病不宜吃某食物 | (肺炎)-[:SHOULD_NOT_EAT]->(辣椒) |
| RECOMMENDS_RECIPE | 疾病推荐某食谱 | (肺炎)-[:RECOMMENDS_RECIPE]->(百合粥) |
| ACCOMPANIES | 疾病伴随其他疾病 | (糖尿病)-[:ACCOMPANIES]->(高血压) |
3. 文档入库新增节点类型
通过「上传文档」功能写入 Neo4j 的节点类型:
| 节点类型 | 标签 | 描述 |
|----------|------|------|
| 来源文档 | SourceDocument | 上传文件的元信息(文件名、哈希 ID) |
| 文档切片 | SourceChunk | 文档分块原文,与实体节点通过 [:MENTIONS] 关联 |
| 医学实体 | (同上表 9 种)| LLM 从文档中抽取,按类型 MERGE 到已有节点 |
问答时系统会同时检索知识图谱和 SourceChunk 原文片段,两路内容一并送入 LLM 生成答案。
4.疾病节点属性
每个疾病节点包含以下属性:
name:疾病名称desc:疾病描述prevent:预防措施cause:病因get_prob:发病概率easy_get:易患人群get_way:传播方式cure_lasttime:治疗时间cured_prob:治愈概率cost_money:治疗费用yibao_status:医保状态
⚙️ 配置说明
系统支持通过参数控制 搜索深度 与 计算开销,在“答案完整性”和“响应速度”之间取得平衡。
1. 核心配置参数
| 参数 | 类型 | 默认值 | 说明 |
| :------------------: | :--: | :--------: | :------------------------------: |
| enable_multi_hop | bool | True | 是否启用多跳查询(第二跳扩展) |
| search_budget_mode | str | Deeper | 搜索预算模式,控制查询范围和数量 |
2. 搜索预算模式对比
系统预设两种搜索预算模式,通过 search_budget_mode 控制:
✅ Deeper 模式(默认,深度优先)
- 优点:覆盖范围广,答案更全面
- 缺点:查询次数多,响应较慢,API调用成本高
"Deeper": {
"entity_limit": 3, # 单实体查询最多返回3个节点
"relation_limit": 10, # 关系查询最多10条
"top_k_triples": 5, # 最终保留相似度最高的5个三元组
"one_hop_limit": 10, # 第一跳查询最多10条边
"top_k_multi_hop_entities": 5, # 选择相似度最高的5个实体进行第二跳
"multi_hop_limit": 3 # 第二跳每个实体最多查3条边
}
✅ Deep 模式(快速模式)
- 优点:查询轻量,响应快,节省 API 调用
- 缺点:可能遗漏部分关联信息
"Deep": {
"entity_limit": 2,
"relation_limit": 8,
"one_hop_limit": 8,
"top_k_triples": 4,
"top_k_multi_hop_entities": 4,
"multi_hop_limit": 2
}
3.性能与资源开销对比表
| 配置组合 | 查询深度 | 响应速度 | api次数 | 适用场景 |
| :------------: | :------: | :------: | :-----: | :----------------------: |
| Deep+ 单跳 | ⚡ 轻量 | 🚀 快 | 少 | 日常问答、演示、低配设备 |
| Deep+ 多跳 | 🌿 中等 | 🐢 中等 | 中 | 平衡型问答 |
| Deeper+ 单跳 | 🌲 深度 | 🐢 慢 | 中 | 深度聚焦分析 |
| Deeper+ 多跳 | 🌳 超深 | 🐢🐢 慢 | 多 | 科研、复杂推理、完整答案 |
⚠️ 注意:每次查询都会调用多次 Embedding API(计算相似度)和 1~2 次 Chat API(抽取 + 生成),请合理控制使用频率,避免 API 限流或费用超支。
2026.3.21更新:新增本地缓存,如成功命中,将直接调用前几次生成的词向量,减少token消耗。
4. 其他可选配置
| 环境变量 | 默认值 | 说明 |
|----------|--------|------|
| MAX_UPLOAD_MB | 50 | 单次上传文件大小上限(MB) |
| SESSION_MAX_AGE_HOURS | 2 | 对话记忆保留时长(超时自动清除) |
| FILE_MAX_AGE_HOURS | 24 | uploads/segmented 目录临时文件保留时长 |
📬 联系与支持
如有问题或建议,请:
- 提交 Issue
- 或联系我们:feiyucom@outlook.com
🙏 致谢
-
Neo4j — 图数据库引擎
-
阿里云通义千问 — 大语言模型支持
-
SAM — 图像分割基础模型
-
Rich — 终端美化输出
-
Flask — Web 框架
-
ansi2html — 将 Rich 终端彩色输出转为 HTML
-
pypdf — PDF 文本提取(可选,文档入库时使用)
-
感谢所有贡献者!完整名单请见 CONTRIBUTORS.md
我们也欢迎你加入贡献者行列 🎉
免责声明:本系统生成的医学信息仅供参考,不能替代专业医疗建议、诊断或治疗!请在医生指导下进行决策!
