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 = """Я слышу, что тебе сейчас очень тяжело. Это важно.
Пожалуйста, свяжись прямо сейчас с телефоном доверия:
📞 **8-800-2000-122** (Россия, бесплатно, 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ВНИМАНИЕ: В сообщении пользователя есть признаки повышенного дистресса. Будь особенно внимателен, деликатен. В конце сообщения мягко предложи обратиться к специалисту."
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 недель.







