基于腾讯云HAI + DeepSeek 快速开发中医辅助问诊系统
书接上文
在上一篇文章,我们体验了腾讯云HAI + DeepSeek +腾讯云AI代码助手 :零门槛打造AI代码审计环境,通过将DeepSeek模型部署在腾讯云HAI上,用户不仅可以绕过官网访问限制,还能够利用腾讯云的强大算力来运行复杂的AI模型,如DeepSeek-R1 14B,极大地提升了工作效率并降低了成本。
这里,我们继续探索DeepSeek的强大代码能力,基于腾讯云HAI + DeepSeek 快速开发了一个中医辅助问诊系统,旨在帮助中医医生更高效、快速、准确地进行诊断和开药。
基于腾讯云HAI + DeepSeek 快速开发中医辅助问诊系统
在此,对于DeepSeek部署的过程就不过多赘述了,详细可参见我上面的文章,下面主要进行中医辅助问诊系统的开发实践环节。
系统设计
目前计划的是做出第一版的demo,提供给朋友辅助开药使用,所以暂时不需要数据库等等,主打的就是一个简化流程,确保医生能够通过最最简单的步骤快速输入患者症状,并即时获得诊断建议与治疗方案。
系统实现
前端界面实现
我们直接使用Deepseek来全程进行开发,我的想法是给一个输入框用于填写综合病症,给一些选择题用来帮助协助判断,当用户或者医生填写完提交之后,可以调用Deepseek的API来进行反馈一系列治疗建议。
首先给出Prompt如下:
请生成一套中医问诊系统,要求包含自述部分,其余部分可以用选择题的形式展示出来,然后再把这套系统生成html代码,当用户填写完整之后,可以调用Deepseek的api来对用户的回答进行综合分析,最终给出一段中医诊断及对应治疗方案。
Deepseek的最大优点就是其内置了思维链,我们可以清晰的看到它的推断过程:
在生成代码完毕后,我们可以看到右下角的【运行按钮】,点击即可在线进行查看。
基础框架还不错,但下面的辅助选项还是太少了,所以我们继续优化界面。
给出Prompt如下:
请你思考,平常中医的正常诊断除了查看脉诊信息、舌苔特征还需要诊断哪些内容?请你都作为选择题选项继续给出,并在原有的代码上进行优化完善。
优化后界面如下:
开头的输入框作为主诉,主要是让医生或者病人填入自己的主要症状。
分为望闻问切四个角度,每个角度下将常见的特征一一列出。
现在看上去差不多了,已经够用了,下面我们使用Python Flask框架来运行这个Web应用,为了足够新手,这里还是从基础环境开始讲起。
安装 Python 和 pip
首先,确保你的电脑上已安装 Python 3.6 或更高版本。可以通过以下命令检查 Python 版本:
python3 --version
如果未安装 Python,请从 Python 官方网站 下载并安装。
创建虚拟环境
为了避免依赖冲突,建议在虚拟环境中进行开发。使用以下命令创建并激活虚拟环境:
python3 -m venv smart_tcm_diagnosis
source smart_tcm_diagnosis/bin/activate # Linux/macOS
smart_tcm_diagnosis\Scripts\activate # Windows
安装依赖库
在虚拟环境中,使用 pip 安装所需的 Python 库:
pip install flask requests
- flask: Web 框架
- requests: 用于发送 HTTP 请求,调用 DeepSeek API
创建项目结构
app.py代码
from flask import Flask, request, render_template
import requests
import os
from dotenv import load_dotenv
# 加载环境变量
load_dotenv()
app = Flask(__name__)
# DeepSeek API 配置
DEEPSEEK_API_URL = "https://api.deepseek.com/chat/completions" # 根据实际情况调整API地址
API_KEY = os.getenv("DEEPSEEK_API_KEY") # 从 .env 文件中读取 API 密钥
@app.route("/", methods=["GET", "POST"])
def index():
formData = {
'selfReport': '',
'medicalHistory': '',
'faceColor': '',
'tongueColor': '',
'tongueCoating': '',
'eyeLook': '',
'voiceQuality': '',
'breathSound': '',
'dietHabit': '',
'sleepQuality': '',
'moodStatus': '',
'bowelMovement': '',
'pulse': ''
}
chat_response = ""
if request.method == "POST":
# 获取用户输入并更新 formData
formData.update(request.form)
print("FormData:", formData)
# 构建请求消息
messageContent = f"""
你是一个资深中医专家,请根据以下问诊信息进行综合分析:
【主诉】{formData['selfReport']}
【既往史】{formData['medicalHistory']}
【面诊】面色{formData['faceColor']},眼神{formData['eyeLook']}
【闻诊】声音{formData['voiceQuality']},呼吸声{formData['breathSound']}
【问诊】饮食习惯{formData['dietHabit']},睡眠质量{formData['sleepQuality']},情绪状态{formData['moodStatus']},排泄情况{formData['bowelMovement']}
【舌诊】舌质{formData['tongueColor']},苔{formData['tongueCoating']}
【脉诊】脉{formData['pulse']}
请给出:1.中医辨证 2.治疗原则 3.方药建议 4.生活调养建议
"""
# 调用 DeepSeek API
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
data = {
"model": "deepseek-chat",
"messages": [
{"role": "system", "content": "你是一个资深中医专家。"},
{"role": "user", "content": messageContent}
],
"stream": False
}
print("Request Body:", data)
response = requests.post(DEEPSEEK_API_URL, headers=headers, json=data)
# 解析 API 响应
if response.status_code == 200:
api_response = response.json()
chat_response = api_response["choices"][0]["message"]["content"]
else:
chat_response = f"Error: Unable to get response from DeepSeek API. Status Code: {response.status_code}, Message: {response.text}"
return render_template("index.html", formData=formData, chat_response=chat_response)
if __name__ == "__main__":
app.run(debug=True)
templates/index.html 文件
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>智能中医问诊系统</title>
<style>
body { max-width: 800px; margin: 20px auto; padding: 20px; font-family: '微软雅黑'; }
.section { margin-bottom: 30px; border-bottom: 1px solid #ddd; padding-bottom: 20px; }
label { display: block; margin: 10px 0; }
textarea { width: 100%; height: 100px; }
button { padding: 10px 20px; background: #2b7a78; color: white; border: none; border-radius: 5px; }
#result { display: none; margin-top: 30px; padding: 20px; background: #f0f4f5; border: 1px solid #ccc; }
#result h3 { margin-top: 0; }
</style>
</head>
<body>
<h1>智能中医问诊系统</h1>
<form method="POST">
<div class="section">
<h3>自述症状</h3>
<textarea id="selfReport" name="selfReport" placeholder="请详细描述您的主要症状、持续时间及变化情况...">{{ formData.selfReport }}</textarea>
</div>
<div class="section">
<h3>病史信息</h3>
<label>既往病史:
<input type="radio" name="medicalHistory" value="无" {% if formData.medicalHistory == '无' %}checked{% endif %}> 无重大疾病史
<input type="radio" name="medicalHistory" value="高血压" {% if formData.medicalHistory == '高血压' %}checked{% endif %}> 高血压
<input type="radio" name="medicalHistory" value="糖尿病" {% if formData.medicalHistory == '糖尿病' %}checked{% endif %}> 糖尿病
<input type="radio" name="medicalHistory" value="心脏病" {% if formData.medicalHistory == '心脏病' %}checked{% endif %}> 心脏病
</label>
</div>
<div class="section">
<h3>望诊</h3>
<label>面色特征:
<input type="radio" name="faceColor" value="红润" {% if formData.faceColor == '红润' %}checked{% endif %}> 红润
<input type="radio" name="faceColor" value="苍白" {% if formData.faceColor == '苍白' %}checked{% endif %}> 苍白
<input type="radio" name="faceColor" value="青黑" {% if formData.faceColor == '青黑' %}checked{% endif %}> 青黑
<input type="radio" name="faceColor" value="黄疸" {% if formData.faceColor == '黄疸' %}checked{% endif %}> 黄疸
</label>
<label>舌质颜色:
<input type="radio" name="tongueColor" value="淡红" {% if formData.tongueColor == '淡红' %}checked{% endif %}> 淡红
<input type="radio" name="tongueColor" value="红" {% if formData.tongueColor == '红' %}checked{% endif %}> 红
<input type="radio" name="tongueColor" value="紫暗" {% if formData.tongueColor == '紫暗' %}checked{% endif %}> 紫暗
</label>
<label>舌苔特征:
<input type="radio" name="tongueCoating" value="薄白" {% if formData.tongueCoating == '薄白' %}checked{% endif %}> 薄白
<input type="radio" name="tongueCoating" value="黄腻" {% if formData.tongueCoating == '黄腻' %}checked{% endif %}> 黄腻
<input type="radio" name="tongueCoating" value="白厚" {% if formData.tongueCoating == '白厚' %}checked{% endif %}> 白厚
<input type="radio" name="tongueCoating" value="少苔" {% if formData.tongueCoating == '少苔' %}checked{% endif %}> 少苔
</label>
<label>眼神特征:
<input type="radio" name="eyeLook" value="明亮" {% if formData.eyeLook == '明亮' %}checked{% endif %}> 明亮
<input type="radio" name="eyeLook" value="晦暗" {% if formData.eyeLook == '晦暗' %}checked{% endif %}> 晦暗
<input type="radio" name="eyeLook" value="干涩" {% if formData.eyeLook == '干涩' %}checked{% endif %}> 干涩
</label>
</div>
<div class="section">
<h3>闻诊</h3>
<label>声音特征:
<input type="radio" name="voiceQuality" value="清晰" {% if formData.voiceQuality == '清晰' %}checked{% endif %}> 清晰
<input type="radio" name="voiceQuality" value="嘶哑" {% if formData.voiceQuality == '嘶哑' %}checked{% endif %}> 嘲哑
<input type="radio" name="voiceQuality" value="低沉" {% if formData.voiceQuality == '低沉' %}checked{% endif %}> 低沉
<input type="radio" name="voiceQuality" value="急促" {% if formData.voiceQuality == '急促' %}checked{% endif %}> 急促
</label>
<label>呼吸声特征:
<input type="radio" name="breathSound" value="均匀" {% if formData.breathSound == '均匀' %}checked{% endif %}> 均匀
<input type="radio" name="breathSound" value="粗重" {% if formData.breathSound == '粗重' %}checked{% endif %}> 粗重
<input type="radio" name="breathSound" value="短促" {% if formData.breathSound == '短促' %}checked{% endif %}> 短促
</label>
</div>
<div class="section">
<h3>问诊</h3>
<label>饮食习惯:
<input type="radio" name="dietHabit" value="正常" {% if formData.dietHabit == '正常' %}checked{% endif %}> 正常
<input type="radio" name="dietHabit" value="偏食" {% if formData.dietHabit == '偏食' %}checked{% endif %}> 偏食
<input type="radio" name="dietHabit" value="过量" {% if formData.dietHabit == '过量' %}checked{% endif %}> 过量
<input type="radio" name="dietHabit" value="不足" {% if formData.dietHabit == '不足' %}checked{% endif %}> 不足
</label>
<label>睡眠质量:
<input type="radio" name="sleepQuality" value="良好" {% if formData.sleepQuality == '良好' %}checked{% endif %}> 良好
<input type="radio" name="sleepQuality" value="失眠" {% if formData.sleepQuality == '失眠' %}checked{% endif %}> 失眠
<input type="radio" name="sleepQuality" value="多梦" {% if formData.sleepQuality == '多梦' %}checked{% endif %}> 多梦
</label>
<label>情绪状态:
<input type="radio" name="moodStatus" value="稳定" {% if formData.moodStatus == '稳定' %}checked{% endif %}> 稳定
<input type="radio" name="moodStatus" value="焦虑" {% if formData.moodStatus == '焦虑' %}checked{% endif %}> 焦虑
<input type="radio" name="moodStatus" value="抑郁" {% if formData.moodStatus == '抑郁' %}checked{% endif %}> 抑郁
</label>
<label>排泄情况:
<input type="radio" name="bowelMovement" value="正常" {% if formData.bowelMovement == '正常' %}checked{% endif %}> 正常
<input type="radio" name="bowelMovement" value="便秘" {% if formData.bowelMovement == '便秘' %}checked{% endif %}> 便秘
<input type="radio" name="bowelMovement" value="腹泻" {% if formData.bowelMovement == '腹泻' %}checked{% endif %}> 腹泻
</label>
</div>
<div class="section">
<h3>切诊</h3>
<label>脉象特征:
<input type="radio" name="pulse" value="弦" {% if formData.pulse == '弦' %}checked{% endif %}> 弦
<input type="radio" name="pulse" value="滑" {% if formData.pulse == '滑' %}checked{% endif %}> 滑
<input type="radio" name="pulse" value="细" {% if formData.pulse == '细' %}checked{% endif %}> 细
<input type="radio" name="pulse" value="数" {% if formData.pulse == '数' %}checked{% endif %}> 数
</label>
</div>
<button type="submit">提交诊断</button>
</form>
{% if chat_response %}
<h2>DeepSeek 回复:</h2>
<p>{{ chat_response|safe }}</p>
{% endif %}
</body>
</html>
.env 文件(存放key)
DEEPSEEK_API_KEY=填入你的密钥
当以上准备工作完成后,直接执行如下命令启动:
python app.py
在本地打开浏览器并访问 http://127.0.0.1:5000/,能够看到智能中医问诊系统的界面,提交表单后会显示用户的输入和 DeepSeek API 的回复。
总结
通过上述步骤,我们已经完成了基于腾讯云HAI + DeepSeek的中医辅助问诊系统的初步开发工作。这个系统不仅能够帮助医生快速收集患者的病情信息,还能利用先进的AI技术提供诊断建议,为中医诊疗提供了新的思路和技术手段。
当然,这只是一个起点,未来还有许多可以改进和扩展的地方,比如增加更多的诊断参数、完善用户界面、提高诊断准确率等。希望这个项目能激发更多关于如何将人工智能应用于传统医学领域的思考和实践。让我们共同期待,在不久的将来,这样的智能系统能够真正助力于医疗服务,造福更多的患者。