hermi612 commited on
Commit
03251c6
·
verified ·
1 Parent(s): d56127e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +159 -33
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
- # 首先尝试BLOOMZ-7B1模型(支持中文且参数量更大)
53
  return client.text_generation(
54
  prompt=prompt,
55
- model="bigscience/bloomz-7b1", # 更大的多语言模型
56
- max_new_tokens=200,
57
- temperature=0.5, # 降低温度以获得更确定性的回答
58
  repetition_penalty=1.2,
59
  do_sample=True,
60
  top_p=0.9
61
  )
62
- except Exception as model_error:
63
- print(f"首选模型调用失败: {str(model_error)}")
64
  print("尝试使用备用模型...")
65
 
66
- # 尝试使用备用模型
67
  try:
68
- # 尝试使用Qwen模型(阿里开源的中文大模型)
69
  return client.text_generation(
70
  prompt=prompt,
71
- model="Qwen/Qwen-7B", # 备用中文模型
72
- max_new_tokens=200,
73
- temperature=0.5,
74
  repetition_penalty=1.2
75
  )
76
- except Exception as qwen_error:
77
- print(f"Qwen模型调用失败: {str(qwen_error)}")
78
 
79
- # 最后尝试使用BLOOMZ-1B7
80
- return client.text_generation(
81
- prompt=prompt,
82
- model="bigscience/bloomz-1b7", # 最后备选
83
- max_new_tokens=200,
84
- temperature=0.5,
85
- repetition_penalty=1.2
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
- "发烧": "发热是身体对抗感染的自然反应。轻度发热可多喝水、休息。如果体温超过38.5°C,可以使用退烧药。高烧或持续发热超过3天应就医。",
113
- "咳嗽": "咳嗽可能是由感冒、过敏或其他呼吸道问题引起。保持水分摄入,可使用非处方止咳药。如果咳嗽持续超过2周或伴有血痰,请咨询医生。",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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()) < 10 or "没药" in doctor_response or "不知道" in doctor_response:
189
- print(f"响应质量不佳: '{doctor_response}',使用本地备用模式")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
  # 如果响应中没有"医生:",则直接返回整个响应