my-gradio-app / agents /specialized /mental_health_agent.py
Nguyen Trong Lap
Recreate history without binary blobs
eeb0f9c
"""
Mental Health Agent - Specialized agent for mental health support
"""
from config.settings import client, MODEL
from health_data import HealthContext
from personalization import PersonalizationEngine
from rag.rag_integration import get_rag_integration
from agents.core.base_agent import BaseAgent
from agents.core.context_analyzer import ContextAnalyzer
from agents.core.response_validator import ResponseValidator
from datetime import datetime
class MentalHealthAgent(BaseAgent):
def __init__(self, memory=None):
super().__init__(memory)
self.health_context = None
self.personalization = None
self.rag = get_rag_integration()
# Configure handoff triggers for mental health agent
self.handoff_triggers = {
'symptom_agent': ['đau đầu', 'mất ngủ kéo dài', 'tim đập nhanh'],
'nutrition_agent': ['ăn uống', 'chán ăn', 'ăn vô độ'],
'exercise_agent': ['tập thể dục', 'yoga', 'thiền'],
'general_health_agent': ['thuốc', 'bác sĩ tâm lý', 'điều trị']
}
self.system_prompt = """Bạn là nhà tâm lý trị liệu chuyên nghiệp, ấm áp và thấu hiểu.
🧠 CHUYÊN MÔN:
- Hỗ trợ stress, lo âu, trầm cảm
- Tư vấn burnout, mất ngủ
- Kỹ thuật thư giãn, mindfulness
- Quản lý cảm xúc
- Cải thiện giấc ngủ
🎯 CÁCH TƯ VẤN:
- Lắng nghe, thấu hiểu, không phán xét
- Validate cảm xúc: "Cảm giác của bạn là hợp lý"
- Normalize: "Nhiều người cũng trải qua điều này"
- Đưa ra kỹ thuật cụ thể (breathing, journaling...)
- Khuyến khích tìm kiếm sự hỗ trợ
🚨 RED FLAGS - Khuyên gặp chuyên gia NGAY:
- Ý định tự tử hoặc tự gây thương tích
- Ý định gây hại người khác
- Ảo giác, hoang tưởng
- Trầm cảm nặng không thể hoạt động
- Nghiện rượu, ma túy
⚠️ AN TOÀN:
- KHÔNG chẩn đoán bệnh tâm thần
- KHÔNG kê đơn thuốc
- Luôn khuyên gặp chuyên gia với vấn đề nghiêm trọng
- Cung cấp hotline khủng hoảng khi cần
💬 PHONG CÁCH:
- Ấm áp, đồng cảm 💙
- Kiên nhẫn, không vội vàng
- Tôn trọng, không phán xét
- Trấn an nhưng thực tế
- Khuyến khích, động viên"""
def set_health_context(self, health_context: HealthContext):
"""Inject health context and initialize personalization engine"""
self.health_context = health_context
self.personalization = PersonalizationEngine(health_context)
def handle(self, parameters, chat_history=None):
"""
Handle mental health support request
Args:
parameters (dict): {
"user_query": str,
"context": dict (optional)
}
chat_history (list): Conversation history
Returns:
str: Response message
"""
user_query = parameters.get("user_query", "")
context = parameters.get("context", {})
# Check for crisis situations first
crisis_response = self._check_crisis(user_query, chat_history)
if crisis_response:
# Persist crisis alert
if self.health_context:
self.health_context.add_health_record('mental_health', {
'query': user_query,
'type': 'crisis_alert',
'response': crisis_response,
'timestamp': datetime.now().isoformat()
})
return crisis_response
# Provide mental health support
response = self._provide_support(user_query, context, chat_history)
# Adapt communication style using personalization
if self.personalization:
preferences = self.health_context.get_preferences() if self.health_context else None
if preferences:
adapted_response = self.personalization.adapt_communication_style(response)
else:
adapted_response = response
else:
adapted_response = response
# Persist mental health data
if self.health_context:
self.health_context.add_health_record('mental_health', {
'query': user_query,
'response': adapted_response,
'context': context,
'timestamp': datetime.now().isoformat()
})
return adapted_response
def _check_crisis(self, user_query, chat_history):
"""Check for mental health crisis situations"""
all_text = user_query.lower()
if chat_history:
all_text += " " + " ".join([msg[0].lower() for msg in chat_history if msg[0]])
# Suicide risk
suicide_keywords = ["tự tử", "muốn chết", "kết thúc cuộc đời", "không muốn sống",
"suicide", "kill myself", "end my life"]
if any(keyword in all_text for keyword in suicide_keywords):
return """🚨 **KHẨN CẤP - BẠN KHÔNG CÔ ĐƠN**
Mình rất lo lắng về bạn. Những suy nghĩ này rất nghiêm trọng và bạn cần được hỗ trợ ngay.
🆘 **HÃY LIÊN HỆ NGAY:**
**Đường dây nóng tâm lý:**
- 📞 **115** - Cấp cứu y tế (Trung tâm Cấp cứu 115 TP.HCM)
- 📞 **1900 1267** - Chuyên gia tâm thần (Bệnh viện Tâm Thần TP.HCM)
- 📞 **0909 65 80 35** - Tư vấn tâm lý miễn phí (Chăm sóc sức khỏe Việt - Davipharm)
**Hoặc:**
- Nói chuyện với người thân, bạn bè NGAY
- Đến bệnh viện tâm thần gần nhất
- Nhắn tin cho ai đó bạn tin tưởng
💙 **BẠN QUAN TRỌNG. CUỘC SỐNG CỦA BẠN CÓ GIÁ TRỊ.**
Những cảm giác này sẽ qua đi. Có người sẵn sàng giúp bạn. Hãy cho họ cơ hội.
Bạn có thể gọi ngay bây giờ không? Hoặc có ai bạn có thể nói chuyện không?"""
# Self-harm
self_harm_keywords = ["tự làm đau", "cắt tay", "tự gây thương tích", "self harm", "cut myself"]
if any(keyword in all_text for keyword in self_harm_keywords):
return """⚠️ **CẦN HỖ TRỢ KHẨN CẤP**
Mình rất lo lắng về bạn. Tự gây thương tích là dấu hiệu bạn đang đau khổ và cần được giúp đỡ.
🆘 **HÃY LIÊN HỆ:**
- 📞 **115** - Cấp cứu y tế (Trung tâm Cấp cứu 115 TP.HCM)
- 📞 **1900 1267** - Chuyên gia tâm thần (Bệnh viện Tâm Thần TP.HCM)
- 📞 **0909 65 80 35** - Tư vấn tâm lý miễn phí (Chăm sóc sức khỏe Việt - Davipharm)
💙 **Bạn xứng đáng được chăm sóc và hỗ trợ.**
Có những cách khác để đối phó với cảm xúc khó khăn. Chuyên gia tâm lý có thể giúp bạn tìm ra cách lành mạnh hơn.
Bạn có thể gọi ngay bây giờ không?"""
return None
def _build_mental_health_context_instruction(self, user_query, chat_history, context):
"""
Build context instruction for mental health queries
"""
is_vague = context.get('is_vague', False)
# Handle vague emotional queries
if is_vague:
return """\n\nPHASE: THẤU HIỂU CẢM XÚC (VỚI GỢI Ý)
User đang cảm thấy không ổn nhưng chưa rõ ràng. Empathy + gợi ý:
1. VALIDATE + GỢI Ý CỤ THỂ:
Format: "Mình hiểu bạn đang [cảm giác user nói]. Bạn có thể chia sẻ thêm không? Ví dụ:
• [Gợi ý cảm xúc 1]
• [Gợi ý cảm xúc 2]
• [Gợi ý cảm xúc 3]
• Hoặc điều gì khác?"
2. GỢI Ý DỰA VÀO TỪ KHÓA:
- "mệt" → gợi ý: mệt mỏi tinh thần, burnout, stress, mất ngủ
- "không khỏe" → gợi ý: lo âu, buồn bã, căng thẳng, cô đơn
- "khó chịu" → gợi ý: bực bội, tức giận, thất vọng, áp lực
- "không ổn" → gợi ý: lo lắng, trầm cảm, bất an, mất phương hướng
3. VÍ DỤ CỤ THỂ:
User: "tôi mệt"
Bot: "Mình hiểu bạn đang cảm thấy mệt mỏi. Bạn có thể chia sẻ thêm không? Ví dụ:
• Mệt mỏi về tinh thần, cảm thấy kiệt sức?
• Stress từ công việc hoặc học tập?
• Mất ngủ, ngủ không ngon giấc?
• Hay điều gì khác đang làm bạn khó chịu?"
QUAN TRỌNG:
- Empathy cao, ấm áp
- Gợi ý về CẢM XÚC, không phải triệu chứng vật lý
- Luôn có "hoặc điều gì khác"
- Không ép buộc, để user tự chia sẻ"""
# Check if answering comparison self-assessment
if chat_history and len(chat_history) > 0:
last_bot_msg = chat_history[-1][1] if len(chat_history[-1]) > 1 else ""
if "TỰ KIỂM TRA" in last_bot_msg or "Bạn trả lời" in last_bot_msg:
return """\n\nPHASE: PHÂN TÍCH TÌNH TRẠNG TINH THẦN
User vừa trả lời. Phân tích với empathy:
1. NHẬN DIỆN (dựa vào RAG):
- Đọc kỹ cảm xúc, triệu chứng
- So sánh với các tình trạng (stress/anxiety/burnout...)
- Đưa ra đánh giá nhẹ nhàng
2. VALIDATE & NORMALIZE:
"Cảm giác của bạn là bình thường. Nhiều người cũng trải qua điều này."
3. KỸ THUẬT ĐỐI PHÓ:
- Cụ thể, dễ thực hiện
- Breathing, journaling, grounding...
- Giải thích tại sao hiệu quả
4. KHUYẺN KHÍCH:
- Nếu nhẹ: "Bạn thử các kỸ thuật này nhé"
- Nếu nặng: "Nên tìm chuyên gia hỗ trợ"
QUAN TRỌNG: Empathy + practical help."""
# Check if asking comparison
if any(phrase in user_query.lower() for phrase in [
'stress hay', 'anxiety hay', 'khác nhau thế nào',
'phân biệt', 'hay là'
]):
return """\n\nPHASE: SO SÁNH TÌNH TRẠNG TINH THẦN
User muốn hiểu rõ hơn. Sử dụng RAG:
1. TẠO BẢNG SO SÁNH:
Format:
**[Tình trạng A]:**
• Cảm giác: [feelings]
• Triệu chứng: [symptoms]
• Thời gian: [duration]
• Trigger: [causes]
**[Tình trạng B]:**
• Cảm giác: [feelings]
• Triệu chứng: [symptoms]
• Thời gian: [duration]
• Trigger: [causes]
**Điểm khác biệt:** [key differences]
2. CÂU HỊI TỰ KIỂM TRA:
• Bạn cảm thấy thế nào?
• Kéo dài bao lâu?
• Có trigger rõ ràng không?
• Ảnh hưởng đến sinh hoạt không?
3. LUÔN EMPATHY:
"Dù là gì, cảm giác của bạn đều quan trọng."
4. Kết thúc: "Bạn chia sẻ để mình hiểu rõ hơn nhé!"
QUAN TRỌNG: Dùng RAG, empathy cao."""
# Normal support
return """\n\nĐưa ra hỗ trợ tinh thần:
- Empathy & validation
- KỸ thuật cụ thể
- Khuyến khích tìm chuyên gia nếu cần
KHÔNG nói "Dựa trên thông tin"."""
def _provide_support(self, user_query, context, chat_history):
"""Provide mental health support with comparison and vague query handling"""
try:
# Analyze context
analyzed_context = ContextAnalyzer.analyze_user_intent(user_query, chat_history)
# Build context from chat history
history_context = ""
if chat_history:
recent = chat_history[-3:]
history_context = "\n".join([f"User: {msg[0]}\nBot: {msg[1]}" for msg in recent])
# Smart RAG - only query when needed (inherit from BaseAgent)
rag_answer = ''
rag_sources = []
if self.should_use_rag(user_query, chat_history):
rag_result = self.rag.query_health(user_query)
rag_answer = rag_result.get('answer', '')
rag_sources = rag_result.get('source_docs', [])
# Build RAG context
rag_context = f"\n\nThông tin tham khảo từ cơ sở dữ liệu:\n{rag_answer}" if rag_answer else ""
# Build context instruction
context_instruction = self._build_mental_health_context_instruction(
user_query, chat_history, analyzed_context
)
response = client.chat.completions.create(
model=MODEL,
messages=[
{"role": "system", "content": self.system_prompt},
{"role": "user", "content": f"""Người dùng đang tìm kiếm hỗ trợ về sức khỏe tinh thần.
Lịch sử hội thoại gần đây:
{history_context}
Câu hỏi hiện tại: {user_query}
Ngữ cảnh thêm: {context}{rag_context}
{context_instruction}
Nhớ: Không chẩn đoán, không kê đơn thuốc."""}
],
temperature=0.8,
max_tokens=1500
)
base_response = response.choices[0].message.content
# Add sources using RAG integration formatter (FIXED!)
if rag_sources:
base_response = self.rag.format_response_with_sources({
'answer': base_response,
'source_docs': rag_sources
})
# Add resource information
base_response += """
---
💙 **Nếu cần hỗ trợ chuyên môn:**
- Nếu cần nói chuyện với chuyên gia, đừng ngại đặt lịch tâm lý trị liệu nhé!
Mình luôn ở đây nếu bạn cần trò chuyện thêm. Bạn không cô đơn! 🤗"""
return base_response
except Exception as e:
return """Mình hiểu bạn đang trải qua thời gian khó khăn. 💙
Dù mình gặp chút vấn đề kỹ thuật, nhưng mình muốn bạn biết:
- Cảm xúc của bạn là hợp lệ
- Nhiều người cũng trải qua điều tương tự
- Có sự hỗ trợ dành cho bạn
🆘 **Nếu bạn cần hỗ trợ khẩn cấp:**
- 📞 **115** - Cấp cứu y tế (Trung tâm Cấp cứu 115 TP.HCM)
- 📞 **1900 1267** - Chuyên gia tâm thần (Bệnh viện Tâm Thần TP.HCM)
- 📞 **0909 65 80 35** - Tư vấn tâm lý miễn phí (Chăm sóc sức khỏe Việt - Davipharm)
- Hoặc tìm đến bạn bè, người thân
Bạn có muốn chia sẻ thêm về những gì bạn đang cảm thấy không?"""