AI-чатбот психологічної підтримки
AI-чатбот психологічної підтримки — не замінник психотерапевту. Це інструмент первинної підтримки для випадків, коли людині потрібно виговоритися, отримати структуру для аналізу свого стану або освоїти базові техніки самодопомоги — прямо зараз, о 3 ночі, без очікування запису.
Технічна та етична відповідальність тут вища, ніж у будь-якому іншому chatbot-проекті. Помилка в підтримці виразів типу "мені краще не бути" — не користувацька незручність, а потенційно небезпечна ситуація.
Архітектура з наголосом на безпеку
from langchain_openai import ChatOpenAI
from enum import Enum
from dataclasses import dataclass, field
import re
class RiskLevel(Enum):
NONE = "none"
LOW = "low"
MODERATE = "moderate"
HIGH = "high"
CRISIS = "crisis"
@dataclass
class ConversationState:
user_id: str
session_id: str
history: list[dict] = field(default_factory=list)
risk_level: RiskLevel = RiskLevel.NONE
topics_discussed: list[str] = field(default_factory=list)
session_start: str = ""
class SafetyClassifier:
"""Перший шар: оцінка ризику перед кожною відповіддю"""
CRISIS_PATTERNS = [
r"\b(самогубство|самогубні|вбити себе|покінчити|не хочу жити)\b",
r"\b(самопошкодження|порізати|причинити собі)\b",
r"\b(прощавай|прощавай назавжди|останнє повідомлення)\b",
]
RISK_INDICATORS = [
r"\b(не бачу сенсу|все безглузде|нікому не потрібен)\b",
r"\b(не можу більше|все погано|немає виходу)\b",
]
def assess_risk(self, message: str) -> RiskLevel:
message_lower = message.lower()
for pattern in self.CRISIS_PATTERNS:
if re.search(pattern, message_lower):
return RiskLevel.CRISIS
risk_count = sum(
1 for pattern in self.RISK_INDICATORS
if re.search(pattern, message_lower)
)
if risk_count >= 2:
return RiskLevel.HIGH
elif risk_count == 1:
return RiskLevel.MODERATE
return RiskLevel.NONE
class PsychSupportBot:
SYSTEM_PROMPT = """Ти — AI-асистент психологічної підтримки, навчений методам активного слухання та базовим техніками КПТ та DBT.
Принципи роботи:
- Емпатія та прийняття без осуду
- Активне слухання: перефразування, уточнення, валідація почуттів
- Не давай порад, поки не розумієш ситуацію повністю
- Не ставиш діагнози, не призначаєш лікування
- При будь-яких ознаках кризи — одразу надай гарячу лінію
Ти умієш:
- Техніки заземлення (5-4-3-2-1, дихальні вправи)
- Базові техніки КПТ (виявлення когнітивних спотворень, дневник думок)
- Навички DBT: mindfulness, толерантність до дистресу
- Спрямування до фахівця за необхідності
Ти НЕ умієш та не робиш:
- Не замінюєш психотерапію
- Не працюєш з психозами, важкою депресією, біполярним розладом
- Не беруш на себе відповідальність за рішення користувача"""
CRISIS_RESPONSE = """Я чую, що тобі зараз дуже тяжко. Це важливо.
Будь ласка, контактуй прямо зараз з телефоном довіри:
📞 **988** (US Suicide & Crisis Lifeline, 24/7)
📞 **116 123** (загальна європейська гаряча лінія)
Там працюють живі фахівці, готові слухати та допомогти.
Ти не один/одна в цьому."""
def __init__(self):
self.llm = ChatOpenAI(model="gpt-4o", temperature=0.3)
self.safety = SafetyClassifier()
async def respond(self, message: str, state: ConversationState) -> dict:
# Крок 1: оцінка ризику (ЗАВЖДИ перший)
risk = self.safety.assess_risk(message)
state.risk_level = max(state.risk_level, risk, key=lambda r: list(RiskLevel).index(r))
if risk == RiskLevel.CRISIS:
return {
"message": self.CRISIS_RESPONSE,
"risk_level": risk.value,
"alert_supervisor": True # уведомлення модератора
}
# Крок 2: збагачуємо системний промпт контекстом ризику
system = self.SYSTEM_PROMPT
if risk == RiskLevel.HIGH:
system += "\n\nУВАГА: У повідомленні користувача є ознаки підвищеного дистресу. Будь особливо уважним та деліkatним. В кінці повідомлення м'яко запропонуй звернутися до фахівця."
state.history.append({"role": "user", "content": message})
response = await self.llm.ainvoke([
{"role": "system", "content": system},
*state.history[-12:]
])
answer = response.content
state.history.append({"role": "assistant", "content": answer})
return {
"message": answer,
"risk_level": risk.value,
"alert_supervisor": risk in (RiskLevel.HIGH, RiskLevel.MODERATE)
}
Техніки підтримки: реалізація КПТ-вправ
CBT_EXERCISES = {
"thought_record": """Давай разом розібратися з цією думкою.
Запиши поетапно:
1. **Ситуація**: що саме сталося?
2. **Автоматична думка**: що ти подумав/подумала в той момент?
3. **Емоція**: що почув/почула? (та наскільки інтенсивно, 0–10)
4. **Факти ЗА цю думку**: що її підтверджує?
5. **Факти ПРОТИ**: що суперечить?
6. **Збалансована думка**: як можеш подивитися на це інакше?""",
"grounding_5_4_3_2_1": """Спробуємо техніку заземлення. Вона допомагає повернутися в поточний момент.
Повільно відповідай:
👁 **5 речей**, які ти бачиш прямо зараз
✋ **4 речі**, які ти можеш потрогати
👂 **3 звуки**, які чуєш
👃 **2 запаху** (реальних або яких ти любиш)
👅 **1 смак**
Не поспішай."""
}
Модерація та ескалація
class SupervisorAlert:
async def notify(self, user_id: str, risk_level: str, last_messages: list):
"""Уведомлює живого модератора при високому ризику"""
await self.notification_client.send({
"channel": "crisis-alerts",
"priority": "high",
"user_id": user_id,
"risk": risk_level,
"context": last_messages[-3:],
"action_required": "Перевір користувача"
})
Важливо: система завжди має живих модераторів у дежурстві. AI — перший шар підтримки, але не єдиний.
Строки: базовий бот з SafetyClassifier та гарячими лініями: 2–3 тижні; з КПТ-техніками, персоналізацією та модерацією: 6–8 тижнів.







