核心实现方案
实现概述
本章介绍岐黄智鉴系统的实际技术实现方案,基于GLM-4.1V-9B模型和LoRA微调技术,构建专注于中医脾胃病诊疗的智能系统。
核心组件说明
1. GLM-4.1V基座模型
- 智谱AI开发的9B参数多模态大语言模型
- 支持文本、图像、视频等多种输入格式
- 具备Thinking模式,展示推理过程
2. LoRA微调适配器
- 基于1000+中医案例数据微调
- 专门优化中医术语和诊疗逻辑
- 低资源消耗,易于部署
3. Gradio交互界面
- 友好的Web界面,支持实时对话
- 多模态输入:文本、图像、PDF等
- 结构化输出展示
模型加载与初始化
模型加载机制
系统实现模型加载策略,优先使用本地模型,降低网络依赖:
python
def load_model():
"""模型加载:本地 -> 魔搭 -> HuggingFace"""
global processor, model
# 1. 优先使用本地模型
if LOCAL_MODEL_PATH.exists():
print(f"✅ 使用本地模型: {LOCAL_MODEL_PATH}")
model_path = str(LOCAL_MODEL_PATH)
else:
# 2. 尝试魔搭社区下载(国内网络友好)
try:
from modelscope import snapshot_download
model_path = snapshot_download(
MODELSCOPE_MODEL_ID,
cache_dir=str(PROJECT_ROOT / "models")
)
except Exception:
# 3. 兜底使用HuggingFace
model_path = HUGGINGFACE_MODEL_ID
模型配置参数
python
# 模型生成参数
gen_args = dict(
max_new_tokens=8192, # 最大生成长度
repetition_penalty=1.1, # 重复惩罚
do_sample=True, # 采样生成
top_k=2, # Top-K采样
temperature=None, # 温度参数
top_p=1e-5, # Top-P采样
)
多模态输入处理
文件类型支持
系统支持多种医疗相关的文件格式:
python
def _files_to_content(self, media):
"""处理多模态输入文件"""
out = []
for f in media or []:
ext = Path(f.name).suffix.lower()
# 视频文件处理
if ext in [".mp4", ".avi", ".mkv", ".mov", ".wmv",
".flv", ".webm", ".mpeg", ".m4v"]:
out.append({"type": "video", "url": f.name})
# 图像文件处理(舌象、面诊等)
elif ext in [".jpg", ".jpeg", ".png", ".gif",
".bmp", ".tiff", ".webp"]:
out.append({"type": "image", "url": f.name})
# PPT转图像
elif ext in [".ppt", ".pptx"]:
for p in self._ppt_to_imgs(f.name):
out.append({"type": "image", "url": p})
# PDF转图像
elif ext == ".pdf":
for p in self._pdf_to_imgs(f.name):
out.append({"type": "image", "url": p})
return out
文件安全检查
python
def check_files(files):
"""文件上传限制检查"""
vids = imgs = ppts = pdfs = 0
# 统计各类型文件数量
for f in files or []:
ext = Path(f.name).suffix.lower()
# ... 分类统计逻辑
# 限制规则
if vids > 1 or ppts > 1 or pdfs > 1:
return False, "只允许上传1个视频或1个PPT或1个PDF"
if imgs > 10:
return False, "最多允许上传10张图片"
if (ppts or pdfs) and (vids or imgs) or (vids and imgs):
return False, "不能混合上传文档、视频和图片"
return True, ""
对话生成机制
流式生成实现
系统采用流式生成技术,提供实时响应体验:
python
def stream_generate(self, raw_hist, sys_prompt):
"""流式生成对话回复"""
global stop_generation, processor, model
stop_generation = False
# 构建消息格式
msgs = self._build_messages(raw_hist, sys_prompt)
# 输入预处理
inputs = processor.apply_chat_template(
msgs,
tokenize=True,
add_generation_prompt=True,
return_dict=True,
return_tensors="pt",
).to(model.device)
# 配置流式输出
streamer = TextIteratorStreamer(
processor.tokenizer,
skip_prompt=True,
skip_special_tokens=False
)
# 启动生成线程
generation_thread = threading.Thread(
target=model.generate,
kwargs=gen_args
)
generation_thread.start()
# 实时输出处理
buf = ""
for tok in streamer:
if stop_generation:
break
buf += tok
yield self._stream_fragment(buf)
Thinking模式处理
GLM-4.1V的Thinking模式可以展示推理过程,增强可解释性:
python
def _stream_fragment(self, buf: str) -> str:
"""处理Thinking模式输出"""
think_html = ""
# 处理thinking标签
if "<think>" in buf:
if "</think>" in buf:
seg = re.search(r"<think>(.*?)</think>", buf, re.DOTALL)
if seg:
think_html = (
"<details open><summary>💭 Thinking</summary>"
"<div style='color:#cccccc;'>"
+ seg.group(1).strip().replace("\n", "<br>")
+ "</div></details>"
)
# 处理answer标签
answer_html = ""
if "<answer>" in buf:
if "</answer>" in buf:
seg = re.search(r"<answer>(.*?)</answer>", buf, re.DOTALL)
if seg:
answer_html = seg.group(1).strip()
else:
answer_html = buf.split("<answer>", 1)[1]
return think_html + answer_html
中医专业化改进
系统提示词优化
针对中医诊疗场景,设计了专业的系统提示词:
python
default_system_prompt = """
你是岐黄智鉴中医专病诊疗大模型,专注于脾胃病领域的智能辅助诊疗。
请基于中医理论进行专业分析,采用辨病-辨证-辨体的诊疗模式。
诊疗要求:
1. 运用中医四诊合参的方法
2. 遵循中医辨证论治原则
3. 提供专业的中医术语解释
4. 给出合理的治疗建议和生活指导
"""
LoRA微调数据格式
训练数据采用单轮或多轮对话格式,包含真实的中医诊疗案例:
json
{
"messages": [
{
"role": "user",
"content": "我今年54岁,上腹部疼了十多年了,时好时坏,没有规律。最近这半年特别疼,吃完饭更难受。之前去医院检查,医生说是胃粘膜脱垂症。\n\n我现在不仅肚子疼,还经常反酸水,嘴里发苦,肚子胀胀的,便秘也很严重。之前医生给我把脉看舌苔,说脉细,舌苔发黄又厚。\n\n这到底是怎么回事?我这情况严重吗?平时应该注意些什么?有什么办法能缓解这些症状吗?"
},
{
"role": "assistant",
"content": "<think>\n让我根据这位54岁患者的症状进行中医辨证分析。\n\n### 症状总结\n1. 上腹部疼痛十多年,时好时坏,无规律\n2. 近半年疼痛加重,饭后加重\n3. 西医诊断为胃粘膜脱垂症\n4. 伴随症状:反酸水、口苦、腹胀、严重便秘\n5. 脉象:脉细\n6. 舌象:舌苔黄厚\n\n### 中医辨证分析\n\n首先,根据症状表现,我需要确定病位、病性和病因病机。\n\n#### 病位分析\n- 主要症状在上腹部,属于中医\"胃脘\"部位,病位主要在胃\n- 伴有口苦、反酸,与肝胆有关\n- 腹胀、便秘与脾胃功能失调有关\n- 综合来看,病位主要在胃,与肝、脾关系密切\n\n#### 病性分析\n- 疼痛十多年,病程长,有慢性特点\n- 舌苔黄厚,提示有湿热\n- 口苦、反酸,为肝胃郁热之象\n- 便秘、腹胀,为脾胃气滞、腑气不通\n- 脉细,提示气血不足或阴虚\n\n#### 病因病机分析\n根据症状和体征,我认为这位患者的主要病机是:\n\n1. **肝胃郁热**:口苦、反酸、上腹部疼痛,饭后加重,这些都是肝胃郁热的表现。肝气郁结,横逆犯胃,胃失和降,气机不畅,故见胃脘疼痛;肝郁化火,故见口苦、反酸。\n\n2. **脾胃湿热**:舌苔黄厚,腹胀,便秘,为脾胃湿热之象。湿热蕴结脾胃,阻滞气机,故腹胀;湿热下注大肠,传导失司,故便秘。\n\n3. **气滞血瘀**:疼痛十多年,病程久,\"久病入络\",必有气滞血瘀。气机不畅,血行瘀滞,不通则痛,故疼痛反复发作。\n\n4. **脾胃虚弱**:脉细,提示气血不足。长期患病,脾胃功能受损,运化失常,气血生化不足,故见脉细。\n\n综合来看,这是一个**肝胃郁热、脾胃湿热、气滞血瘀兼脾胃虚弱**的复杂证型,属于本虚标实之证。标实为肝胃郁热、脾胃湿热、气滞血瘀,本虚为脾胃虚弱。\n\n### 诊断\n中医诊断:胃脘痛\n证型:肝胃郁热,脾胃湿热,兼气滞血瘀,脾胃虚弱\n\n### 治法\n治宜疏肝和胃,清热化湿,行气活血,健脾益气。\n\n### 方药\n可选用柴胡疏肝散合左金丸、半夏泻心汤加减。\n\n基本方药:\n- 柴胡10g,疏肝解郁\n- 黄芩10g,清肝胃之热\n- 黄连6g,清热燥湿\n- 吴茱萸3g,疏肝降逆,制酸\n- 半夏10g,化痰降逆\n- 陈皮10g,理气健脾\n- 枳实10g,破气消积\n- 厚朴10g,行气除满\n- 白芍15g,柔肝止痛\n- 甘草6g,调和诸药\n- 蒲公英15g,清热解毒\n- 丹参15g,活血化瘀\n- 白术10g,健脾益气\n- 茯苓15g,健脾渗湿\n\n### 针灸治疗\n可选取以下穴位:\n- 中脘:和胃健脾\n- 足三里:健脾和胃,调理气血\n- 内关:和胃降逆,理气止痛\n- 阳陵泉:疏肝利胆\n- 太冲:疏肝解郁\n- 丰隆:化痰湿\n- 天枢:调理肠胃,通便\n\n### 日常调护\n1. **饮食调理**:\n - 饮食宜清淡易消化,避免辛辣刺激、油腻煎炸食物\n - 少量多餐,避免过饱\n - 忌烟酒、浓茶、咖啡等刺激性饮品\n - 多吃新鲜蔬菜水果,保持大便通畅\n\n2. **情志调摄**:\n - 保持心情舒畅,避免情绪波动\n - 适当进行放松活动,如散步、太极、瑜伽等\n - 保证充足睡眠,避免过度劳累\n\n3. **生活起居**:\n - 规律作息,避免熬夜\n - 饭后适当活动,促进消化\n - 注意腹部保暖,避免受凉\n\n### 病情评估\n该患者病程较长,症状复杂,但并非危急重症。通过规范治疗和日常调护,症状可以得到缓解和控制。但需要长期坚持治疗和调理,防止病情反复或加重。\n\n以上是我对该患者的中医辨证分析和治疗建议。\n</think>\n<answer>\n# 中医辨证分析\n\n根据您提供的症状和体征,我进行了中医辨证分析:\n\n## 病情分析\n\n您的情况属于中医\"胃脘痛\"范畴,主要表现为:\n\n**主要证型:肝胃郁热,脾胃湿热,兼气滞血瘀**\n\n### 辨证依据:\n- **上腹部疼痛十多年,时好时坏**:久病入络,气滞血瘀,不通则痛\n- **饭后疼痛加重**:食滞胃脘,加重气机不畅\n- **反酸水、口苦**:肝胃郁热,胃气上逆\n- **腹胀、便秘**:脾胃湿热,气机阻滞,腑气不通\n- **舌苔黄厚**:湿热内蕴之象\n- **脉细**:提示久病气血不足,脾胃虚弱\n\n综合来看,这是一个本虚标实之证。标实为肝胃郁热、脾胃湿热、气滞血瘀;本虚为脾胃虚弱。\n\n## 治疗建议\n\n### 中药治疗\n治宜疏肝和胃,清热化湿,行气活血,健脾益气。\n\n推荐方药(柴胡疏肝散合左金丸加减):\n- 柴胡、黄芩、黄连、吴茱萸:疏肝清热,和胃降逆\n- 半夏、陈皮、枳实、厚朴:理气化湿,消痞除满\n- 白芍、甘草:柔肝止痛\n- 丹参、蒲公黄:活血化瘀,清热解毒\n- 白术、茯苓:健脾益气,渗湿止泻\n\n### 针灸治疗\n可选取中脘、足三里、内关、阳陵泉、太冲等穴位,以调和肝胃,理气止痛。\n\n## 日常调护\n\n### 饮食调理\n- 饮食宜清淡易消化,避免辛辣刺激、油腻煎炸食物\n- 少量多餐,避免过饱,尤其晚餐不宜过饱\n- 忌烟酒、浓茶、咖啡等刺激性饮品\n- 多吃新鲜蔬菜水果,保持大便通畅\n- 可适量食用具有健脾和胃作用的食物,如山药、莲子、薏苡仁等\n\n### 情志调摄\n- 保持心情舒畅,避免情绪波动,因为情绪不畅会加重肝胃不和\n- 适当进行放松活动,如散步、太极、瑜伽等\n- 保证充足睡眠,避免过度劳累\n\n### 生活起居\n- 规律作息,避免熬夜\n- 饭后适当活动,促进消化,但避免剧烈运动\n- 注意腹部保暖,避免受凉\n\n## 病情评估\n\n您的情况虽然病程较长,症状复杂,但并非危急重症。通过规范治疗和日常调护,症状可以得到缓解和控制。但需要长期坚持治疗和调理,防止病情反复或加重。\n\n建议您在专业中医师指导下进行系统治疗,定期复诊调整方案。同时,也可以结合西医治疗,双管齐下,效果更佳。\n</answer>"
},
{
"role": "user",
"content": "医生,您说的中药方具体怎么煎煮啊?需要煎多久?一天喝几次?针灸多久做一次有效果?我这情况大概多久能见好?平时吃饭有什么特别要注意的吗?哪些食物绝对不能吃?我便秘严重,有什么食疗方子可以调理吗?"
},
{
"role": "assistant",
"content": "<think>\n用户询问了关于中药煎煮方法、服用频率、针灸治疗频率、预期治疗效果、饮食注意事项以及便秘的食疗方子等具体问题。我需要根据之前的诊断和治疗方案,提供详细、实用的建议。\n\n### 中药煎煮方法\n根据之前提到的方药(柴胡疏肝散合左金丸加减),我需要给出具体的煎煮方法:\n1. 煎煮器具:最好使用砂锅、搪瓷锅或不锈钢锅,避免使用铁锅、铝锅\n2. 浸泡时间:一般先将药材加冷水浸泡30分钟\n3. 水量:一般加水量以高出药材2-3厘米为宜\n4. 煎煮时间:一般先用大火煮沸后,改用小火煎煮20-30分钟\n5. 煎煮次数:一般煎煮2次,将两次药液混合后分服\n\n### 服用频率\n一般中药汤剂每日1剂,分2-3次服用,建议饭后半小时至1小时服用,以减少对胃的刺激。\n\n### 针灸治疗频率\n对于慢性胃病,一般建议:\n- 初期:每周2-3次\n- 症状缓解后:每周1-2次\n- 巩固期:每周1次或隔周1次\n- 一个疗程一般为10-15次,休息1周后可进行下一疗程\n\n### 预期治疗效果\n考虑到患者病程较长(十多年),症状复杂,需要告知患者:\n- 急性症状(如疼痛、反酸)可能在1-2周内有所缓解\n- 慢性症状的改善需要1-3个月的持续治疗\n- 完全控制和恢复可能需要3-6个月甚至更长时间\n- 个体差异较大,效果因人而异\n\n### 饮食注意事项\n根据患者的肝胃郁热、脾胃湿热证型,需要特别注意:\n1. 饮食原则:清淡、易消化、温热适中\n2. 进食方式:少量多餐,细嚼慢咽\n3. 禁忌食物:\n - 辛辣刺激食物(辣椒、胡椒、芥末等)\n - 油腻煎炸食物\n - 生冷寒凉食物(冷饮、冰品等)\n - 过酸食物(醋、酸菜、柠檬等)\n - 易产气食物(豆类、洋葱、碳酸饮料等)\n - 粗糙难消化食物(粗粮、坚果等)\n - 烟酒、浓茶、咖啡\n\n### 便秘的食疗方子\n针对患者的便秘问题,可以推荐以下食疗方:\n1. 蜂蜜香油水:蜂蜜1-2勺,香油少许,温开水冲服\n2. 芝麻糊:黑芝麻研磨成粉,加开水调成糊状,可加适量蜂蜜\n3. 香蕉:每天1-2根,最好在早晨空腹食用\n4. 红薯粥:红薯切块与大米同煮成粥\n5. 萝卜汤:白萝卜切片煮汤,可加少量蜂蜜调味\n6. 枸杞子:每日10-15克,泡水或煮粥食用\n7. 核桃仁:每日5-10克,嚼食或煮粥\n\n此外,还可以建议患者:\n- 每天早晨起床后喝一杯温开水\n- 养成定时排便的习惯\n- 适当增加腹部按摩,促进肠蠕动\n- 保持适量运动,如散步、慢跑等\n\n现在,我将整合以上信息,为用户提供详细、专业的回答。\n</think>\n<answer>\n# 中药煎煮与服用方法\n\n## 中药煎煮方法\n针对您的情况,中药煎煮方法如下:\n\n1. **煎煮器具**:最好使用砂锅、搪瓷锅或不锈钢锅,避免使用铁锅、铝锅,以免影响药效。\n\n2. **浸泡**:将药材放入锅内,加冷水浸泡30分钟,水量以高出药材2-3厘米为宜。\n\n3. **煎煮**:\n - 先用大火煮沸,然后改用小火煎煮25-30分钟\n - 倒出第一煎药液\n - 药渣再加水(水量稍减),煎煮20分钟,取第二煎药液\n - 将两次药液混合均匀,分2-3次服用\n\n4. **服用频率**:每日1剂,建议饭后半小时至1小时服用,以减少对胃的刺激。\n\n# 针灸治疗频率\n\n对于您这种慢性胃病,针灸治疗建议:\n- **初期**:每周2-3次,以快速缓解症状\n- **症状缓解后**:每周1-2次,巩固疗效\n- **巩固期**:每周1次或隔周1次\n- 一个疗程一般为10-15次,休息1周后可进行下一疗程\n\n# 预期治疗效果\n\n考虑到您病程较长(十多年),症状复杂,治疗效果需要分阶段看:\n- **急性症状**(如疼痛、反酸):可能在1-2周内有所缓解\n- **慢性症状**改善:需要1-3个月的持续治疗\n- **基本控制和恢复**:可能需要3-6个月甚至更长时间\n- 个体差异较大,效果因人而异,需要耐心坚持治疗\n\n# 饮食注意事项\n\n## 进食原则\n- **少量多餐**:每日5-6餐,每餐七分饱\n- **细嚼慢咽**:每口食物咀嚼20-30次\n- **温度适中**:避免过烫或过冷的食物\n- **定时定量**:养成规律进食习惯\n\n## 绝对禁忌食物\n1. **辛辣刺激食物**:辣椒、胡椒、芥末、咖喱等\n2. **油腻煎炸食物**:油条、炸鸡、薯条等\n3. **生冷寒凉食物**:冷饮、冰品、生冷瓜果等\n4. **过酸食物**:醋、酸菜、柠檬、酸味水果等\n5. **易产气食物**:豆类、洋葱、碳酸饮料、啤酒等\n6. **粗糙难消化食物**:粗粮、坚果、硬质食物等\n7. **刺激性饮品**:烟酒、浓茶、咖啡、巧克力等\n\n## 推荐食物\n- **主食**:软饭、面条、馒头、粥类\n- **蛋白质**:鱼肉、鸡肉、瘦肉、豆腐、鸡蛋\n- **蔬菜**:白菜、菠菜、胡萝卜、冬瓜、南瓜等易消化蔬菜\n- **水果**:苹果、香蕉、木瓜等温性水果\n- **调味**:少量姜、葱、蒜(熟用)\n\n# 便秘食疗方子\n\n针对您便秘严重的情况,推荐以下食疗方:\n\n## 简易食疗方\n1. **蜂蜜香油水**:蜂蜜1-2勺,香油少许,温开水冲服,每日早晨空腹饮用\n2. **芝麻糊**:黑芝麻研磨成粉,加开水调成糊状,可加适量蜂蜜\n3. **香蕉蜂蜜**:香蕉1-2根,蘸蜂蜜食用,早晨空腹效果佳\n4. **红薯粥**:红薯切块与大米同煮成粥,可加少量红枣\n\n## 养生食疗方\n1. **核桃芝麻糊**:核桃仁10克,黑芝麻15克,研磨成粉,加开水调成糊状\n2. **枸杞银耳羹**:枸杞10克,银耳15克,冰糖适量,煮成羹状\n3. **萝卜蜂蜜水**:白萝卜切片煮水,加少量蜂蜜调味\n4. **杏仁茶**:甜杏仁10克,研磨成粉,加开水冲调\n\n## 生活建议\n- 每天早晨起床后喝一杯温盐水或温蜂蜜水\n- 养成定时排便习惯,最好在早晨5-7点(大肠经当令时)\n- 每天顺时针按摩腹部100-200次,促进肠蠕动\n- 保持适量运动,如散步、慢跑等,每天30分钟以上\n\n以上建议需长期坚持,配合中药治疗和针灸调理,才能达到理想效果。同时,建议您定期复诊,根据病情变化调整治疗方案。\n</answer>"
}
]
},
部署与优化
模型部署策略
python
class GLM4Model:
def __init__(self):
self.device = "cuda" if torch.cuda.is_available() else "cpu"
self.models_dir = os.path.join(project_root, "models")
self.glm4_dir = os.path.join(self.models_dir, "GLM-4.1V-9B-Thinking")
self.lora_dir = os.path.join(self.models_dir, "lora")
def load_model_with_lora(self):
"""加载基础模型并应用LoRA适配器"""
# 加载基础模型
self.model = AutoModelForCausalLM.from_pretrained(
self.glm4_dir,
torch_dtype=torch.float16,
device_map="auto",
trust_remote_code=True
)
# 应用LoRA适配器
if os.path.exists(self.lora_dir):
self.model = PeftModel.from_pretrained(
self.model,
self.lora_dir
)
logger.info("✅ LoRA适配器加载成功")
性能优化措施
内存优化:
- 使用float16精度减少显存占用
- 动态设备映射自动分配GPU资源
推理加速:
- 流式生成提升响应速度
- 多线程处理避免界面阻塞
资源管理:
- 支持CPU/GPU自动切换
- 临时文件自动清理
系统集成
Web界面集成
python
# Gradio界面配置
demo = gr.Blocks(
title="岐黄智鉴 - 中医专病诊疗大模型",
theme=gr.themes.Soft(),
css=custom_css
)
with demo:
# 系统标题和说明
gr.HTML(header_html)
# 主要交互组件
chatbox = gr.Chatbot(label="🏥 中医诊疗对话", height=800)
textbox = gr.Textbox(label="症状描述", placeholder="...")
upload = gr.File(label="上传医学影像", file_count="multiple")
# 事件绑定
gr.on(
triggers=[send.click, textbox.submit],
fn=chat,
inputs=[upload, textbox, history, sys_prompt],
outputs=[chatbox, history, upload, textbox],
)
API服务接口
python
# FastAPI后端服务
app = FastAPI(title="岐黄智鉴API", version="1.0.0")
@app.post("/diagnose")
async def diagnose(request: DiagnoseRequest):
"""中医诊断接口"""
try:
response = model.generate_response(request.text)
return {
"response": response,
"success": True,
"model": "GLM-4.1V-LoRA"
}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
技术特色
1. 多模态能力
- 支持文本、图像、视频、PDF等多种输入
- 特别适合中医舌象、面诊图像分析
- 智能文件格式转换和处理
2. 实时交互
- 流式生成提供即时反馈
- Thinking模式展示推理过程
- 支持对话历史管理
3. 专业定制
- 基于真实中医案例微调
- 专业术语和诊疗流程优化
- 脾胃病专科特色
4. 部署友好
- 支持本地部署和云端服务
- 自动模型下载和缓存
- CPU/GPU自适应运行
实现价值
通过以上技术实现,岐黄智鉴系统成功构建了一个专业、高效、易用的中医智能诊疗平台,为中医现代化发展提供了有力的技术支撑。
技术亮点:本系统的核心价值在于将先进的多模态AI技术与传统中医理论相结合,实现了中医诊疗的智能化升级。