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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +109 -38
app.py CHANGED
@@ -47,53 +47,52 @@ 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="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
  )
@@ -119,6 +118,71 @@ def local_fallback_response(query):
119
  """当API调用失败时提供基本的本地响应"""
120
  query = query.lower()
121
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
122
  # 详细的头痛响应
123
  if "头痛" in query:
124
  days_match = None
@@ -203,7 +267,6 @@ def local_fallback_response(query):
203
  "疫苗": "疫苗接种后出现接种部位疼痛、轻微发热是正常反应,通常会在几天内消失。如出现严重过敏反应或高烧,应立即就医。",
204
  "感冒": "感冒通常会自行痊愈,建议多休息、多喝水、可使用非处方药缓解症状。如症状加重或持续一周以上,请咨询医生。",
205
  "腹痛": "腹痛可能由多种原因引起,如消化不良、胃肠炎等。建议注意饮食、避免辛辣刺激食物。如果疼痛剧烈或伴随其他症状,请咨询医生。",
206
- "失眠": "改善睡眠可以尝试规律作息、睡前避免使用电子设备、创造舒适的睡眠环境。长期失眠建议咨询医生。",
207
  "过敏": "避免接触过敏原,可使用抗组胺药缓解症状。如果出现呼吸困难等严重症状,请立即就医。"
208
  }
209
 
@@ -224,27 +287,35 @@ def local_fallback_response(query):
224
  对于任何严重或持续的健康问题,建议您咨询专业医生获取准确诊断和治疗方案。"""
225
 
226
  def medical_chat(user_input, history):
227
- # 构建更详细的医学对话提示词,针对常见问题提供具体指导
228
- system_prompt = """你是一位经验丰富的医生,专注于提供准确、客观、专业的医疗建议。
229
  请根据患者描述的症状,提供科学的建议和可能的解决方案。
230
 
231
  你的回答应该:
232
  1. 基于医学事实和科学证据
233
- 2. 清晰、简洁但全面
234
- 3. 避免使用过于专业的术语
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医生:"
@@ -297,7 +368,7 @@ def medical_chat(user_input, history):
297
  ]
298
 
299
  # 检查响应质量
300
- if len(doctor_response.strip()) < 50: # 增加最小长度要求
301
  print(f"响应太短: '{doctor_response}',使用本地备用模式")
302
  return local_fallback_response(user_input)
303
 
@@ -308,7 +379,7 @@ def medical_chat(user_input, history):
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:
 
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="meta-llama/Llama-2-70b-chat-hf", # 强大的通用大模型
56
+ max_new_tokens=500, # 增加输出长度
57
+ temperature=0.7, # 适中的温度,平衡创造性和准确性
58
+ repetition_penalty=1.1,
59
  do_sample=True,
60
  top_p=0.9
61
  )
62
+ except Exception as llama_error:
63
+ print(f"Llama模型调用失败: {str(llama_error)}")
 
64
 
65
+ # 尝试使用另一个通用大模型
66
  try:
67
  return client.text_generation(
68
  prompt=prompt,
69
+ model="Qwen/Qwen-72B-Chat", # 阿里的大模型,支持中文
70
+ max_new_tokens=500,
71
+ temperature=0.7,
72
+ repetition_penalty=1.1
73
  )
74
+ except Exception as qwen_error:
75
+ print(f"Qwen模型调用失败: {str(qwen_error)}")
76
 
77
+ # 尝试使用医疗专业模型
78
  try:
79
  return client.text_generation(
80
  prompt=prompt,
81
+ model="epfl-llm/meditron-7b", # 医疗领域专用模型
82
  max_new_tokens=300,
83
  temperature=0.3,
84
  repetition_penalty=1.2,
85
  do_sample=True,
86
  top_p=0.9
87
  )
88
+ except Exception as meditron_error:
89
+ print(f"Meditron模型调用失败: {str(meditron_error)}")
90
 
91
  # 最后尝试使用小模型
