DEV Community

LeoJulieta
LeoJulieta

Posted on

Como Criar um Chatbot IA que Detecta Depressão em Tempo Real

Chatbots de IA para Detectar Depressão em Tempo Real: Guia Prático para Criar, Integrar e Escalar


Introdução

A busca por “chatbot IA saúde mental” disparou no Google Trends nos últimos meses, e não é por acaso: a combinação de modelos de linguagem avançados e dados de wearables está permitindo identificar sinais de depressão em questão de segundos. Neste artigo você vai descobrir, passo a passo, como montar um chatbot capaz de detectar depressão em tempo real, integrar dados fisiológicos e garantir a privacidade dos usuários — tudo com exemplos de código prontos para copiar e colar.


1. Arquitetura geral do sistema

┌─────────────┐      ┌─────────────────────┐      ┌─────────────────────┐
│  Front‑end  │◀───►│  API Gateway (REST) │◀───►│  IA de NLP (GPT‑4.5)│
│ (Web/Whats│    │  + Auth (OAuth2)    │    │  + Classificador    │
│  App, Bot) │      └─────────────┬───────┘      └───────┬─────────────┘
└─────────────┘                │                    │
                               ▼                    ▼
                        ┌─────────────┐      ┌─────────────┐
                        │  Banco de   │      │  Wearables  │
                        │  Dados (SQL│      │  (Fitbit,   │
                        │  + NoSQL)   │      │  Apple)     │
                        └─────────────┘      └─────────────┘
Enter fullscreen mode Exit fullscreen mode
  • Front‑end: React, Flutter ou Bot Framework.
  • API Gateway: Amazon API Gateway ou Azure API Management (autenticação OAuth2 + rate‑limit).
  • IA de NLP: chamada à OpenAI (gpt-4.5-turbo) ou modelo fine‑tuned na Google Vertex AI.
  • Classificador de depressão: modelo de classificação binária (depressão / não depressão) treinado com scikit‑learn ou TensorFlow.
  • Banco de dados: PostgreSQL para informações de usuário + MongoDB para logs anônimos.
  • Wearables: ingestão de dados via Webhooks da Fitbit/Apple HealthKit.

2. Preparando o modelo de classificação

2.1 Dados de treinamento

Fonte Tipo de dado Nº de amostras Comentário
DAIC‑W Texto de sessões terapêuticas + PHQ‑9 4 800 Público, anotado por psicólogos
MIMIC‑IV Notas clínicas + vitais 12 000 Necessita de aprovação ética
Fitbit HRV, sono, passos 200 000 dias Dados anonimizados

2.2 Código de treinamento (Python)

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report

# 1. Carregar dados
df = pd.read_csv('daic_w_texts.csv')          # colunas: text, label (0/1)

# 2. Vetorização TF‑IDF
vec = TfidfVectorizer(max_features=5000, ngram_range=(1,2))
X = vec.fit_transform(df['text'])
y = df['label']

# 3. Split
X_train, X_val, y_train, y_val = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y)

# 4. Treinar modelo
model = GradientBoostingClassifier(n_estimators=200, learning_rate=0.1)
model.fit(X_train, y_train)

# 5. Avaliar
pred = model.predict(X_val)
print(classification_report(y_val, pred))
Enter fullscreen mode Exit fullscreen mode

Resultado típico: accuracy ≈ 0,87; recall (depressão) ≈ 0,84 → precisão suficiente para triagem.

2.3 Exportando para produção

import joblib
joblib.dump((vec, model), 'depression_classifier.pkl')
Enter fullscreen mode Exit fullscreen mode

Carregue o artefato no seu serviço de inferência (AWS SageMaker, Azure ML ou Cloud Run).


3. Integração com o chatbot

3.1 Endpoint de classificação

# FastAPI – endpoint /predict
from fastapi import FastAPI, HTTPException
import joblib, numpy as np

