Wie ich einen Achtsamkeits-Chatbot mit FastAPI und spaCy baute
Ein projektbasierter Leitfaden zum Erstellen eines proaktiven Achtsamkeits-Chatbots. Lernen Sie, FastAPI für die API, spaCy für die NLP-Intent-Erkennung und Celery für geplante, personalisierte Wellness-Erinnerungen zu nutzen.
Auf dieser Seite
---
Die Inspiration für dieses Projekt kam aus dem Wunsch, ein Tool zu entwickeln, das proaktive Unterstützung für das psychische Wohlbefinden bietet. Was wäre, wenn ein Benutzer nicht immer Hilfe suchen müsste, sondern eine Anwendung ihm sanft einen Moment der Ruhe in einem geschäftigen Tag bieten könnte? Dieses „Digital Companion"-Projekt zeigt, wie moderne Webtechnologien eingesetzt werden können, um Anwendungen mit positiver Auswirkung auf das psychische Wohlbefinden zu entwickeln.
Wir werden einen Chatbot entwickeln, der:
- Zuhören: Nimmt eine Nachricht des Benutzers über seinen aktuellen Geisteszustand entgegen.
- Verstehen: Nutzt spaCy, um die Absicht des Benutzers zu erkennen (z.B. sich gestresst oder ängstlich fühlen).
- Handeln: Empfeiehlt sofort eine relevante Achtsamkeitsübung.
- Erinnern: Plant asynchron eine Reihe sanfter Erinnerungen an kurze Achtsamkeitspausen im Laufe des Tages mit Celery.
Dieses Projekt eignet sich perfekt für Entwickler, die sich für die praktische Anwendung von NLP, asynchrone Aufgabenplanung und moderne Backend-Entwicklung interessieren.
Voraussetzungen
- Python 3.7+ und Verständnis von virtuellen Umgebungen.
- Grundlegende Kenntnisse beim Erstellen von APIs.
- Docker und Docker Compose für die einfache Einrichtung unseres Message Brokers.
Das Problem verstehen
Viele Apps für psychisches Wohlbefinden sind reaktiv; sie erfordern, dass der Benutzer die App öffnet und aktiv nach einer Meditation oder Übung sucht. Die Herausforderung besteht darin, ein proaktiveres System zu schaffen, das Erinnerungen intelligent planen kann, ohne aufdringlich zu sein.
Hier zeigt sich unser Technologie-Stack von seiner besten Seite:
- FastAPI: Für die Erstellung einer leistungsstarken API, die eingehende Benutzernachrichten effizient verarbeiten kann.
- spaCy: Für leistungsstarke Intent-Erkennung in Benutzernachrichten, mit der unser Chatbot die Bedürfnisse des Benutzers verstehen kann.
- Celery: Für die Verwaltung asynchroner Aufgaben. Wenn ein Benutzer Stress äußert, möchten wir nicht, dass unsere Hauptanwendung blockiert wird, während zukünftige Erinnerungen geplant werden. Celery mit einem Message Broker wie Redis erledigt dies im Hintergrund.
- Celery Beat: Ein Scheduler für Celery, der es uns ermöglicht, periodische Aufgaben auszulösen, wie das Senden täglicher Achtsamkeitstipps oder das Einchecken beim Benutzer.
Voraussetzungen
Bevor wir mit dem Programmieren beginnen, richten wir unsere Umgebung ein.
Erstellen Sie zunächst ein Projektverzeichnis und eine virtuelle Umgebung:
mkdir digital-companion && cd digital-companion
python3 -m venv venv
source venv/bin/activate
Erstellen Sie als Nächstes eine requirements.txt-Datei mit den erforderlichen Bibliotheken:
fastapi
uvicorn
celery[redis]
spacy
requests
Installieren Sie diese Abhängigkeiten:
pip install -r requirements.txt
Wir müssen auch ein spaCy-Sprachmodell herunterladen. Für dieses Projekt verwenden wir ein kleines englisches Modell:
python -m spacy download en_core_web_sm
Schließlich verwenden wir Docker, um Redis, unseren Message Broker, auszuführen. Erstellen Sie eine docker-compose.yml-Datei:
version: '3.8'
services:
redis:
image: redis:6.2-alpine
ports:
- "6379:6379"
Starten Sie Redis, indem Sie Folgendes ausführen:
docker-compose up -d
Ihre Redis-Instanz läuft jetzt im Hintergrund.
Schritt 1: Einrichten der FastAPI-Anwendung
Lassen Sie uns die grundlegende Struktur für unsere FastAPI-Anwendung erstellen.
Was wir tun
Wir erstellen eine main.py-Datei, die unsere API beherbergen wird. Wir beginnen mit einem einfachen Endpunkt, um sicherzustellen, dass alles korrekt funktioniert.
Implementierung
Erstellen Sie eine Datei namens main.py:
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Willkommen bei Ihrem Digital Companion"}
Wie es funktioniert
Dieser Code initialisiert eine FastAPI-Anwendung und definiert einen einzelnen Endpunkt für die Stamm-URL (/). Wenn eine GET-Anfrage an diese URL gestellt wird, gibt sie eine einfache JSON-Antwort zurück.
Um die Anwendung auszuführen, verwenden Sie uvicorn:
uvicorn main:app --reload
Sie sollten eine Ausgabe sehen, die anzeigt, dass der Server läuft. Sie können jetzt http://127.0.0.1:8000 in Ihrem Browser besuchen und die Willkommensnachricht sehen.
Schritt 2: Celery konfigurieren
Jetzt integrieren wir Celery für unsere asynchronen Aufgaben.
Was wir tun
Wir erstellen eine Celery-Instanz und definieren eine einfache Aufgabe. Dies beinhaltet das Erstellen einer celery_worker.py-Datei zur Konfiguration von Celery und zur Definition unserer Aufgaben.
Implementierung
Erstellen Sie eine celery_worker.py-Datei:
# celery_worker.py
from celery import Celery
import time
# Celery konfigurieren
celery_app = Celery(
'tasks',
broker='redis://localhost:6379/0',
backend='redis://localhost:6379/0'
)
@celery_app.task
def send_mindfulness_reminder(user_id: int, message: str):
"""
Eine Mock-Funktion, um das Senden einer Achtsamkeitserinnerung zu simulieren.
In einer echten Anwendung würde dies eine E-Mail, eine Push-Benachrichtigung usw. senden.
"""
print(f"Erinnerung an Benutzer {user_id} senden: '{message}'")
time.sleep(5) # Verzögerung simulieren
return f"Erinnerung an Benutzer {user_id} gesendet"
celery_app.conf.beat_schedule = {
'send-daily-tip': {
'task': 'celery_worker.send_mindfulness_reminder',
'schedule': 86400.0, # Alle 24 Stunden
'args': (0, "Hier ist Ihr täglicher Achtsamkeitstipp: Nehmen Sie sich einen Moment Zeit, um drei Dinge zu bemerken, die Sie um sich herum sehen können.")
},
}
celery_app.conf.timezone = 'UTC'
Wie es funktioniert
Wir erstellen eine Celery-Instanz und geben unsere Redis-Instanz sowohl als Message Broker als auch als Ergebnis-Backend an. Dann definieren wir eine Aufgabe send_mindfulness_reminder mit dem Decorator @celery_app.task. Wir haben auch Celery Beat konfiguriert, um alle 24 Stunden einen täglichen Tipp zu senden.
Um den Celery-Worker auszuführen, öffnen Sie ein neues Terminal und führen Sie Folgendes aus:
celery -A celery_worker.celery_app worker --loglevel=info
Um Celery Beat auszuführen, öffnen Sie ein weiteres Terminal:
celery -A celery_worker.celery_app beat --loglevel=info
Schritt 3: Intent-Erkennung mit spaCy
Jetzt kommt der „intelligente" Teil unseres Chatbots. Wir verwenden spaCy, um die Absicht des Benutzers zu verstehen.
Was wir tun
Wir erstellen eine einfache Intent-Erkennungsfunktion, die erkennen kann, ob eine Nachricht des Benutzers auf Stress hinweist.
Implementierung
Erstellen Sie eine neue Datei nlp.py:
# nlp.py
import spacy
# Das spaCy-Modell laden
nlp = spacy.load("en_core_web_sm")
# Schlüsselwörter für verschiedene Intents definieren
STRESS_KEYWORDS = ["stress", "anxious", "overwhelmed", "worried", "burnout"]
def recognize_intent(text: str):
doc = nlp(text.lower())
for token in doc:
if token.lemma_ in STRESS_KEYWORDS:
return "stress_intent"
return "unknown_intent"
Wie es funktioniert
Diese Funktion nimmt einen Textstring, verarbeitet ihn mit spaCy und prüft, ob eines der lemmatisierten Wörter mit unseren vordefinierten Stress-Schlüsselwörtern übereinstimmt. Lemmatisierung reduziert Wörter auf ihre Grundform (z.B. wird „worried" zu „worry"), was unser Schlüsselwort-Matching robuster macht. Dies ist eine einfache, aber effektive Methode zur grundlegenden Intent-Erkennung.
Alles zusammenführen
Jetzt integrieren wir alles in unsere FastAPI-Anwendung.
Was wir tun
Wir erstellen einen neuen Endpunkt in main.py, der eine Nachricht des Benutzers entgegennimmt, unser nlp.py-Modul verwendet, um die Absicht zu erkennen, und bei Erkennung von Stress Celery auslöst, um eine Reihe von Achtsamkeitserinnerungen zu planen.
Implementierung
Aktualisieren Sie main.py:
# main.py
from fastapi import FastAPI, BackgroundTasks
from pydantic import BaseModel
from celery_worker import send_mindfulness_reminder
from nlp import recognize_intent
from datetime import timedelta
app = FastAPI()
class Message(BaseModel):
user_id: int
text: str
@app.get("/")
def read_root():
return {"message": "Willkommen bei Ihrem Digital Companion"}
@app.post("/chat")
def chat(message: Message, background_tasks: BackgroundTasks):
intent = recognize_intent(message.text)
if intent == "stress_intent":
# Unmittelbare Antwort
response = {
"message": "Ich verstehe, dass Sie sich gestresst fühlen. Hier ist eine schnelle Übung: Atmen Sie tief für 4 Sekunden ein, halten Sie für 4, und atmen Sie für 6 aus. Wiederholen Sie dies dreimal."
}
# Follow-up-Erinnerungen planen
reminders = [
("In 1 Stunde, nehmen Sie sich einen Moment zum Stretching.", timedelta(hours=1)),
("In 3 Stunden, wie wäre es mit einem 5-minütigen Spaziergang?", timedelta(hours=3)),
("Bevor Sie Ihren Tag beenden, reflektieren Sie über eine positive Sache, die passiert ist.", timedelta(hours=6))
]
for msg, delay in reminders:
send_mindfulness_reminder.apply_async(args=[message.user_id, msg], countdown=delay.total_seconds())
return response
else:
return {"message": "Ich bin hier, um bei Achtsamkeit zu helfen. Versuchen Sie mir zu sagen, ob Sie sich gestresst fühlen."}
Wie es funktioniert
- Wir definieren ein
Message-Modell, um den eingehenden Anfrage-Body zu strukturieren. - Der
/chat-Endpunkt empfängt eine Nachricht des Benutzers und dieuser_id. - Er ruft
recognize_intentauf, um den Zustand des Benutzers zu bestimmen. - Wenn der Intent
stress_intentist, liefert er eine sofortige Achtsamkeitsübung. - Entscheidend ist, dass er dann
send_mindfulness_reminder.apply_asyncverwendet, um mehrere Follow-up-Erinnerungen zu verschiedenen Zeitpunkten mit demcountdown-Argument zu planen. Diese Aufgaben werden an unseren Celery-Worker gesendet, um im Hintergrund ausgeführt zu werden, sodass die API-Antwort sofort erfolgt.
Best Practices für die Sicherheit
- Input-Validierung: FastAPI mit Pydantic validiert automatisch eingehende Daten. Dies ist eine großartige erste Verteidigungslinie.
- Authentifizierung: In einer realen Anwendung würden Sie Ihre Endpunkte mit einem Authentifizierungsmechanismus wie OAuth2 schützen, um sicherzustellen, dass nur autorisierte Benutzer mit dem Chatbot interagieren können.
- Rate Limiting: Um Missbrauch zu verhindern, sollten Sie Rate Limiting für Ihre API-Endpunkte implementieren.
Tipps für die Produktionsbereitstellung
- Containerisierung: Für eine Produktionsumgebung würden Sie die FastAPI-App, den Celery-Worker und den Celery-Beat-Scheduler mit Docker containerisieren.
- Umgebungsvariablen: Verwenden Sie Umgebungsvariablen für sensible Informationen wie Datenbankanmeldedaten oder API-Schlüssel, anstatt sie fest zu codieren.
- Monitoring: Tools wie Flower können verwendet werden, um Ihre Celery-Worker und Aufgaben zu überwachen.
Alternative Ansätze
- Fortgeschrittenere NLP: Für eine ausgefeiltere Intent-Erkennung könnten Sie ein benutzerdefiniertes Machine-Learning-Modell mit Bibliotheken wie Rasa trainieren oder sogar große Sprachmodelle (LLMs) für konversationellere Fähigkeiten einsetzen.
- WebSocket für Echtzeitkommunikation: Anstatt eines einfachen HTTP-Endpunkts könnten Sie WebSockets für ein interaktiveres, Echtzeit-Chat-Erlebnis verwenden.
Fazit
Wir haben erfolgreich einen „Digital Companion"-Chatbot entwickelt, der ein FastAPI-Backend, Celery für die asynchrone Aufgabenplanung und spaCy für die natürliche Sprachverarbeitung kombiniert. Dieses Projekt ist ein großartiger Ausgangspunkt für alle, die intelligente, reaktionsschnelle und wirkungsvolle Webanwendungen entwickeln möchten.
Die wichtigste Erkenntnis ist, wie diese leistungsstarken Tools integriert werden können, um ein reales Problem zu lösen. Indem wir Aufgaben an einen Hintergrund-Worker auslagern, bleibt unsere API schnell und reaktionsschnell und bietet ein viel besseres Benutzererlebnis.
Nächste Schritte für Leser
- Erweitern Sie die Anzahl der Intents, die unser Chatbot erkennen kann.
- Integrieren Sie eine Datenbank, um Benutzerpräferenzen und Konversationsverläufe zu speichern.
- Implementieren Sie eine ausgefeiltere Methode zum Senden von Erinnerungen, wie E-Mail oder Push-Benachrichtigungen.
Ressourcen
Kurzübersicht
| Aspekt | Wichtige Informationen |
|---|---|
| Thema | Entwicklung |
| Relevanz | Patientenaufklärung und -sensibilisierung |
| Maßnahme | Besprechen Sie dies mit Ihrem Arzt |
| Häufigkeit | Nach Empfehlung Ihres Behandlungsteams |
| Evidenz | Basierend auf aktuellen klinischen Richtlinien |
Häufig gestellte Fragen
F: Woher weiß ich, ob dies auf mich zutrifft? A: Besprechen Sie Ihre persönliche und familiäre Krankengeschichte mit Ihrem Arzt, um Ihre individuellen Risikofaktoren zu bewerten und geeignete nächste Schritte zu bestimmen.
F: Was sollte ich meinen Arzt fragen? A: Gute Fragen sind: „Was bedeuten meine Ergebnisse?", „Was sind meine Optionen?", „Welche Lebensstiländerungen würden helfen?" und „Wann sollte ich nachfolgen?"
F: Gibt es Lebensstiländerungen, die helfen können? A: Die meisten Erkrankungen profitieren von grundlegenden Maßnahmen: ausgewogene Ernährung, regelmäßige körperliche Aktivität (150+ Minuten/Woche), качественный Schlaf (7-9 Stunden), Stressbewältigung und Vermeidung von Tabak.
Haftungsausschluss
Dieser Artikel dient ausschließlich zu Bildungszwecken und stellt keine medizinische Beratung dar. Konsultieren Sie immer einen qualifizierten Arzt, bevor Sie Entscheidungen über Ihre Gesundheit, Behandlung oder Pflege treffen. Individuelle Umstände variieren, und das, was für eine Person geeignet ist, ist möglicherweise nicht für eine andere geeignet.
Wenn Sie einen medizinischen Notfall erleben, rufen Sie sofort 911 (oder Ihre örtliche Notrufnummer) an.