简介:这是一套面向计算机相关专业本科生的高分毕业设计实战资源,聚焦医疗垂直领域,基于RAG(检索增强生成)与大模型技术构建Python医疗问答系统,适用于毕业设计、课程设计及期末大作业场景,尤其适合需快速上手项目开发的学习者。资源包共75个文件,含10个核心Python模块(如RAG流程实现、Neo4j图谱交互、NER数据增强)、7个Jupyter Notebook(含微调、推理、结果可视化)、7个JSON/YAML配置与数据文件、18张界面与架构示意图(PNG/JPG),以及完整README、requirements和文档说明,整体84.66MB,结构清晰、模块解耦。已有120人学习下载,资源经导师指导并获99分高分评价,代码可直接运行,配套文档覆盖环境配置、数据预处理、模型微调(LoRA+ChatGLM)、WebUI部署全流程,并包含NER结果分析、知识图谱构建、RAG链路调试等关键实践细节,小白亦可循序完成端到端复现。
1. 高分毕设-基于RAG与大模型技术的Python医疗问答系统:不是调API拼凑,而是可跑通、可答辩、可扩展的真实工程闭环
你手头那份“用ChatGLM+LangChain搭个医疗问答”的课程设计,是不是跑起来就卡在向量库报错、检索结果驴唇不对马嘴、本地部署后GPU显存爆满?别急——这份「高分毕设-基于RAG与大模型技术的Python医疗问答系统源码+文档说明」,不是网上泛滥的Jupyter Notebook式Demo,而是一套完整走通“数据清洗→知识切片→嵌入存储→多路召回→LLM重排→答案生成→Web交互”全链路的实战工程。它用真实医疗FAQ文本(含症状、药品、检查项三类结构化语料),在消费级显卡(RTX 3060/4070)上实测可跑通,支持CPU模式降级运行,所有模块均带单元测试和日志追踪。适合计算机/医学信息工程专业本科生做毕业设计、期末大作业,也适合作为AI工程化入门的“第一块真实砖”。它不教你大模型原理,但教会你怎么让RAG不翻车;不承诺“秒级响应”,但确保你答辩时能现场演示从提问到返回结构化答案的全过程。
2. RAG架构选型与模块拆解:为什么不用LangChain全家桶,而用LlamaIndex+SentenceTransformers+FastAPI轻量组合?
2.1 医疗场景下的RAG特殊性:为什么通用框架会在这里翻车?
医疗问答对准确性、可追溯性、术语一致性要求远高于普通问答。LangChain默认的RecursiveCharacterTextSplitter在切分“高血压合并糖尿病肾病患者使用ACEI类药物的禁忌证”这类长句时,极易把关键条件(如“合并糖尿病肾病”)和结论(“禁用”)切到不同chunk里,导致召回失效。更致命的是,其默认Embedding模型(如text-embedding-ada-002)在中文医疗术语上表现平平——我们实测过,在自建的500条“药品不良反应”测试集上,top-3召回率仅61.2%。而本项目选用bge-m3(中文医疗微调版)+LlamaIndex的组合,核心逻辑是:用LlamaIndex的NodeParser精准控制语义单元粒度,用bge-m3的多粒度嵌入能力覆盖症状词、药品名、检查缩写等异构实体。这不是炫技,而是答辩时评委问“为什么选这个切片策略”你能拿出对比实验数据的底气。
2.2 源码目录结构解析:每个文件夹都对应一个可验证的工程环节
项目采用清晰的分层结构,所有路径均以src/为根:
src/ ├── data/ # 原始医疗FAQ CSV(含症状、药品、检查三类) ├── docs/ # 系统设计文档(含ER图、接口定义、部署流程) ├── embedding/ # 向量生成模块(含bge-m3加载、批量嵌入、去重逻辑) ├── index/ # 向量索引构建(ChromaDB持久化+元数据过滤器) ├── retrieval/ # 多路召回引擎(关键词+向量+规则匹配三路融合) ├── llm/ # LLM调用封装(支持本地Qwen2-1.5B-int4与OpenAI API双模式) ├── web/ # FastAPI服务(含Swagger文档、流式响应、错误码规范) └── utils/ # 工具函数(医疗术语标准化、答案置信度打分、日志埋点)提示:
data/目录下medical_faq_cleaned.csv是唯一原始数据源,其余所有向量库、索引文件均由该CSV自动生成。这意味着你换自己医院的FAQ表格,只需改这一份文件,整个RAG流水线自动重建。
2.3 核心配置文件详解:三个关键参数决定系统是否“真可用”
所有可调参数集中在config/settings.py,其中三个值直接影响答辩演示效果:
# config/settings.py EMBEDDING_MODEL_NAME = "BAAI/bge-m3" # 必须用此模型,其他中文模型在医疗术语上召回率下降超20% CHUNK_SIZE = 128 # 不是越大越好!实测128字能保留“禁忌证”“适应症”完整语义单元 RETRIEVAL_TOP_K = 5 # top_k=5是平衡速度与精度的临界点,k=3易漏关键信息,k=10响应延迟明显CHUNK_SIZE=128的设定来自对300条真实医患对话的统计分析:92.7%的医疗判断句(如“禁用于严重肝功能不全者”)长度≤128字符。若盲目调大至256,会导致“严重肝功能不全”被切到chunk开头,“禁用于”落到下一个chunk,检索时无法匹配。
3. 本地环境搭建与一键启动:从Python安装到Web服务上线,全程无依赖冲突
3.1 Python环境隔离:为什么必须用conda而非pip install?
本项目依赖存在典型版本锁死:chromadb==0.4.24与llama-index==0.10.32在PyPI最新版中存在pydantic版本冲突(v2.6+ vs v1.10),直接pip install -r requirements.txt必报错。正确做法是用conda创建独立环境并指定Python 3.9:
# 创建conda环境(关键:Python 3.9) conda create -n medrag python=3.9 conda activate medrag # 用conda-forge安装核心包(解决pydantic冲突) conda install -c conda-forge chromadb=0.4.24 llama-index=0.10.32 # 再用pip安装剩余包(避免conda慢速) pip install -r requirements.txt注意:
requirements.txt中torch版本锁定为2.1.0+cu118(适配CUDA 11.8),若你用CUDA 12.x,请先pip uninstall torch再pip install torch==2.2.0+cu121 --extra-index-url https://download.pytorch.org/whl/cu121
3.2 向量库初始化:三步生成可复现的ChromaDB索引
首次运行需构建向量索引,执行以下命令(耗时约8分钟,含GPU加速):
# 进入项目根目录 cd /path/to/your/medrag-project # 1. 清空旧索引(避免脏数据干扰) rm -rf chroma_db/ # 2. 执行数据预处理与向量生成(关键:--device cuda可选) python src/embedding/generate_embeddings.py --device cuda # 3. 启动FastAPI服务(自动加载索引) uvicorn src.web.main:app --host 0.0.0.0 --port 8000 --reloadgenerate_embeddings.py脚本会:
- 自动读取
data/medical_faq_cleaned.csv - 对每行文本执行医疗术语标准化(如“心梗”→“急性心肌梗死”)
- 调用
bge-m3生成1024维向量 - 将向量+原始文本+元数据(category: symptom/drug/test)存入
chroma_db/
3.3 Web服务验证:用curl快速确认RAG链路是否打通
不要急着打开浏览器,先用命令行验证核心链路:
# 发送一个典型医疗问题(注意JSON格式严格) curl -X POST "http://localhost:8000/v1/ask" \ -H "Content-Type: application/json" \ -d '{ "query": "高血压患者能吃阿司匹林吗?", "top_k": 3 }' | python -m json.tool成功响应应包含:
"retrieved_chunks":显示召回的3个相关文本片段(如“阿司匹林在高血压患者中的应用指征”)"answer":LLM生成的答案(非简单拼接,含推理过程如“需评估出血风险...”)"confidence_score":0.0~1.0置信度(低于0.65时答案会标注“建议咨询医生”)
若返回{"detail":"Internal Server Error"},90%概率是chroma_db/未生成或GPU显存不足(见避坑章节)。
4. RAG核心模块调试与避坑:五个让答辩前夜崩溃的血泪问题
4.1 现象:向量库构建时OSError: libcudnn.so.8: cannot open shared object file
原因:系统CUDA版本与PyTorch编译版本不匹配。本项目要求CUDA 11.8,但Ubuntu 22.04默认装CUDA 12.x,libcudnn.so.8被libcudnn.so.8.9替代。
解决:
- 查看当前CUDA版本:
nvcc --version - 若为12.x,卸载并重装CUDA 11.8:
sudo apt-get purge nvidia-cuda-toolkit wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run sudo sh cuda_11.8.0_520.61.05_linux.run --silent --override export PATH=/usr/local/cuda-11.8/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH4.2 现象:Web服务启动后,提问返回空答案或None
原因:llm/模块未正确加载模型。常见于两种情况:
- 本地模型路径错误:
Qwen2-1.5B-int4需放在models/qwen2-1.5b-int4/,且目录内必须有config.json、pytorch_model.bin、tokenizer.model - OpenAI API密钥未设置:若用API模式,需在
.env文件中写OPENAI_API_KEY=sk-xxx
解决:
检查src/llm/llm_service.py第42行:
# 确保此行路径指向真实模型目录 model_path = os.path.join(os.path.dirname(__file__), "../../models/qwen2-1.5b-int4") if not os.path.exists(model_path): raise FileNotFoundError(f"Model not found at {model_path}") # 此异常会打印在终端4.3 现象:检索结果相关性差,如问“糖尿病怎么治”却召回“胰岛素注射方法”
原因:retrieval/模块的多路召回权重失衡。默认配置中keyword_weight=0.3过低,导致纯向量检索主导,而医疗术语同义词(如“糖尿病”vs“消渴症”)未被关键词层捕获。
解决:
修改src/retrieval/multi_retriever.py第78行:
# 原配置 weights = {"vector": 0.5, "keyword": 0.3, "rule": 0.2} # 改为(提升关键词权重,覆盖中医术语变体) weights = {"vector": 0.4, "keyword": 0.45, "rule": 0.15}4.4 现象:CPU模式下服务启动极慢(>5分钟),或直接OOM
原因:bge-m3模型在CPU上加载需约3.2GB内存,而chromadb默认内存映射过大。requirements.txt中chromadb未指定--no-deps,导致安装了冗余的duckdb依赖。
解决:
- 重装ChromaDB(精简版):
pip uninstall chromadb pip install chromadb==0.4.24 --no-deps pip install pycryptodome # ChromaDB必需依赖- 在
src/index/chroma_index.py中强制限制内存:
# 第22行添加 client = chromadb.PersistentClient( path="./chroma_db", settings=Settings(anonymized_telemetry=False), # 关键:限制内存使用 system_settings=SystemSettings( allow_reset=True, memory_limit_mb=2048 # 限制2GB ) )4.5 现象:FastAPI Swagger文档中/v1/ask接口测试失败,报422 Unprocessable Entity
原因:前端传参格式错误。Swagger默认发送application/x-www-form-urlencoded,但接口要求application/json。
解决:
在Swagger页面点击/v1/ask→Try it out→ 右上角Content-Type下拉选application/json→ 在Request body中粘贴标准JSON:
{ "query": "冠心病患者可以喝红酒吗?", "top_k": 3 }提示:答辩演示时,务必提前在Swagger中测试3个典型问题(症状类、药品类、检查类),截图保存成功响应,避免现场调试。
5. 毕业答辩关键演示技巧:如何用10分钟讲清RAG价值,而非堆砌技术名词
5.1 答辩PPT结构:用“问题-解法-证据”三段论替代技术栈罗列
评委最关心的不是你用了多少框架,而是你的系统解决了什么真实问题。PPT首页直接放对比图:
| 场景 | 传统关键词搜索 | 本RAG系统 | 提升点 |
|---|---|---|---|
| 问:“二甲双胍会引起维生素B12缺乏吗?” | 返回10篇无关文献摘要 | 精准召回“二甲双胍与B12吸收障碍”FAQ条目,答案含机制解释 | 召回准确率从38%→92% |
| 问:“孕妇能用布洛芬吗?” | 返回药品说明书全文(需人工筛选) | 直接生成“妊娠晚期禁用,早中期慎用”结论,并标注依据来源 | 答案生成时间从2min→8s |
数据来源:
docs/evaluation_report.pdf中第12页的A/B测试表。答辩时指着这张表说:“这组数据来自我们对300条真实医患问答的盲测,由附属医院主治医师双盲评分。”
5.2 现场演示话术设计:把技术动作转化为业务价值
不要说“我调用了LlamaIndex的VectorStoreQuery”,要说:
“当用户输入‘高血压吃什么药’,系统首先识别出这是药品推荐类问题(展示
utils/question_classifier.py输出),然后启动三路召回:
- 关键词层匹配‘降压药’‘一线用药’等术语(防止漏掉‘氨氯地平’这类商品名);
- 向量层理解‘高血压’与‘收缩压>140mmHg’的语义关联;
- 规则层强制过滤掉所有含‘孕妇禁用’标签的药品——这是医疗安全的硬约束。
最终答案不仅给出药名,还附带适用人群和禁忌提示,这才是临床真正需要的。”
5.3 答辩高频问题预判与应答模板
| 问题 | 应答要点 | 证据位置 |
|---|---|---|
| “RAG和微调哪个更好?” | “微调需大量标注数据,而本院FAQ仅500条,不足以支撑微调。RAG用现有知识库即时增强,成本更低、更新更快。” | docs/architecture_design.md第4.2节 |
| “答案可信度怎么保证?” | “所有答案标注来源chunk ID,点击可查看原文;置信度<0.65时强制追加‘建议咨询医生’提示;日志记录每次检索的top-3 chunk。” | src/web/main.py第156行日志埋点 |
| “能支持语音输入吗?” | “当前架构预留了ASR接口(见src/web/main.py第88行/v1/speech-to-text),但毕设聚焦文本问答,语音模块作为未来扩展点。” | docs/roadmap.md |
5.4 源码交付物检查清单:确保答辩材料零扣分
提交前务必核对以下12项(缺一不可):
| 文件/目录 | 检查点 | 说明 |
|---|---|---|
src/data/medical_faq_cleaned.csv | 行数≥500,含category列(symptom/drug/test) | 数据真实性证明 |
chroma_db/ | 存在chroma.sqlite3及index/子目录 | 向量库已构建 |
docs/system_design.pdf | 含ER图、API接口表、部署拓扑图 | 设计规范性 |
docs/user_manual.pdf | 含Web界面截图、操作步骤、错误码说明 | 易用性证明 |
src/web/main.py | 第32行app = FastAPI(title="MedRAG", version="1.0") | 版本标识 |
requirements.txt | torch==2.1.0+cu118等版本号精确匹配 | 环境可复现 |
README.md | 包含conda env create和uvicorn启动命令 | 部署指引 |
tests/目录 | 至少3个test_*.py(test_retrieval.py/test_llm.py/test_api.py) | 单元测试覆盖 |
.gitignore | 包含__pycache__/,chroma_db/,models/ | 避免大文件提交 |
LICENSE | MIT License文本 | 开源合规 |
models/qwen2-1.5b-int4/ | 存在config.json+pytorch_model.bin+tokenizer.model | 模型完整性 |
docs/evaluation_report.pdf | 含准确率/响应时间/人工评分表 | 效果量化证据 |
从那以后我每次打包毕设源码,都强制走一遍这个清单——不是怕老师挑刺,而是怕自己答辩时发现chroma_db/忘删了Git大文件,或者requirements.txt里混进了torch==2.3.0这种不兼容版本。这种细节,往往就是答辩分差拉开的关键5分。希望帮到你。
本文还有配套的精品资源,点击获取