92
  return client.text_generation(
93
  prompt=prompt,
94
+ model="bigscience/bloomz-7b1", # 备选
95
+ max_new_tokens=300,
96
  temperature=0.5,
97
  repetition_penalty=1.2
98
  )
 
118
  """当API调用失败时提供基本的本地响应"""
119
  query = query.lower()
120
 
121
+ # 详细的失眠响应
122
+ if "失眠" in query or "睡不着" in query or "睡眠" in query:
123
+ days_match = None
124
+ if "三天" in query or "3天" in query:
125
+ days_match = "三天"
126
+ elif "两天" in query or "2天" in query:
127
+ days_match = "两天"
128
+ elif "一周" in query or "7天" in query:
129
+ days_match = "一周"
130
+ elif "长期" in query or "慢性" in query:
131
+ days_match = "长期"
132
+
133
+ response = f"""关于{'持续'+days_match+'的' if days_match else ''}失眠问题,我可以提供以下专业建议:
134
+
135
+ **症状分析**:
136
+ 失眠是指难以入睡、维持睡眠困难、早醒或睡眠质量差的情况。{'连续'+days_match+'的失眠可能会导致白天疲劳、注意力不集中、情绪波动等问题。' if days_match else '失眠会导致白天疲劳、注意力不集中、情绪波动等问题。'}
137
+
138
+ **可能的原因**:
139
+ 1. 心理因素:压力、焦虑、抑郁或其他情绪问题
140
+ 2. 生活习惯:不规律的睡眠时间、白天小睡过多
141
+ 3. 环境因素:噪音、光线、温度不适宜
142
+ 4. 电子设备使用:睡前使用手机、电脑等发光设备
143
+ 5. 饮食因素:睡前摄入咖啡因、酒精或大量食物
144
+ 6. 身体不适:疼痛、呼吸问题或其他身体不适
145
+
146
+ **建议措施**:
147
+ 1. **建立规律的睡眠时间表**:
148
+ - 每天同一时间上床和起床,包括周末
149
+ - 避免白天长时间小睡,如需小睡,控制在30分钟以内
150
+
151
+ 2. **优化睡眠环境**:
152
+ - 保持卧室安静、黑暗和凉爽
153
+ - 使用舒适的床垫和枕头
154
+ - 考虑使用白噪音机器或耳塞来屏蔽干扰噪音
155
+
156
+ 3. **改善睡前习惯**:
157
+ - 睡前1-2小时避免使用电子设备
158
+ - 建立放松的睡前仪式,如温水浴、阅读、冥想或轻柔的伸展运动
159
+ - 避免睡前进行激烈运动或处理紧张事务
160
+
161
+ 4. **注意饮食**:
162
+ - 睡前4-6小时避免摄入咖啡因
163
+ - 睡前避免大量饮水,减少夜间起床
164
+ - 睡前避免大量或重口味食物
165
+ - 限制酒精摄入,虽然酒精可能帮助入睡,但会影响睡眠质量
166
+
167
+ 5. **放松技巧**:
168
+ - 尝试深呼吸练习:吸气4秒,屏息7秒,呼气8秒
169
+ - 渐进性肌肉放松:依次绷紧然后放松身体各部位肌肉
170
+ - 引导冥想或正念练习
171
+
172
+ **何时就医**:
173
+ - {'由于失眠已持续'+days_match+',建议咨询医生,特别是如果它影响了您的日常生活和工作' if days_match else '如果失眠持续超过两周,或严重影响日常生活,应咨询医生'}
174
+ - 如果失眠伴随其他症状,如呼吸暂停、剧烈打鼾、夜间出汗、心悸等
175
+ - 如果您怀疑失眠可能与其他健康问题或药物副作用有关
176
+
177
+ **预防建议**:
178
+ - 保持规律的体育锻炼,但避免睡前3小时内进行
179
+ - 管理日间压力,可以通过冥想、瑜伽或其他放松技巧
180
+ - 限制白天的咖啡因摄入
181
+ - 保持健康的生活方式和饮食习惯
182
+
183
+ 希望这些信息对您有所帮助。请记住,这只是一般性建议,不能替代专业医疗咨询。如果失眠问题持续或严重,建议咨询医生或睡眠专家。"""
184
+ return response
185
+
186
  # 详细的头痛响应