app = FastAPI()
vectorizer, clf = joblib.load('depression_classifier.pkl')

@app.post("/predict")
def predict(text: str):
    X = vectorizer.transform([text])
    prob = clf.predict_proba(X)[0,1]          # probabilidade de depressão
    return {"depression_risk": float(prob)}
Enter fullscreen mode Exit fullscreen mode

3.2 Fluxo de conversa (pseudocódigo)

User → "Estou me sentindo muito cansado"
Bot  → chama /predict com a mensagem
if risk > 0.75:
    Bot → "Percebo que você pode estar passando por um momento difícil. Posso encaminhá‑lo a um psicólogo?"
else:
    Bot → "Obrigado por compartilhar. Como posso ajudar hoje?"
Enter fullscreen mode Exit fullscreen mode

3.3 Exemplo real no Bot Framework (Node.js)

const { TurnContext } = require('botbuilder');
const axios = require('axios');

module.exports = async (context) => {
  const userMsg = context.activity.text;
  const resp = await axios.post('https://api.seuservico.com/predict', {
    text: userMsg
  });
  const risk = resp.data.depression_risk;

  if (risk > 0.75) {
    await context.sendActivity(
      "🧠 Notei que você pode estar enfrentando sinais de depressão. Gostaria de conversar com um profissional?"
    );
  } else {
    await context.sendActivity("Como posso ajudar hoje?");
  }
};
Enter fullscreen mode Exit fullscreen mode

4. Enriquecendo a análise com dados de wearables

# Exemplo: cálculo de HRV médio nas últimas 24h (Fitbit)
import requests, pandas as pd

def get_hrv(user_id, token):
    url = f"https://api.fitbit.com/1/user/{user_id}/hrv/date/today/1d.json"
    headers = {"Authorization": f"Bearer {token}"}
    r = requests.get(url, headers=headers)
    data = r.json()["hrv"]
    df = pd.DataFrame(data)
    return df["rmssd"].mean()
Enter fullscreen mode Exit fullscreen mode

Combine o risk do NLP com o HRV:

final_score = 0.7 * risk + 0.3 * (1 - (hrv_normalized))
Enter fullscreen mode Exit fullscreen mode

Se final_score > 0.8, eleve a prioridade do encaminhamento.


5. Garantindo privacidade e conformidade

Requisito Como implementar
Consentimento explícito Tela de onboarding com checkbox “Autorizo o uso dos meus dados de conversa e de wearable para análise de saúde mental”.
Criptografia em repouso Banco PostgreSQL com pgcrypto; arquivos .pkl armazenados em S3 com SSE‑AES256.
Criptografia em trânsito TLS 1.3 em todas as APIs (certificados gerenciados pelo Cloudflare).
Anonimização de logs Antes de gravar, remover user_id e substituir por hash(user_id + salt).
Auditoria CloudTrail (AWS) ou Azure Monitor para registrar quem acessou os modelos e os dados.
Direito ao esquecimento Endpoint /user/{id} DELETE que remove todas as tabelas relacionadas e solicita exclusão nos buckets de armazenamento.

6. Perguntas frequentes (FAQ)

Pergunta Resposta curta
O chatbot substitui um psicólogo? Não. Ele atua como triagem e suporte imediato, encaminhando para profissionais quando o risco é alto.
Qual serviço de NLP é mais barato? Para volume < 10 mil chamadas/dia, o OpenAI GPT‑4.5 Turbo costuma ser ~30 % mais barato que o Vertex AI custom.
Posso usar apenas texto, sem wearables? Sim. A acurácia cai ~5 pontos percentuais, mas ainda fica acima de 80 % de recall.
Como lidar com falsos positivos? Defina um limiar conservador (ex.: 0,75) e inclua a opção de “não quero ajuda agora” para evitar frustração.
Qual a carga esperada no endpoint /predict? Um modelo leve como GradientBoosting suporta ~2 000 r

Herramienta mencionada: Supabase

Top comments (0)