Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -47,43 +47,56 @@ def safe_model_call(prompt):
|
|
47 |
print(f"尝试调用模型,使用token长度: {len(hf_token)}")
|
48 |
print(f"使用的HF_ENDPOINT: {os.environ.get('HF_ENDPOINT', '默认')}")
|
49 |
|
50 |
-
#
|
51 |
try:
|
52 |
-
#
|
53 |
return client.text_generation(
|
54 |
prompt=prompt,
|
55 |
-
model="
|
56 |
-
max_new_tokens=
|
57 |
-
temperature=0.
|
58 |
repetition_penalty=1.2,
|
59 |
do_sample=True,
|
60 |
top_p=0.9
|
61 |
)
|
62 |
-
except Exception as
|
63 |
-
print(f"
|
64 |
print("尝试使用备用模型...")
|
65 |
|
66 |
-
#
|
67 |
try:
|
68 |
-
# 尝试使用Qwen模型(阿里开源的中文大模型)
|
69 |
return client.text_generation(
|
70 |
prompt=prompt,
|
71 |
-
model="
|
72 |
-
max_new_tokens=
|
73 |
-
temperature=0.
|
74 |
repetition_penalty=1.2
|
75 |
)
|
76 |
-
except Exception as
|
77 |
-
print(f"
|
78 |
|
79 |
-
#
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
87 |
except Exception as e:
|
88 |
error_type = type(e).__name__
|
89 |
error_msg = str(e)
|
@@ -106,17 +119,92 @@ def local_fallback_response(query):
|
|
106 |
"""当API调用失败时提供基本的本地响应"""
|
107 |
query = query.lower()
|
108 |
|
109 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
110 |
responses = {
|
111 |
-
"
|
112 |
-
|
113 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
114 |
"疫苗": "疫苗接种后出现接种部位疼痛、轻微发热是正常反应,通常会在几天内消失。如出现严重过敏反应或高烧,应立即就医。",
|
115 |
"感冒": "感冒通常会自行痊愈,建议多休息、多喝水、可使用非处方药缓解症状。如症状加重或持续一周以上,请咨询医生。",
|
116 |
"腹痛": "腹痛可能由多种原因引起,如消化不良、胃肠炎等。建议注意饮食、避免辛辣刺激食物。如果疼痛剧烈或伴随其他症状,请咨询医生。",
|
117 |
"失眠": "改善睡眠可以尝试规律作息、睡前避免使用电子设备、创造舒适的睡眠环境。长期失眠建议咨询医生。",
|
118 |
-
"过敏": "避免接触过敏原,可使用抗组胺药缓解症状。如果出现呼吸困难等严重症状,请立即就医。"
|
119 |
-
"三天": "症状持续三天以上,建议及时就医进行专业诊断和治疗。"
|
120 |
}
|
121 |
|
122 |
# 检查查询中是否包含关键词
|
@@ -125,12 +213,21 @@ def local_fallback_response(query):
|
|
125 |
return response
|
126 |
|
127 |
# 默认回复
|
128 |
-
return "您好,我是AI
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
129 |
|
130 |
def medical_chat(user_input, history):
|
131 |
-
#
|
132 |
system_prompt = """你是一位经验丰富的医生,专注于提供准确、客观、专业的医疗建议。
|
133 |
请根据患者描述的症状,提供科学的建议和可能的解决方案。
|
|
|
134 |
你的回答应该:
|
135 |
1. 基于医学事实和科学证据
|
136 |
2. 清晰、简洁但全面
|
@@ -138,8 +235,16 @@ def medical_chat(user_input, history):
|
|
138 |
4. 在必要时建议患者就医
|
139 |
5. 不做确定性的诊断,因为这需要面诊和检查
|
140 |
6. 不推荐具体的药品品牌
|
|
|
|
|
141 |
|
142 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
143 |
|
144 |
# 构建完整的提示词
|
145 |
prompt = f"{system_prompt}\n\n患者:{user_input}\n医生:"
|
@@ -184,9 +289,30 @@ def medical_chat(user_input, history):
|
|
184 |
|
185 |
print(f"处理后的响应: {doctor_response}")
|
186 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
187 |
# 检查响应质量
|
188 |
-
if len(doctor_response.strip()) <
|
189 |
-
print(f"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
190 |
return local_fallback_response(user_input)
|
191 |
|
192 |
# 如果响应中没有"医生:",则直接返回整个响应
|
|
|
47 |
print(f"尝试调用模型,使用token长度: {len(hf_token)}")
|
48 |
print(f"使用的HF_ENDPOINT: {os.environ.get('HF_ENDPOINT', '默认')}")
|
49 |
|
50 |
+
# 尝试使用专门针对医疗领域的模型
|
51 |
try:
|
52 |
+
# 首先尝试使用医疗领域的模型
|
53 |
return client.text_generation(
|
54 |
prompt=prompt,
|
55 |
+
model="epfl-llm/meditron-7b", # 医疗领域专用模型
|
56 |
+
max_new_tokens=300, # 增加输出长度
|
57 |
+
temperature=0.3, # 降低温度以获得更确定性的回答
|
58 |
repetition_penalty=1.2,
|
59 |
do_sample=True,
|
60 |
top_p=0.9
|
61 |
)
|
62 |
+
except Exception as meditron_error:
|
63 |
+
print(f"Meditron模型调用失败: {str(meditron_error)}")
|
64 |
print("尝试使用备用模型...")
|
65 |
|
66 |
+
# 尝试使用中文医疗模型
|
67 |
try:
|
|
|
68 |
return client.text_generation(
|
69 |
prompt=prompt,
|
70 |
+
model="IDEA-CCNL/Ziya-LLaMA-13B-v1", # 中文大模型
|
71 |
+
max_new_tokens=300,
|
72 |
+
temperature=0.3,
|
73 |
repetition_penalty=1.2
|
74 |
)
|
75 |
+
except Exception as ziya_error:
|
76 |
+
print(f"Ziya模型调用失败: {str(ziya_error)}")
|
77 |
|
78 |
+
# 尝试使用通用大模型
|
79 |
+
try:
|
80 |
+
return client.text_generation(
|
81 |
+
prompt=prompt,
|
82 |
+
model="bigscience/bloomz-7b1", # 多语言模型
|
83 |
+
max_new_tokens=300,
|
84 |
+
temperature=0.3,
|
85 |
+
repetition_penalty=1.2,
|
86 |
+
do_sample=True,
|
87 |
+
top_p=0.9
|
88 |
+
)
|
89 |
+
except Exception as bloomz_error:
|
90 |
+
print(f"BLOOMZ模型调用失败: {str(bloomz_error)}")
|
91 |
+
|
92 |
+
# 最后尝试使用小模型
|
93 |
+
return client.text_generation(
|
94 |
+
prompt=prompt,
|
95 |
+
model="bigscience/bloomz-1b7", # 最后备选
|
96 |
+
max_new_tokens=200,
|
97 |
+
temperature=0.5,
|
98 |
+
repetition_penalty=1.2
|
99 |
+
)
|
100 |
except Exception as e:
|
101 |
error_type = type(e).__name__
|
102 |
error_msg = str(e)
|
|
|
119 |
"""当API调用失败时提供基本的本地响应"""
|
120 |
query = query.lower()
|
121 |
|
122 |
+
# 详细的头痛响应
|
123 |
+
if "头痛" in query:
|
124 |
+
days_match = None
|
125 |
+
if "三天" in query or "3天" in query:
|
126 |
+
days_match = "三天"
|
127 |
+
elif "两天" in query or "2天" in query:
|
128 |
+
days_match = "两天"
|
129 |
+
elif "一天" in query or "1天" in query:
|
130 |
+
days_match = "一天"
|
131 |
+
|
132 |
+
response = f"""关于{'持续'+days_match+'的' if days_match else ''}头痛问题,我可以提供以下建议:
|
133 |
+
|
134 |
+
**可能的原因**:
|
135 |
+
- 紧张性头痛:由压力、焦虑或肌肉紧张引起
|
136 |
+
- 偏头痛:常伴有对光、声音敏感,有时伴随恶心
|
137 |
+
- 脱水:体内水分不足可导致头痛
|
138 |
+
- 睡眠不足或睡眠质量差
|
139 |
+
- 眼睛疲劳:长时间用眼或需要更新眼镜处方
|
140 |
+
- 感染:如感冒、流感或鼻窦感染
|
141 |
+
|
142 |
+
**建议措施**:
|
143 |
+
1. 休息:在安静、黑暗的房间休息
|
144 |
+
2. 水分补充:确保充分饮水
|
145 |
+
3. 热/冷敷:在疼痛部位使用热敷或冷敷
|
146 |
+
4. 按摩:轻轻按摩太阳穴或颈部
|
147 |
+
5. 非处方止痛药:如对乙酰氨基酚或布洛芬(请按说明使用)
|
148 |
+
6. 减轻压力:尝试放松技巧如深呼吸或冥想
|
149 |
+
|
150 |
+
**注意事项**:
|
151 |
+
- {'由于头痛已持续'+days_match+',建议咨询医生' if days_match else '如果头痛持续超过3天,应咨询医生'}
|
152 |
+
- 如果头痛非常剧烈、突然发作或伴随其他症状(如发热、颈部僵硬、视力问题、意识混乱),请立即就医
|
153 |
+
- 定期头痛需要专业医生评估
|
154 |
+
|
155 |
+
希望这些信息对您有所帮助。请记住,这只是一般性建议,不能替代专业医疗咨询。"""
|
156 |
+
return response
|
157 |
+
|
158 |
+
# 其他关键词匹配
|
159 |
responses = {
|
160 |
+
"发烧": """关于发热问题:
|
161 |
+
|
162 |
+
**可能的原因**:
|
163 |
+
- 感染(病毒、细菌)
|
164 |
+
- 免疫反应
|
165 |
+
- 疫苗接种后反应
|
166 |
+
- 其他炎症反应
|
167 |
+
|
168 |
+
**建议措施**:
|
169 |
+
1. 休息:保持充分休息
|
170 |
+
2. 水分补充:多喝水防止脱水
|
171 |
+
3. 降温:使用退热药物(如对乙酰氨基酚)
|
172 |
+
4. 轻便衣物:穿着轻便,避免过热
|
173 |
+
|
174 |
+
**注意事项**:
|
175 |
+
- 如果体温超过38.5°C,可以使用退烧药
|
176 |
+
- 高烧(39°C以上)或持续发热超过3天应就医
|
177 |
+
- 如果发热伴随严重症状(如呼吸困难、剧烈头痛、意识模糊),请立即就医
|
178 |
+
|
179 |
+
请记住,这只是一般性建议,不能替代专业医疗咨询。""",
|
180 |
+
|
181 |
+
"咳嗽": """关于咳嗽问题:
|
182 |
+
|
183 |
+
**可能的原因**:
|
184 |
+
- 上呼吸道感染(感冒、流感)
|
185 |
+
- 过敏
|
186 |
+
- 哮喘
|
187 |
+
- 胃酸反流
|
188 |
+
- 环境刺激物
|
189 |
+
|
190 |
+
**建议措施**:
|
191 |
+
1. 保持水分摄入:多喝温水
|
192 |
+
2. 使用蜂蜜柠檬水:可缓解喉咙刺激
|
193 |
+
3. 湿度:使用加湿器增加空气湿度
|
194 |
+
4. 非处方止咳药:根据咳嗽类型选择
|
195 |
+
|
196 |
+
**注意事项**:
|
197 |
+
- 如果咳嗽持续超过2周,应咨询医生
|
198 |
+
- 如果咳嗽伴有血痰、呼吸困难、高热或胸痛,请立即就医
|
199 |
+
- 夜间咳嗽加重或影响睡眠也需要医疗关注
|
200 |
+
|
201 |
+
请记住,这只是一般性建议,不能替代专业医疗咨询。""",
|
202 |
+
|
203 |
"疫苗": "疫苗接种后出现接种部位疼痛、轻微发热是正常反应,通常会在几天内消失。如出现严重过敏反应或高烧,应立即就医。",
|
204 |
"感冒": "感冒通常会自行痊愈,建议多休息、多喝水、可使用非处方药缓解症状。如症状加重或持续一周以上,请咨询医生。",
|
205 |
"腹痛": "腹痛可能由多种原因引起,如消化不良、胃肠炎等。建议注意饮食、避免辛辣刺激食物。如果疼痛剧烈或伴随其他症状,请咨询医生。",
|
206 |
"失眠": "改善睡眠可以尝试规律作息、睡前避免使用电子设备、创造舒适的睡眠环境。长期失眠建议咨询医生。",
|
207 |
+
"过敏": "避免接触过敏原,可使用抗组胺药缓解症状。如果出现呼吸困难等严重症状,请立即就医。"
|
|
|
208 |
}
|
209 |
|
210 |
# 检查查询中是否包含关键词
|
|
|
213 |
return response
|
214 |
|
215 |
# 默认回复
|
216 |
+
return """您好,我是AI医疗助手。我可以提供一些基本的健康建议,但不能替代专业医生的诊断。
|
217 |
+
|
218 |
+
为了给您提供更有针对性的建议,请尽量详细描述您的症状,包括:
|
219 |
+
- 症状的具体表现
|
220 |
+
- 持续时间
|
221 |
+
- 是否有加重或缓解因素
|
222 |
+
- 是否尝试过任何缓解方法
|
223 |
+
|
224 |
+
对于任何严重或持续的健康问题,建议您咨询专业医生获取准确诊断和治疗方案。"""
|
225 |
|
226 |
def medical_chat(user_input, history):
|
227 |
+
# 构建更详细的医学对话提示词,针对常见问题提供具体指导
|
228 |
system_prompt = """你是一位经验丰富的医生,专注于提供准确、客观、专业的医疗建议。
|
229 |
请根据患者描述的症状,提供科学的建议和可能的解决方案。
|
230 |
+
|
231 |
你的回答应该:
|
232 |
1. 基于医学事实和科学证据
|
233 |
2. 清晰、简洁但全面
|
|
|
235 |
4. 在必要时建议患者就医
|
236 |
5. 不做确定性的诊断,因为这需要面诊和检查
|
237 |
6. 不推荐具体的药品品牌
|
238 |
+
7. 不要说"给你开药",因为你不能开处方
|
239 |
+
8. 提供分析和建议,而不是简单的答复
|
240 |
|
241 |
+
对于头痛问题,你应该:
|
242 |
+
- 解释可能的原因(如压力、疲劳、脱水等)
|
243 |
+
- 建议一些自我缓解方法(如休息、按摩、保持水分摄入)
|
244 |
+
- 提醒患者如果症状持续或加重应该就医
|
245 |
+
- 不要简单地建议服药,而是提供全面的建议
|
246 |
+
|
247 |
+
请记住,你的建议仅供参考,不能替代专业医生的面诊。每个回答都应该包含症状分析、可能的原因、建议措施和注意事项。"""
|
248 |
|
249 |
# 构建完整的提示词
|
250 |
prompt = f"{system_prompt}\n\n患者:{user_input}\n医生:"
|
|
|
289 |
|
290 |
print(f"处理后的响应: {doctor_response}")
|
291 |
|
292 |
+
# 增强响应质量检测
|
293 |
+
low_quality_indicators = [
|
294 |
+
"没药", "不知道", "开点", "开药", "处方药", "非处方药",
|
295 |
+
"既然是", "那就", "我就给你", "吧", "呢", "哦", "呀",
|
296 |
+
"简单", "随便", "试试看", "看看", "应该没事"
|
297 |
+
]
|
298 |
+
|
299 |
# 检查响应质量
|
300 |
+
if len(doctor_response.strip()) < 50: # 增加最小长度要求
|
301 |
+
print(f"响应太短: '{doctor_response}',使用本地备用模式")
|
302 |
+
return local_fallback_response(user_input)
|
303 |
+
|
304 |
+
# 检查是否包含低质量指标
|
305 |
+
for indicator in low_quality_indicators:
|
306 |
+
if indicator in doctor_response:
|
307 |
+
print(f"响应包含低质量指标 '{indicator}': '{doctor_response}',使用本地备用模式")
|
308 |
+
return local_fallback_response(user_input)
|
309 |
+
|
310 |
+
# 检查是否包含足够的医疗建议内容
|
311 |
+
medical_advice_indicators = ["建议", "可以", "应该", "如果", "症状", "原因"]
|
312 |
+
has_medical_advice = any(indicator in doctor_response for indicator in medical_advice_indicators)
|
313 |
+
|
314 |
+
if not has_medical_advice:
|
315 |
+
print(f"响应缺乏医疗建议: '{doctor_response}',使用本地备用模式")
|
316 |
return local_fallback_response(user_input)
|
317 |
|
318 |
# 如果响应中没有"医生:",则直接返回整个响应
|