187
  if "头痛" in query:
188
  days_match = None
 
267
  "疫苗": "疫苗接种后出现接种部位疼痛、轻微发热是正常反应,通常会在几天内消失。如出现严重过敏反应或高烧,应立即就医。",
268
  "感冒": "感冒通常会自行痊愈,建议多休息、多喝水、可使用非处方药缓解症状。如症状加重或持续一周以上,请咨询医生。",
269
  "腹痛": "腹痛可能由多种原因引起,如消化不良、胃肠炎等。建议注意饮食、避免辛辣刺激食物。如果疼痛剧烈或伴随其他症状,请咨询医生。",
 
270
  "过敏": "避免接触过敏原,可使用抗组胺药缓解症状。如果出现呼吸困难等严重症状,请立即就医。"
271
  }
272
 
 
287
  对于任何严重或持续的健康问题,建议您咨询专业医生获取准确诊断和治疗方案。"""
288
 
289
  def medical_chat(user_input, history):
290
+ # 构建更详细的医学对话提示词,针对通用大模型进行优化
291
+ system_prompt = """你是一位经验丰富的医生,专注于提供准确、客观、专业且详细的医疗建议。
292
  请根据患者描述的症状,提供科学的建议和可能的解决方案。
293
 
294
  你的回答应该:
295
  1. 基于医学事实和科学证据
296
+ 2. 详细全面,包含充分的解释和建议
297
+ 3. 使用通俗易懂的语言,避免过于专业的术语
298
  4. 在必要时建议患者就医
299
  5. 不做确定性的诊断,因为这需要面诊和检查
300
  6. 不推荐具体的药品品牌
301
  7. 不要说"给你开药",因为你不能开处方
302
+ 8. 提供深入的分析和多方面的建议,而不是简单的答复
303
+
304
+ 回答结构应包含:
305
+ - 症状分析:解释患者描述的症状可能意味着什么
306
+ - 可能的原因:列出几种可能导致这些症状的常见原因
307
+ - 建议措施:提供3-5个具体的自我管理建议
308
+ - 何时就医:明确说明在什么情况下患者应该寻求专业医疗帮助
309
+ - 预防建议:如何预防类似问题再次发生
310
+
311
+ 对于失眠问题,你应该:
312
+ - 解释���期和长期失眠的区别
313
+ - 分析可能的原因(如压力、焦虑、生活习惯、环境因素等)
314
+ - 提供详细的睡眠卫生建议
315
+ - 建议非药物干预方法(如放松技巧、认知行为疗法等)
316
+ - 说明何时应该寻求专业帮助
317
+
318
+ 请记住,你的建议仅供参考,不能替代专业医生的面诊。每个回答都应该全面、详细、有条理,就像一位真正的医生会提供的那种深入建议。"""
319
 
320
  # 构建完整的提示词
321
  prompt = f"{system_prompt}\n\n患者:{user_input}\n医生:"
 
368
  ]
369
 
370
  # 检查响应质量
371
+ if len(doctor_response.strip()) < 100: # 增加最小长度要求
372
  print(f"响应太短: '{doctor_response}',使用本地备用模式")
373
  return local_fallback_response(user_input)
374
 
 
379
  return local_fallback_response(user_input)
380
 
381
  # 检查是否包含足够的医疗建议内容
382
+ medical_advice_indicators = ["建议", "可以", "应该", "如果", "症状", "原因", "方法", "帮助", "改善"]
383
  has_medical_advice = any(indicator in doctor_response for indicator in medical_advice_indicators)
384
 
385
  if not has_medical_advice: