FastAPI、Celery、spaCyでマインドフルネスの『デジタルコンパニオン』チャットボットを構築した方法
先取り的なマインドフルネスチャットボットを構築するプロジェクトベースのチュートリアルです。APIにFastAPI、NLPの意図認識にspaCy、非同期のパーソナライズされたウェルネスリマインダーにCeleryを使用する方法を学びます。
このページの内容
このプロジェクトの着想は、主动的な精神的な健康支援を提供するツールを作成したいという願いから生まれました。ユーザーが常にサポートを探し求める必要はなく、'applicationが忙しい一日に穏やかなひとときをそっと提供してくれたらどうでしょうか?この「デジタルコンパニオン」は сучасних веб-технологій を使用して、精神的な健康に対して肯定的な影響を与えるアプリケーションを構築する方法を示すプロジェクトです。
次のようなチャットボットを構築します:
- 傾聴: ユーザーの現在の心の状態についてのメッセージを受け入れます。
- 理解: spaCyを使用して、ユーザーの意図(例:ストレスや不安を感じている)を認識します。
- 対応: すぐにに関連するマインドフルネス exercise を提案します。
- リマインダー: Celeryを使用して、一日を通じて短いマインドフルネス break の”系列的な優しいリマインダーを非同期でスケジュールします。
このプロジェクトは、NLPの実用的な適用、非同期タスクスケジューリング、モダンなバックエンド開発に興味のある開発者の方に最適です。
前提条件
- Python 3.7以上、および仮想環境についての理解。
- API構築の基本知識。
- メッセージブローカーの簡単なセットアップのためのDockerおよびDocker Compose。
問題の理解
多くの精神的な健康アプリケーションは反応的であり、ユーザーがアプリを開いて能動的に瞑想やエクササイズを検索する必要があります。課題をemiintrusiveであることなく、インテリジェントにリマインダーをスケジュールできるより主动的なシステムを作成することです。
ここで我们的 Tech Stack が輝きます:
- FastAPI: 受信ユーザーメッセージを効率的に処理できる高性能APIの作成用。
- spaCy: ユーザーメッセージに対する軽量ながらも強力な意図認識を実行し、チャットボットがユーザーのニーズを理解できるようにします。
- Celery: 非同期タスクを管理します。ユーザーがストレスを表現したとき、将来的なリマインダーのスケジュール)中mainアプリケーションがブロックされることを望みません。Celeryは、Redisのようなメッセージブローカーと一緒にこれをバックグラウンドで処理します。
- Celery Beat: Celeryのスケジューラで、每日のマインドフルネ스티ップの送信やユーザーへのチェックインのような周期的なタスクをトリガーできます。
前提条件
コーディングを開始する前に、環境を設定しましょう。
まず、プロジェクトディレクトリを作成し、仮想環境を作成します:
mkdir digital-companion && cd digital-companion
python3 -m venv venv
source venv/bin/activate
次に、必要なライブラリを使用してrequirements.txtファイルを作成します:
fastapi
uvicorn
celery[redis]
spacy
requests
これらの依存関係をインストールします:
pip install -r requirements.txt
また、spaCy言語モデルをダウンロードする必要があります。このプロジェクトには小さな英語モデルを使用します:
python -m spacy download en_core_web_sm
最後に、Dockerを使用してRedis(我们的メッセージブローカー)を実行します。docker-compose.ymlファイルを作成します:
version: '3.8'
services:
redis:
image: redis:6.2-alpine
ports:
- "6379:6379"
次のコマンドを実行してRedisを起動します:
docker-compose up -d
Redisインスタンスがバックグラウンドで実行されています。
ステップ1:FastAPIアプリケーションの設定
FastAPIアプリケーションの基本構造を作成しましょう。
で行うこと
APIをホストするmain.pyファイルを作成します。すべてが正常に動作していることを確認するためのシンプルなエンドポイントから始めます。
実装
main.pyという名前のファイルを作成します:
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Welcome to your Digital Companion"}
動作の仕組み
このコードスニペットはFastAPIアプリケーションを初期化し、ルートURL(/)の単一のエンドポイントを定義します。このURLへのGETリクエストが行われると、シンプルなJSONレスポンスが返されます。
uvicornを使用してアプリケーションを実行するには:
uvicorn main:app --reload
サーバーが実行されていることを示す出力が表示されます。ブラウザでhttp://127.0.0.1:8000にアクセスすると、ようこそメッセージが表示されます。
ステップ2:Celeryの設定
次に、非同期タスクのためにCeleryを統合しましょう。
で行うこと
Celeryインスタンスを作成し、シンプルなタスクを定義します。これには、Celeryの設定とタスクの定義ためにcelery_worker.pyファイルを作成することが含まれます。
実装
celery_worker.pyファイルを作成します:
# celery_worker.py
from celery import Celery
import time
# Configure Celery
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):
"""
A mock function to simulate sending a mindfulness reminder.
In a real application, this would send an email, a push notification, etc.
"""
print(f"Sending reminder to user {user_id}: '{message}'")
time.sleep(5) # Simulate a delay
return f"Reminder sent to user {user_id}"
celery_app.conf.beat_schedule = {
'send-daily-tip': {
'task': 'celery_worker.send_mindfulness_reminder',
'schedule': 86400.0, # Every 24 hours
'args': (0, "Here is your daily mindfulness tip: Take a moment to notice three things you can see around you.")
},
}
celery_app.conf.timezone = 'UTC'
動作の仕組み
Redisインスタンスをメッセージブローカーと結果バックエンドの両方として指定して、Celeryインスタンスを作成します。次に、@celery_app.taskデコレータを使用してsend_mindfulness_reminderタスクを定義します。24時間ごとに每日チップを送信するようにCelery Beatも設定しています。
Celeryワーカーを実行するには、新しいターミナルを開いて実行します:
celery -A celery_worker.celery_app worker --loglevel=info
Celery Beatを実行するには、別のターミナルを開きます:
celery -A celery_worker.celery_app beat --loglevel=info
ステップ3:spaCyによる意図認識
次に、チャットボットの「スマート」部分です。ユーザーの意図を理解するためにspaCyを使用します。
で行うこと
ユーザーのメッセージがストレスを示しているかどうか識別できるシンプルな意図認識関数を作成します。
実装
新しいファイルnlp.pyを作成します:
# nlp.py
import spacy
# Load the spaCy model
nlp = spacy.load("en_core_web_sm")
# Define keywords for different intents
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"
動作の仕組み
この関数はテキスト文字列を受け取り、spaCyで処理し、lemmatizedされた単語が事前に定義されたストレスキーワードと一致するかどうかをチェック。Lemmatizationは単語を基本形に還元します(例:「worried」は「worry」になります),によりキーワードマッチングをより堅牢にします。これは基本的な意図認識を実行するシンプルですが効果的な方法です。
すべてをまとめる
次に、everythingをFastAPIアプリケーションに統合しましょう。
で行うこと
main.pyに新しいエンドポイントを作成し、ユーザーメッセージを受け入れ、nlp.pyモジュールを使用して意図を認識し、ストレスが検出された場合はCeleryをトリガーしてマインドフルネサーリマインダーの”系列をスケジュールします。
実装
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": "Welcome to your Digital Companion"}
@app.post("/chat")
def chat(message: Message, background_tasks: BackgroundTasks):
intent = recognize_intent(message.text)
if intent == "stress_intent":
# Immediate response
response = {
"message": "I understand you're feeling stressed. Here's a quick exercise: Take a deep breath in for 4 seconds, hold for 4, and exhale for 6. Repeat this three times."
}
# Schedule follow-up reminders
reminders = [
("In 1 hour, take a moment to stretch.", timedelta(hours=1)),
("In 3 hours, how about a 5-minute walk?", timedelta(hours=3)),
("Before you end your day, reflect on one positive thing that happened.", 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": "I'm here to help with mindfulness. Try telling me if you're feeling stressed."}
動作の仕組み
Messageモデルを定義して、受信リクエストボディを構造化します。/chatエンドポイントは、ユーザーメッセージとuser_idを受け取ります。- ユーザーの状態を判断するために
recognize_intentを呼び出します。 - 意図が
stress_intentの場合、即座にマインドフルネスエクササイズを提供します。 - 重要なことに、
send_mindfulness_reminder.apply_asyncを使用して、countdown引数を使用して異なる間隔で複数のフォローアウトリマインダーをスケジュールします。これらのタスクはバックグラウンドで実行されるためにCeleryワーカーに送られるため、APIレスポンスは即座に行われます。
セキュリティのベストプラクティス
- 入力検証: FastAPIとPydanticは、受信データを自動的に検証します。これは最初の防御線として優れています。
- 認証: 実際のアプリケーションでは、OAuth2のような認証メカニズムを使用してエンドポイントを保護し、許可されたユーザーのみがチャットボットと対話できるようにします。
- レート制限: 悪用を防ぐために、APIエンドポイントにレート制限を実装することを検討してください。
本番環境へのデプロイのヒント
- コンテナ化: 本番環境では、FastAPIアプリ、Celeryワーカー、Celery BeatスケジューラをDockerを使用してコンテナ化します。
- 環境変数: データベースの認証情報やすAPIキーなどの機密情報には、ハードコーディングする代わりに環境変数を使用します。
- 監視: Flowerのようなツールを使用して、Celeryワーカーとタスクを監視できます。
代替アプローチ
- より高度なNLP: より洗練された意図認識については、Rasaのようなライブラリを使用してカスタムマシンモデルをトレーニングするか、より会話的な機能のために大规模言語モデル(LLM)を活用することもできます。
- リアルタイム通信のためのWebSocket: シンプルなHTTPエンドポイント代わりに、WebSocketを使用してより対話的でリアルタイムのチャット体験を提供できます。
結論
FastAPIバックエンド、Celeryによる非同期タスクスケジューリング、spaCyによる自然言語処理を組み合わせた「デジタルコンパニオン」チャットボットを正常に構築しました。このプロジェクトは、知的で応答性があり、影響を与えるWebアプリケーションを構築したい任何人にとって素晴らしい出発点です。
主要なポイントは、これらの強力なツールが実際の問題を解決するためにどのように統合できるかです。タスクをバックグラウンドワーカーにオフロードすることで、APIは高速で応答性を維持し、はるかに優れたユーザー体験を提供します。
読者向けの次のステップ:
- チャットボットが認識できる意図の数を増やします。
- データベースを統合して、ユーザーの設定と会話履歴を保存します。
- メールやプッシュ通知など、より高度なリマインダー送信方法を実装します。
リソース
クイックリファレンス
| 側面 | 主要情報 |
|---|---|
| トピック | 開発 |
| 関連性 | 患者教育と認識 |
| アクション | 医療提供者にご相談ください |
| 頻度 | ケアチームのおすすめに応じて |
| 根拠 | 現在の臨床ガイドラインに基づく |
よくある質問
Q: これが自分に該当するどうかはどうすればわかりますか? A: あなたの個人的な病歴と家族歴を医療提供者と相談して、あなたの個人的なリスク因子を評価し、適切な次のステップを決定してください。
Q: 医師に何と聞けばよいですか? A: 良い質問には次のようなものがあります:「結果はどういう意味ですか?」「私のオプションは何ですか?」「どのようなライフaïlleの変更が役立ちますか?」「いつフォローアップする必要がありますか?」
Q: 健康改善にライフスタイルの変更はありますか? A: ほとんどの健康状態は、基盤的な対策から恩恵を受けます:バランスの取れた栄養、定期的な運動(週150分以上)、質の良い睡眠(7〜9時間)、ストレス管理、タバコの回避。
医療免责声明
この記事は教育的目的のみを目的としており、医療アドバイス構成しません。あなたの健康、治療、またはケアに関する決定する前に、常に資格のある医療提供者と相談してください。個人の状況異なり、一人に適切なものが別の人に適切なまらない場合があります。
緊急事態が発生した場合は、直ちに911(またはあなたの地元の緊急番号)に電話してください。