Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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="
|
56 |
-
max_new_tokens=
|
57 |
-
temperature=0.
|
58 |
-
repetition_penalty=1.
|
59 |
do_sample=True,
|
60 |
top_p=0.9
|
61 |
)
|
62 |
-
except Exception as
|
63 |
-
print(f"
|
64 |
-
print("尝试使用备用模型...")
|
65 |
|
66 |
-
#
|
67 |
try:
|
68 |
return client.text_generation(
|
69 |
prompt=prompt,
|
70 |
-
model="
|
71 |
-
max_new_tokens=
|
72 |
-
temperature=0.
|
73 |
-
repetition_penalty=1.
|
74 |
)
|
75 |
-
except Exception as
|
76 |
-
print(f"
|
77 |
|
78 |
-
#
|
79 |
try:
|
80 |
return client.text_generation(
|
81 |
prompt=prompt,
|
82 |
-
model="
|
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
|
90 |
-
print(f"
|
91 |
|
92 |
# 最后尝试使用小模型
|
93 |
return client.text_generation(
|
94 |
prompt=prompt,
|
95 |
-
model="bigscience/bloomz-
|
96 |
-
max_new_tokens=
|
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()) <
|
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:
|