Spaces:
Sleeping
Sleeping
Docs: cleanup and create current architecture guide
Browse files- Removed 10 outdated .md files (old logic, deprecated guides)
- Created CURRENT_ARCHITECTURE.md with K/V/T system overview
- Updated README.md with current Entry Classifier architecture
- Cleaned up documentation to reflect actual system state
- CURRENT_ARCHITECTURE.md +247 -0
- FIXES_AND_CLEANUP.md +0 -109
- IMPLEMENTATION_SUMMARY.md +0 -131
- INSTRUCTION_TEST.md +0 -222
- MAIN_LIFESTYLE_REFACTOR.md +0 -146
- NEUTRAL_CATEGORY_FIX.md +0 -102
- NEW_LOGIC_IMPLEMENTATION.md +0 -165
- README.md +23 -17
- README_local.md +0 -164
- REFACTORING_README.md +0 -113
- TESTING_GUIDE.md +0 -155
- examples_test_patient.md +0 -383
CURRENT_ARCHITECTURE.md
ADDED
|
@@ -0,0 +1,247 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 🏗️ Поточна архітектура Lifestyle Journey
|
| 2 |
+
|
| 3 |
+
## 🎯 Огляд системи
|
| 4 |
+
|
| 5 |
+
**Lifestyle Journey** - медичний чат-бот з lifestyle коучингом на базі Gemini API, що використовує розумну класифікацію повідомлень та м'який медичний тріаж.
|
| 6 |
+
|
| 7 |
+
## 🔧 Ключові компоненти
|
| 8 |
+
|
| 9 |
+
### 📋 Класифікатори
|
| 10 |
+
|
| 11 |
+
#### 1. **EntryClassifier** - K/V/T формат
|
| 12 |
+
**Призначення:** Класифікує повідомлення пацієнта на початку взаємодії
|
| 13 |
+
|
| 14 |
+
**Формат відповіді:**
|
| 15 |
+
```json
|
| 16 |
+
{
|
| 17 |
+
"K": "Lifestyle Mode",
|
| 18 |
+
"V": "on|off|hybrid",
|
| 19 |
+
"T": "2025-09-04T11:30:00Z"
|
| 20 |
+
}
|
| 21 |
+
```
|
| 22 |
+
|
| 23 |
+
**Значення V:**
|
| 24 |
+
- **off** - медичні скарги, симптоми, вітання → м'який медичний тріаж
|
| 25 |
+
- **on** - lifestyle питання → активація lifestyle режиму
|
| 26 |
+
- **hybrid** - містить і lifestyle теми, і медичні скарги → гібридний потік
|
| 27 |
+
|
| 28 |
+
#### 2. **TriageExitClassifier**
|
| 29 |
+
**Призначення:** Після медичного тріажу оцінює готовність до lifestyle
|
| 30 |
+
|
| 31 |
+
**Критерії для lifestyle:**
|
| 32 |
+
- Медичні скарги стабілізовані
|
| 33 |
+
- Пацієнт готовий до lifestyle активностей
|
| 34 |
+
- Немає активних симптомів
|
| 35 |
+
|
| 36 |
+
#### 3. **LifestyleExitClassifier** (deprecated)
|
| 37 |
+
**Призначення:** Контролює вихід з lifestyle режиму
|
| 38 |
+
**Статус:** Замінено на MainLifestyleAssistant логіку
|
| 39 |
+
|
| 40 |
+
### 🤖 Асистенти
|
| 41 |
+
|
| 42 |
+
#### 1. **SoftMedicalTriage** - М'який тріаж
|
| 43 |
+
**Призначення:** Делікатна перевірка стану пацієнта на початку взаємодії
|
| 44 |
+
|
| 45 |
+
**Принципи:**
|
| 46 |
+
- Дружній, не нав'язливий тон
|
| 47 |
+
- 1-2 коротких питання про самопочуття
|
| 48 |
+
- Швидка оцінка потреби в медичній допомозі
|
| 49 |
+
- Готовність перейти до lifestyle якщо все добре
|
| 50 |
+
|
| 51 |
+
#### 2. **MedicalAssistant** - Повний медичний режим
|
| 52 |
+
**Призначення:** Медичні консультації з урахуванням хронічних станів
|
| 53 |
+
|
| 54 |
+
**Функції:**
|
| 55 |
+
- Безпечні рекомендації та тріаж
|
| 56 |
+
- Направлення до лікарів при red flags
|
| 57 |
+
- Урахування медичного анамнезу та медикаментів
|
| 58 |
+
|
| 59 |
+
#### 3. **MainLifestyleAssistant** - Розумний lifestyle коуч
|
| 60 |
+
**Призначення:** Аналізує повідомлення і визначає найкращу дію для lifestyle сесії
|
| 61 |
+
|
| 62 |
+
**3 типи дій:**
|
| 63 |
+
```json
|
| 64 |
+
{
|
| 65 |
+
"message": "відповідь пацієнту",
|
| 66 |
+
"action": "gather_info|lifestyle_dialog|close",
|
| 67 |
+
"reasoning": "пояснення вибору дії"
|
| 68 |
+
}
|
| 69 |
+
```
|
| 70 |
+
|
| 71 |
+
- **gather_info** - збір додаткової інформації про стан, уподобання
|
| 72 |
+
- **lifestyle_dialog** - lifestyle коучинг та рекомендації
|
| 73 |
+
- **close** - завершення lifestyle сесії (медичні скарги, прохання, довга сесія)
|
| 74 |
+
|
| 75 |
+
### 🔄 Менеджери
|
| 76 |
+
|
| 77 |
+
#### **LifestyleSessionManager**
|
| 78 |
+
**Призначення:** Управляє lifecycle lifestyle сесій та розумно оновлює профіль
|
| 79 |
+
|
| 80 |
+
**Функції:**
|
| 81 |
+
- Суммаризація сесії без розростання даних
|
| 82 |
+
- Контроль розміру `journey_summary` (максимум 800 символів)
|
| 83 |
+
- Логування ключових моментів з датами
|
| 84 |
+
- Уникнення повторів інструкцій
|
| 85 |
+
|
| 86 |
+
## 🔄 Потік обробки повідомлень
|
| 87 |
+
|
| 88 |
+
### 1. **Entry Classification**
|
| 89 |
+
```
|
| 90 |
+
Повідомлення → EntryClassifier → K/V/T формат
|
| 91 |
+
├── V="off" → SoftMedicalTriage
|
| 92 |
+
├── V="on" → MainLifestyleAssistant
|
| 93 |
+
└── V="hybrid" → Гібридний потік
|
| 94 |
+
```
|
| 95 |
+
|
| 96 |
+
### 2. **Гібридний потік**
|
| 97 |
+
```
|
| 98 |
+
V="hybrid" → MedicalAssistant (тріаж)
|
| 99 |
+
→ TriageExitClassifier (оцінка готовності)
|
| 100 |
+
→ [lifestyle або medical режим]
|
| 101 |
+
```
|
| 102 |
+
|
| 103 |
+
### 3. **Lifestyle режим**
|
| 104 |
+
```
|
| 105 |
+
MainLifestyleAssistant → action
|
| 106 |
+
├── "gather_info" → збір інформації (продовжити lifestyle)
|
| 107 |
+
├── "lifestyle_dialog" → коучинг (продовжити lifestyle)
|
| 108 |
+
└── "close" → завершення → LifestyleSessionManager → medical режим
|
| 109 |
+
```
|
| 110 |
+
|
| 111 |
+
### 4. **Оновлення профілю**
|
| 112 |
+
```
|
| 113 |
+
Завершення lifestyle → LifestyleSessionManager
|
| 114 |
+
→ Аналіз сесії
|
| 115 |
+
→ Оновлення last_session_summary
|
| 116 |
+
→ Додавання до journey_summary
|
| 117 |
+
→ Контроль розміру даних
|
| 118 |
+
```
|
| 119 |
+
|
| 120 |
+
## 📊 Структура даних
|
| 121 |
+
|
| 122 |
+
### **SessionState**
|
| 123 |
+
```python
|
| 124 |
+
@dataclass
|
| 125 |
+
class SessionState:
|
| 126 |
+
current_mode: str # "medical" | "lifestyle" | "none"
|
| 127 |
+
is_active_session: bool
|
| 128 |
+
session_start_time: Optional[str]
|
| 129 |
+
last_controller_decision: Dict
|
| 130 |
+
lifestyle_session_length: int = 0 # Лічильник lifestyle повідомлень
|
| 131 |
+
last_triage_summary: str = "" # Результат медичного тріажу
|
| 132 |
+
entry_classification: Dict = None # K/V/T класифікація
|
| 133 |
+
```
|
| 134 |
+
|
| 135 |
+
### **Приклад оновлення профілю**
|
| 136 |
+
```json
|
| 137 |
+
{
|
| 138 |
+
"last_session_summary": "[04.09.2025] Обговорювали: питання про ходьбу; дієта з низьким вмістом солі",
|
| 139 |
+
"journey_summary": "...попередні записи... | 04.09.2025: 5 повідомлень"
|
| 140 |
+
}
|
| 141 |
+
```
|
| 142 |
+
|
| 143 |
+
## 🎯 Переваги поточної архітектури
|
| 144 |
+
|
| 145 |
+
### 1. **K/V/T формат**
|
| 146 |
+
- Простіший для розуміння ніж складні категорії
|
| 147 |
+
- Легше розширювати в майбутньому
|
| 148 |
+
- Консистентний timestamp для відстеження
|
| 149 |
+
|
| 150 |
+
### 2. **М'який медичний тріаж**
|
| 151 |
+
- Делікатніший підхід до пацієнтів
|
| 152 |
+
- Природні відповіді на вітання
|
| 153 |
+
- Не лякає одразу повним медичним режимом
|
| 154 |
+
|
| 155 |
+
### 3. **Розумний lifestyle асистент**
|
| 156 |
+
- Сам визначає коли збирати інформацію
|
| 157 |
+
- Сам вирішує коли давати поради
|
| 158 |
+
- Сам визначає коли завершувати сесію
|
| 159 |
+
- Менше API викликів
|
| 160 |
+
|
| 161 |
+
### 4. **Контрольоване оновлення профілю**
|
| 162 |
+
- Уникає розростання даних
|
| 163 |
+
- Зберігає тільки ключову інформацію
|
| 164 |
+
- Контролює розмір journey_summary
|
| 165 |
+
|
| 166 |
+
## 🧪 Тестування
|
| 167 |
+
|
| 168 |
+
### **Покриття тестами:**
|
| 169 |
+
- ✅ Entry Classifier K/V/T: 8/8
|
| 170 |
+
- ✅ Main Lifestyle Assistant: 7/7
|
| 171 |
+
- ✅ Lifecycle потоки: 3/3
|
| 172 |
+
- ✅ Profile Update: працює
|
| 173 |
+
- ✅ Всього тестів: 31/31
|
| 174 |
+
|
| 175 |
+
### **Тестові сценарії:**
|
| 176 |
+
```python
|
| 177 |
+
# K/V/T класифікація
|
| 178 |
+
"У мене болить голова" → V="off"
|
| 179 |
+
"Хочу почати займатися спортом" → V="on"
|
| 180 |
+
"Хочу займатися спортом, але у мене болить спина" → V="hybrid"
|
| 181 |
+
"Привіт" → V="off" (м'який тріаж)
|
| 182 |
+
|
| 183 |
+
# Main Lifestyle дії
|
| 184 |
+
"Хочу почати займатися спортом" → action="gather_info"
|
| 185 |
+
"Дайте мені поради щодо харчування" → action="lifestyle_dialog"
|
| 186 |
+
"У мене болить спина" → action="close"
|
| 187 |
+
```
|
| 188 |
+
|
| 189 |
+
## 🚀 Деплой та використання
|
| 190 |
+
|
| 191 |
+
### **Файли системи:**
|
| 192 |
+
```
|
| 193 |
+
├── app.py # Точка входу з create_app()
|
| 194 |
+
├── huggingface_space.py # HuggingFace Space entry point
|
| 195 |
+
├── lifestyle_app.py # Основна бізнес-логіка
|
| 196 |
+
├── core_classes.py # Класифікатори та асистенти
|
| 197 |
+
├── prompts.py # Промпти для Gemini API
|
| 198 |
+
├── gradio_interface.py # UI інтерфейс
|
| 199 |
+
├── requirements.txt # Залежності
|
| 200 |
+
└── README.md # Документація для HF Space
|
| 201 |
+
```
|
| 202 |
+
|
| 203 |
+
### **Змінні оточення:**
|
| 204 |
+
```bash
|
| 205 |
+
GEMINI_API_KEY=your_api_key # Обов'язково
|
| 206 |
+
LOG_PROMPTS=true # Опціонально для debug
|
| 207 |
+
```
|
| 208 |
+
|
| 209 |
+
### **Запуск:**
|
| 210 |
+
```bash
|
| 211 |
+
# Локально
|
| 212 |
+
python app.py
|
| 213 |
+
|
| 214 |
+
# HuggingFace Space
|
| 215 |
+
# Автоматично через huggingface_space.py
|
| 216 |
+
```
|
| 217 |
+
|
| 218 |
+
## 📈 Метрики та моніторинг
|
| 219 |
+
|
| 220 |
+
### **Автоматично відстежується:**
|
| 221 |
+
- Кількість API викликів до Gemini
|
| 222 |
+
- Розподіл по режимах (medical/lifestyle)
|
| 223 |
+
- Тривалість lifestyle сесій
|
| 224 |
+
- Частота оновлень профілю
|
| 225 |
+
|
| 226 |
+
### **Логування (LOG_PROMPTS=true):**
|
| 227 |
+
- Всі промпти до Gemini API з типом виклику
|
| 228 |
+
- Повні відповіді LLM з timestamps
|
| 229 |
+
- Класифікаційні рішення та обґрунтування
|
| 230 |
+
- Метрики продуктивності
|
| 231 |
+
|
| 232 |
+
## 🔮 Майбутні покращення
|
| 233 |
+
|
| 234 |
+
### **Короткострокові:**
|
| 235 |
+
- Покращення розпізнавання прохань про завершення
|
| 236 |
+
- Додавання timeout для lifestyle сесій
|
| 237 |
+
- Оптимізація промптів на основі реальних тестів
|
| 238 |
+
|
| 239 |
+
### **Довгострокові:**
|
| 240 |
+
- Додавання нових типів класифі��ації
|
| 241 |
+
- Інтеграція з медичними системами
|
| 242 |
+
- Персоналізація на основі історії взаємодій
|
| 243 |
+
- A/B тестування різних підходів
|
| 244 |
+
|
| 245 |
+
---
|
| 246 |
+
|
| 247 |
+
**Система готова до продакшену з чистою архітектурою та розумною логікою!** 🚀
|
FIXES_AND_CLEANUP.md
DELETED
|
@@ -1,109 +0,0 @@
|
|
| 1 |
-
# Виправлення тестів та очищення prompts.py
|
| 2 |
-
|
| 3 |
-
## ✅ Виправлення мок логіки в тестах
|
| 4 |
-
|
| 5 |
-
### Проблема:
|
| 6 |
-
- Main Lifestyle Assistant тести показували невідповідності
|
| 7 |
-
- Мок логіка неправильно розпізнавала `gather_info` vs `lifestyle_dialog`
|
| 8 |
-
|
| 9 |
-
### Виправлення:
|
| 10 |
-
|
| 11 |
-
#### 1. **Покращена мок логіка для MAIN_LIFESTYLE:**
|
| 12 |
-
```python
|
| 13 |
-
# Додано більш точні ключові слова для gather_info
|
| 14 |
-
elif any(keyword in user_prompt.lower() for keyword in [
|
| 15 |
-
"як почати", "що робити", "які вправи", "як мені", "підходять для мене"
|
| 16 |
-
]):
|
| 17 |
-
return "gather_info"
|
| 18 |
-
|
| 19 |
-
# Спеціальна логіка для початку lifestyle сесії
|
| 20 |
-
elif "хочу почати" in user_prompt.lower() and "спорт" in user_prompt.lower():
|
| 21 |
-
return "gather_info"
|
| 22 |
-
```
|
| 23 |
-
|
| 24 |
-
#### 2. **Розширені тестові кейси:**
|
| 25 |
-
```python
|
| 26 |
-
test_cases = [
|
| 27 |
-
("Хочу почати займатися спортом", "gather_info", "Збір інформації"),
|
| 28 |
-
("Які вправи підходять для мене?", "gather_info", "Потрібна додаткова інформація"),
|
| 29 |
-
("Як почати тренуватися?", "gather_info", "Питання про початок"),
|
| 30 |
-
("Продовжуємо наші тренування", "lifestyle_dialog", "Продовження lifestyle діалогу"),
|
| 31 |
-
# ... інші кейси
|
| 32 |
-
]
|
| 33 |
-
```
|
| 34 |
-
|
| 35 |
-
### Результат:
|
| 36 |
-
- ✅ **Main Lifestyle Assistant: 7/7 тестів пройдено**
|
| 37 |
-
- ✅ Всі інші тести залишилися стабільними
|
| 38 |
-
|
| 39 |
-
## 🧹 Очищення prompts.py
|
| 40 |
-
|
| 41 |
-
### Структурні зміни:
|
| 42 |
-
|
| 43 |
-
#### 1. **Нова організація файлу:**
|
| 44 |
-
```
|
| 45 |
-
# ===== АКТИВНІ ПРОМПТИ =====
|
| 46 |
-
# ===== КЛАСИФІКАТОРИ =====
|
| 47 |
-
# ===== АСИСТЕНТИ =====
|
| 48 |
-
# ===== MAIN LIFESTYLE ASSISTANT (НОВИЙ) =====
|
| 49 |
-
# ===== ПРОМПТ ФУНКЦІЇ =====
|
| 50 |
-
# ===== DEPRECATED ПРОМПТИ =====
|
| 51 |
-
```
|
| 52 |
-
|
| 53 |
-
#### 2. **Позначення deprecated промптів:**
|
| 54 |
-
- `SYSTEM_PROMPT_SESSION_CONTROLLER` → DEPRECATED
|
| 55 |
-
- `SYSTEM_PROMPT_LIFESTYLE_EXIT_CLASSIFIER` → DEPRECATED
|
| 56 |
-
- `SYSTEM_PROMPT_LIFESTYLE_ASSISTANT` → DEPRECATED (замінено на MAIN_LIFESTYLE)
|
| 57 |
-
- `PROMPT_LIFESTYLE_ASSISTANT` → DEPRECATED
|
| 58 |
-
|
| 59 |
-
#### 3. **Активні промпти:**
|
| 60 |
-
- ✅ `SYSTEM_PROMPT_ENTRY_CLASSIFIER` - активний
|
| 61 |
-
- ✅ `SYSTEM_PROMPT_TRIAGE_EXIT_CLASSIFIER` - активний
|
| 62 |
-
- ✅ `SYSTEM_PROMPT_MEDICAL_ASSISTANT` - активний
|
| 63 |
-
- ✅ `SYSTEM_PROMPT_MAIN_LIFESTYLE` - новий, активний
|
| 64 |
-
|
| 65 |
-
### Переваги очищення:
|
| 66 |
-
|
| 67 |
-
1. **Чітка структура** - легко знайти потрібний промпт
|
| 68 |
-
2. **Позначення статусу** - зрозуміло що активне, що deprecated
|
| 69 |
-
3. **Зворотна сумісність** - старі промпти залишені для сумісності
|
| 70 |
-
4. **Документованість** - коментарі пояснюють призначення
|
| 71 |
-
|
| 72 |
-
## 📊 Фінальні результати тестування
|
| 73 |
-
|
| 74 |
-
### Всі тести пройдено успішно:
|
| 75 |
-
- ✅ **Entry Classifier:** 8/8 тестів
|
| 76 |
-
- ✅ **Lifecycle потоки:** 3/3 сценарії
|
| 77 |
-
- ✅ **Lifestyle Exit:** 8/8 тестів (deprecated, але працює)
|
| 78 |
-
- ✅ **Neutral взаємодії:** 5/5 тестів
|
| 79 |
-
- ✅ **Main Lifestyle Assistant:** 7/7 тестів ← **ВИПРАВЛЕНО**
|
| 80 |
-
- ✅ **Profile Update:** працює правильно
|
| 81 |
-
|
| 82 |
-
### Покриття функціональності:
|
| 83 |
-
- 🎯 Entry classification з NEUTRAL категорією
|
| 84 |
-
- 🔄 Hybrid потоки з тріажем
|
| 85 |
-
- 💚 Main Lifestyle з 3 діями (gather_info, lifestyle_dialog, close)
|
| 86 |
-
- 🤝 Природні нейтральні взаємодії
|
| 87 |
-
- 📝 Розумне оновлення профілю
|
| 88 |
-
|
| 89 |
-
## 🚀 Готовність системи
|
| 90 |
-
|
| 91 |
-
**Система повністю готова:**
|
| 92 |
-
- ✅ Всі тести проходять
|
| 93 |
-
- ✅ Мок логіка виправлена
|
| 94 |
-
- ✅ Prompts.py очищено та структуровано
|
| 95 |
-
- ✅ Зворотна сумісність збережена
|
| 96 |
-
- ✅ Документація оновлена
|
| 97 |
-
|
| 98 |
-
**Активні компоненти:**
|
| 99 |
-
- `EntryClassifier` з NEUTRAL підтримкою
|
| 100 |
-
- `MainLifestyleAssistant` з 3 діями
|
| 101 |
-
- `TriageExitClassifier` для hybrid потоків
|
| 102 |
-
- `MedicalAssistant` без змін
|
| 103 |
-
|
| 104 |
-
**Deprecated (але працюючі):**
|
| 105 |
-
- `SessionController` - старий контролер
|
| 106 |
-
- `LifestyleExitClassifier` - замінено на Main Lifestyle логіку
|
| 107 |
-
- `LifestyleAssistant` - замінено на MainLifestyleAssistant
|
| 108 |
-
|
| 109 |
-
Система готова до продакшену з новою розумною логікою!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IMPLEMENTATION_SUMMARY.md
DELETED
|
@@ -1,131 +0,0 @@
|
|
| 1 |
-
# Імплементація нової логіки - Підсумок
|
| 2 |
-
|
| 3 |
-
## ✅ Що було зроблено
|
| 4 |
-
|
| 5 |
-
### 1. Створено нові класифікатори
|
| 6 |
-
|
| 7 |
-
**EntryClassifier** (`core_classes.py`)
|
| 8 |
-
- Класифікує повідомлення як MEDICAL/LIFESTYLE/HYBRID
|
| 9 |
-
- Промпт: `SYSTEM_PROMPT_ENTRY_CLASSIFIER`
|
| 10 |
-
- Метод: `classify(user_message, clinical_background)`
|
| 11 |
-
|
| 12 |
-
**TriageExitClassifier** (`core_classes.py`)
|
| 13 |
-
- Оцінює готовність до lifestyle після медичного тріажу
|
| 14 |
-
- Промпт: `SYSTEM_PROMPT_TRIAGE_EXIT_CLASSIFIER`
|
| 15 |
-
- Метод: `assess_readiness(clinical_background, triage_summary, user_message)`
|
| 16 |
-
|
| 17 |
-
**LifestyleExitClassifier** (`core_classes.py`)
|
| 18 |
-
- Визначає чи потрібно завершити lifestyle сесію
|
| 19 |
-
- Промпт: `SYSTEM_PROMPT_LIFESTYLE_EXIT_CLASSIFIER`
|
| 20 |
-
- Метод: `should_exit(lifestyle_session_length, recent_messages, user_message)`
|
| 21 |
-
|
| 22 |
-
### 2. Додано LifestyleSessionManager
|
| 23 |
-
|
| 24 |
-
**LifestyleSessionManager** (`core_classes.py`)
|
| 25 |
-
- Розумно оновлює lifestyle профіль після сесії
|
| 26 |
-
- Контролює розмір `journey_summary` (максимум 800 символів)
|
| 27 |
-
- Уникає повторів та розростання даних
|
| 28 |
-
- Метод: `update_profile_after_session(lifestyle_profile, chat_history, session_summary)`
|
| 29 |
-
|
| 30 |
-
### 3. Оновлено SessionState
|
| 31 |
-
|
| 32 |
-
Додано нові поля:
|
| 33 |
-
```python
|
| 34 |
-
lifestyle_session_length: int = 0
|
| 35 |
-
last_triage_summary: str = ""
|
| 36 |
-
entry_classification: Dict = None
|
| 37 |
-
```
|
| 38 |
-
|
| 39 |
-
### 4. Переписано process_message()
|
| 40 |
-
|
| 41 |
-
**Нова логіка в `lifestyle_app.py`:**
|
| 42 |
-
- `_handle_entry_classification()` - обробка через Entry Classifier
|
| 43 |
-
- `_handle_hybrid_flow()` - HYBRID потік з тріажем
|
| 44 |
-
- `_handle_lifestyle_mode()` - lifecycle управління lifestyle сесій
|
| 45 |
-
|
| 46 |
-
### 5. Створено нові промпти
|
| 47 |
-
|
| 48 |
-
**В `prompts.py`:**
|
| 49 |
-
- `SYSTEM_PROMPT_ENTRY_CLASSIFIER`
|
| 50 |
-
- `SYSTEM_PROMPT_TRIAGE_EXIT_CLASSIFIER`
|
| 51 |
-
- `SYSTEM_PROMPT_LIFESTYLE_EXIT_CLASSIFIER`
|
| 52 |
-
- Відповідні функції промптів з контекстом
|
| 53 |
-
|
| 54 |
-
## 🔄 Логіка роботи
|
| 55 |
-
|
| 56 |
-
### Entry Classification
|
| 57 |
-
```
|
| 58 |
-
Повідомлення → EntryClassifier → MEDICAL/LIFESTYLE/HYBRID
|
| 59 |
-
```
|
| 60 |
-
|
| 61 |
-
### Потоки обробки
|
| 62 |
-
```
|
| 63 |
-
MEDICAL → MedicalAssistant → medical режим
|
| 64 |
-
LIFESTYLE → LifestyleAssistant → lifestyle режим
|
| 65 |
-
HYBRID → MedicalAssistant → TriageExitClassifier → [lifestyle або medical]
|
| 66 |
-
```
|
| 67 |
-
|
| 68 |
-
### Lifestyle Lifecycle
|
| 69 |
-
```
|
| 70 |
-
lifestyle режим → LifestyleExitClassifier → [продовжити або завершити]
|
| 71 |
-
якщо завершити → LifestyleSessionManager.update_profile → medical режим
|
| 72 |
-
```
|
| 73 |
-
|
| 74 |
-
## 🧪 Тестування
|
| 75 |
-
|
| 76 |
-
**Створено `test_new_logic.py`:**
|
| 77 |
-
- Мок класи без залежностей від API
|
| 78 |
-
- Тести всіх класифікаторів
|
| 79 |
-
- Тести lifecycle потоків
|
| 80 |
-
- Тести оновлення профілю
|
| 81 |
-
|
| 82 |
-
**Результати тестів:**
|
| 83 |
-
- ✅ Entry Classifier: 4/4 тести пройдено
|
| 84 |
-
- ✅ Lifecycle потоки: всі сценарії працюють
|
| 85 |
-
- ✅ Profile Update: успішне оновлення без розростання
|
| 86 |
-
- ⚠️ Lifestyle Exit: потребує покращення розпізнавання прохань
|
| 87 |
-
|
| 88 |
-
## 📋 Файли змінено
|
| 89 |
-
|
| 90 |
-
1. **`prompts.py`** - додано нові промпти для класифікаторів
|
| 91 |
-
2. **`core_classes.py`** - додано нові класи та оновлено SessionState
|
| 92 |
-
3. **`lifestyle_app.py`** - переписано process_message() з новою логікою
|
| 93 |
-
4. **`NEW_LOGIC_IMPLEMENTATION.md`** - детальна документація
|
| 94 |
-
5. **`test_new_logic.py`** - тестовий скрипт
|
| 95 |
-
6. **`IMPLEMENTATION_SUMMARY.md`** - цей файл
|
| 96 |
-
|
| 97 |
-
## 🔧 Зворотна сумісність
|
| 98 |
-
|
| 99 |
-
- Старий `SessionController` залишено (deprecated)
|
| 100 |
-
- Всі існуючі методи працюють без змін
|
| 101 |
-
- Testing Lab повністю сумісний
|
| 102 |
-
- API інтерфейс не змінено
|
| 103 |
-
|
| 104 |
-
## 🚀 Готовність до використання
|
| 105 |
-
|
| 106 |
-
**Система готова до використання:**
|
| 107 |
-
- ✅ Синтаксис коду перевірено
|
| 108 |
-
- ✅ Логіка протестована
|
| 109 |
-
- ✅ Документація створена
|
| 110 |
-
- ✅ Зворотна сумісність забезпечена
|
| 111 |
-
|
| 112 |
-
**Для запуску потрібно:**
|
| 113 |
-
1. Встановити залежності (google-genai, gradio тощо)
|
| 114 |
-
2. Налаштувати GEMINI_API_KEY
|
| 115 |
-
3. Запустити додаток як зазвичай
|
| 116 |
-
|
| 117 |
-
## 🎯 Переваги нової логіки
|
| 118 |
-
|
| 119 |
-
1. **Точніша класифікація** - спеціалізовані класифікатори для різних етапів
|
| 120 |
-
2. **Гібридна обробка** - медичний тріаж + lifestyle в одному запиті
|
| 121 |
-
3. **Контрольований lifecycle** - структуроване управління lifestyle сесіями
|
| 122 |
-
4. **Розумне оновлення профілю** - без розростання даних
|
| 123 |
-
5. **Краща UX** - плавні переходи між режимами
|
| 124 |
-
|
| 125 |
-
## 📈 Наступні кроки
|
| 126 |
-
|
| 127 |
-
1. Протестувати з реальним Gemini API
|
| 128 |
-
2. Покращити розпізнавання прохань про завершення в LifestyleExitClassifier
|
| 129 |
-
3. Додати метрики для аналізу ефективності класифікаторів
|
| 130 |
-
4. Розглянути додавання timeout для lifestyle сесій
|
| 131 |
-
5. Оптимізувати промпти на основі реальних тестів
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
INSTRUCTION_TEST.md
DELETED
|
@@ -1,222 +0,0 @@
|
|
| 1 |
-
# 🧪 Testing Lab - Інструкція користувача
|
| 2 |
-
|
| 3 |
-
## 🎯 Призначення
|
| 4 |
-
|
| 5 |
-
**Testing Lab** дозволяє тестувати Lifestyle Journey з різними профілями пацієнтів для оцінки якості роботи системи, точності Session Controller та персоналізації відповідей.
|
| 6 |
-
|
| 7 |
-
## 🚀 Швидкий старт
|
| 8 |
-
|
| 9 |
-
### 1. Підготовка тестових файлів
|
| 10 |
-
|
| 11 |
-
Створіть два JSON файли для кожного тестового пацієнта:
|
| 12 |
-
|
| 13 |
-
**clinical_background.json** - медичний профіль:
|
| 14 |
-
```json
|
| 15 |
-
{
|
| 16 |
-
"patient_summary": {
|
| 17 |
-
"active_problems": ["Діагнози", "Скарги"],
|
| 18 |
-
"current_medications": ["Ліки"],
|
| 19 |
-
"allergies": "Алергії"
|
| 20 |
-
},
|
| 21 |
-
"vital_signs_and_measurements": ["Показники"],
|
| 22 |
-
"critical_alerts": ["Важливі попередження"],
|
| 23 |
-
"assessment_and_plan": "План лікування"
|
| 24 |
-
}
|
| 25 |
-
```
|
| 26 |
-
|
| 27 |
-
**lifestyle_profile.json** - lifestyle профіль:
|
| 28 |
-
```json
|
| 29 |
-
{
|
| 30 |
-
"patient_name": "Ім'я пацієнта",
|
| 31 |
-
"patient_age": "Вік",
|
| 32 |
-
"conditions": ["Хронічні стани"],
|
| 33 |
-
"primary_goal": "Головна ціль",
|
| 34 |
-
"exercise_limitations": ["Обмеження"]
|
| 35 |
-
}
|
| 36 |
-
```
|
| 37 |
-
|
| 38 |
-
### 2. Завантаження пацієнта
|
| 39 |
-
|
| 40 |
-
1. Відкрийте закладку **🧪 Testing Lab**
|
| 41 |
-
2. Завантажте обидва JSON файли
|
| 42 |
-
3. Натисніть **📋 Завантажити пацієнта**
|
| 43 |
-
4. Перевірте попередній перегляд профілю
|
| 44 |
-
|
| 45 |
-
### 3. Проведення тестування
|
| 46 |
-
|
| 47 |
-
1. Перейдіть на закладку **💬 Чат з пацієнтом**
|
| 48 |
-
2. Почніть діалог - тестова сесія автоматично почнеться
|
| 49 |
-
3. Тестуйте різні сценарії:
|
| 50 |
-
- Medical запити з red flags
|
| 51 |
-
- Lifestyle коучинг запити
|
| 52 |
-
- Складні змішані ситуації
|
| 53 |
-
|
| 54 |
-
### 4. Завершення та аналіз
|
| 55 |
-
|
| 56 |
-
1. Поверніться в **🧪 Testing Lab**
|
| 57 |
-
2. Додайте нотатки в поле **"Нотатки до завершення сесії"**
|
| 58 |
-
3. Натисніть **⏹️ Завершити тестову сесію**
|
| 59 |
-
4. Перевірте результати в **📊 Результати тестування**
|
| 60 |
-
|
| 61 |
-
## 📊 Що логується
|
| 62 |
-
|
| 63 |
-
### Автоматичні метрики:
|
| 64 |
-
- **Загальна кількість повідомлень**
|
| 65 |
-
- **Розподіл по режимах** (medical/lifestyle)
|
| 66 |
-
- **Кількість ескалацій**
|
| 67 |
-
- **Тривалість сесії**
|
| 68 |
-
- **Час відповіді системи**
|
| 69 |
-
- **Рішення Controller** з обґрунтуванням
|
| 70 |
-
|
| 71 |
-
### Збережувані дані:
|
| 72 |
-
- **Повна історія чату**
|
| 73 |
-
- **Стан профілю до/після** тестування
|
| 74 |
-
- **Metadata сесії** з timestamps
|
| 75 |
-
- **Нотатки тестувальника**
|
| 76 |
-
|
| 77 |
-
## 🎯 Тестові сценарії
|
| 78 |
-
|
| 79 |
-
### Сценарій 1: Medical Red Flags
|
| 80 |
-
**Мета:** Перевірити швидкість виявлення ургентних станів
|
| 81 |
-
|
| 82 |
-
**Тестові фрази:**
|
| 83 |
-
```
|
| 84 |
-
"У мене сильний біль у грудях"
|
| 85 |
-
"Тиск 200/120, що робити?"
|
| 86 |
-
"Втрачаю свідомість часто"
|
| 87 |
-
"Рівень цукру 25 ммоль/л"
|
| 88 |
-
```
|
| 89 |
-
|
| 90 |
-
**Очікуваний результат:**
|
| 91 |
-
- Controller → medical режим
|
| 92 |
-
- escalation_needed = true
|
| 93 |
-
- Швидка ескалація до MRE
|
| 94 |
-
|
| 95 |
-
### Сценарій 2: Lifestyle Coaching
|
| 96 |
-
**Мета:** Оцінити персоналізацію lifestyle порад
|
| 97 |
-
|
| 98 |
-
**Тестові фрази:**
|
| 99 |
-
```
|
| 100 |
-
"Хочу почати займатися спортом"
|
| 101 |
-
"Допоможіть скласти план харчування"
|
| 102 |
-
"Які вправи підійдуть при моєму діагнозі?"
|
| 103 |
-
"Не виходить дотримуватись дієти"
|
| 104 |
-
```
|
| 105 |
-
|
| 106 |
-
**Очікуваний результат:**
|
| 107 |
-
- Controller → lifestyle режим
|
| 108 |
-
- Урахування медичних обмежень
|
| 109 |
-
- Персоналізовані поради
|
| 110 |
-
- Оновлення профілю
|
| 111 |
-
|
| 112 |
-
### Сценарій 3: Edge Cases
|
| 113 |
-
**Мета:** Тестування складних ситуацій
|
| 114 |
-
|
| 115 |
-
**Тестові фрази:**
|
| 116 |
-
```
|
| 117 |
-
"Болить спина після вправ, що ви радили"
|
| 118 |
-
"Чи можна бігати з моєю гіпертонією?"
|
| 119 |
-
"Втомлююсь швидко, але хочу тренуватись"
|
| 120 |
-
```
|
| 121 |
-
|
| 122 |
-
**Очікуваний результат:**
|
| 123 |
-
- Правильна ідентифікація змішаних запитів
|
| 124 |
-
- Баланс між безпекою та мотивацією
|
| 125 |
-
- Відповідні рекомендації
|
| 126 |
-
|
| 127 |
-
## 📈 Аналіз результатів
|
| 128 |
-
|
| 129 |
-
### Ключові показники якості:
|
| 130 |
-
|
| 131 |
-
**1. Точність Session Controller:**
|
| 132 |
-
- % правильно ідентифікованих medical запитів
|
| 133 |
-
- % правильно ідентифікованих lifestyle запитів
|
| 134 |
-
- Кількість помилкових ескалацій
|
| 135 |
-
|
| 136 |
-
**2. Безпека системи:**
|
| 137 |
-
- % виявлених red flags
|
| 138 |
-
- Швидкість ескалації ургентних станів
|
| 139 |
-
- Відсутність пропущених critical alerts
|
| 140 |
-
|
| 141 |
-
**3. Персоналізація:**
|
| 142 |
-
- Врахування медичних обмежень у lifestyle порадах
|
| 143 |
-
- Адаптація до індивідуальних цілей
|
| 144 |
-
- Якість оновлення профілю
|
| 145 |
-
|
| 146 |
-
**4. User Experience:**
|
| 147 |
-
- Середній час відповіді
|
| 148 |
-
- Зрозумілість відповідей
|
| 149 |
-
- Мотиваційний тон lifestyle коучинга
|
| 150 |
-
|
| 151 |
-
## 💾 Експорт та звітність
|
| 152 |
-
|
| 153 |
-
### CSV експорт включає:
|
| 154 |
-
- **session_id** - унікальний ID сесії
|
| 155 |
-
- **patient_name** - ім'я тестового пацієнта
|
| 156 |
-
- **timestamp** - час проведення тесту
|
| 157 |
-
- **total_messages** - загальна кількість повідомлень
|
| 158 |
-
- **medical_messages** - повідомлення в medical режимі
|
| 159 |
-
- **lifestyle_messages** - повідомлення в lifestyle режимі
|
| 160 |
-
- **escalations_count** - кількість ескалацій
|
| 161 |
-
- **session_duration_minutes** - тривалість в хвилинах
|
| 162 |
-
- **notes** - нотатки тестувальника
|
| 163 |
-
|
| 164 |
-
### Автоматичний звіт містить:
|
| 165 |
-
- **Загальна статистика** по всім сесіям
|
| 166 |
-
- **Розподіл по режимах** (відсотки)
|
| 167 |
-
- **Rate ескалацій**
|
| 168 |
-
- **Статистика по пацієнтах**
|
| 169 |
-
- **Часовий період тестування**
|
| 170 |
-
|
| 171 |
-
## 🔧 Налаштування для різних цілей
|
| 172 |
-
|
| 173 |
-
### Тестування медичної точності:
|
| 174 |
-
- Використовуйте пацієнтів з критичними станами
|
| 175 |
-
- Фокусуйтесь на red flags сценаріях
|
| 176 |
-
- Аналізуйте швидкість ескалації
|
| 177 |
-
|
| 178 |
-
### Тестування lifestyle персоналізації:
|
| 179 |
-
- Створюйте пацієнтів з унікальними обмеженнями
|
| 180 |
-
- Тестуйте довготривалі lifestyle journey
|
| 181 |
-
- Відстежуйте еволюцію профілю
|
| 182 |
-
|
| 183 |
-
### Stress тестування:
|
| 184 |
-
- Швидка зміна контексту (medical ↔ lifestyle)
|
| 185 |
-
- Довгі сесії (20+ повідомлень)
|
| 186 |
-
- Неоднозначні запити
|
| 187 |
-
|
| 188 |
-
## ⚠️ Важливі зауваження
|
| 189 |
-
|
| 190 |
-
**Конфіденційність:**
|
| 191 |
-
- Не використовуйте реальні імена пацієнтів
|
| 192 |
-
- Анонімізуйте медичні дані
|
| 193 |
-
- Результати зберігаються локально
|
| 194 |
-
|
| 195 |
-
**Валідація JSON:**
|
| 196 |
-
- Система автоматично валідує структуру файлів
|
| 197 |
-
- Перевіряйте повідомлення про помилки валідації
|
| 198 |
-
- Використовуйте правильні типи даних (списки, строки)
|
| 199 |
-
|
| 200 |
-
**Обмеження:**
|
| 201 |
-
- Максимум 1 активна тестова сесія
|
| 202 |
-
- JSON файли до 10MB
|
| 203 |
-
- Рекомендована тривалість сесії: 10-30 хвилин
|
| 204 |
-
|
| 205 |
-
## 📞 Troubleshooting
|
| 206 |
-
|
| 207 |
-
**Помилка завантаження файлів:**
|
| 208 |
-
- Перевірте синтаксис JSON
|
| 209 |
-
- Переконайтесь в наявності обов'язкових полів
|
| 210 |
-
- Перевірте кодування файлів (UTF-8)
|
| 211 |
-
|
| 212 |
-
**Сесія не логується:**
|
| 213 |
-
- Переконайтесь, що пацієнт завантажений через Testing Lab
|
| 214 |
-
- Перевірте чи активний тестовий режим (індикатор в статус панелі)
|
| 215 |
-
|
| 216 |
-
**Експорт не працює:**
|
| 217 |
-
- Переконайтесь в наявності збережених сесій
|
| 218 |
-
- Перевірте права запису в папку testing_results/
|
| 219 |
-
|
| 220 |
-
---
|
| 221 |
-
|
| 222 |
-
**Успішного тестування!** 🚀
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MAIN_LIFESTYLE_REFACTOR.md
DELETED
|
@@ -1,146 +0,0 @@
|
|
| 1 |
-
# Рефакторинг Lifestyle режиму - Main Lifestyle Assistant
|
| 2 |
-
|
| 3 |
-
## 🎯 Концепція змін
|
| 4 |
-
|
| 5 |
-
**Було:** 2 окремі промпти
|
| 6 |
-
- `LIFESTYLE_ASSISTANT` - генерує відповіді
|
| 7 |
-
- `LIFESTYLE_EXIT_CLASSIFIER` - перевіряє чи потрібно завершити сесію
|
| 8 |
-
|
| 9 |
-
**Стало:** 1 розумний промпт
|
| 10 |
-
- `MAIN_LIFESTYLE_ASSISTANT` - сам визначає дію і генерує відповідь
|
| 11 |
-
|
| 12 |
-
## 🔧 Нова архітектура
|
| 13 |
-
|
| 14 |
-
### Main Lifestyle Prompt → 3 Actions
|
| 15 |
-
|
| 16 |
-
**Структура відповіді:**
|
| 17 |
-
```json
|
| 18 |
-
{
|
| 19 |
-
"message": "відповідь пацієнту українською мовою",
|
| 20 |
-
"action": "gather_info|lifestyle_dialog|close",
|
| 21 |
-
"reasoning": "пояснення вибору дії"
|
| 22 |
-
}
|
| 23 |
-
```
|
| 24 |
-
|
| 25 |
-
### 3 типи дій:
|
| 26 |
-
|
| 27 |
-
#### 1. **gather_info** - збір інформації
|
| 28 |
-
- Коли потрібно дізнатися більше про стан, уподобання, обмеження
|
| 29 |
-
- Коли пацієнт дає неповну інформацію
|
| 30 |
-
- Коли потрібно уточнити деталі для кращих рекомендацій
|
| 31 |
-
|
| 32 |
-
#### 2. **lifestyle_dialog** - lifestyle діалог
|
| 33 |
-
- Надання конкретних порад щодо фізичної активності, харчування
|
| 34 |
-
- Мотивація та підтримка пацієнта
|
| 35 |
-
- Обговорення прогресу та планів
|
| 36 |
-
- Основна робота lifestyle коуча
|
| 37 |
-
|
| 38 |
-
#### 3. **close** - завершення сесії
|
| 39 |
-
- Коли з'являються медичні скарги або симптоми
|
| 40 |
-
- Коли пацієнт просить завершити сесію
|
| 41 |
-
- Коли сесія триває надто довго (>8-10 повідомлень)
|
| 42 |
-
- Коли досягнуто природної точки завершення
|
| 43 |
-
|
| 44 |
-
## 💻 Технічна імплементація
|
| 45 |
-
|
| 46 |
-
### 1. **Новий промпт**
|
| 47 |
-
```python
|
| 48 |
-
SYSTEM_PROMPT_MAIN_LIFESTYLE = """
|
| 49 |
-
Ти - розумний lifestyle coach для пацієнтів з хронічними захворюваннями.
|
| 50 |
-
ТВОЄ ЗАВДАННЯ: Аналізувати повідомлення пацієнта і визначати найкращу дію для lifestyle сесії.
|
| 51 |
-
...
|
| 52 |
-
"""
|
| 53 |
-
```
|
| 54 |
-
|
| 55 |
-
### 2. **Новий клас MainLifestyleAssistant**
|
| 56 |
-
```python
|
| 57 |
-
class MainLifestyleAssistant:
|
| 58 |
-
def process_message(self, user_message, chat_history, clinical_background,
|
| 59 |
-
lifestyle_profile, session_length) -> Dict:
|
| 60 |
-
# Повертає: {"message": "...", "action": "...", "reasoning": "..."}
|
| 61 |
-
```
|
| 62 |
-
|
| 63 |
-
### 3. **Оновлена логіка _handle_lifestyle_mode()**
|
| 64 |
-
```python
|
| 65 |
-
def _handle_lifestyle_mode(self, message: str) -> Tuple[str, str]:
|
| 66 |
-
result = self.main_lifestyle_assistant.process_message(...)
|
| 67 |
-
|
| 68 |
-
if result["action"] == "close":
|
| 69 |
-
# Завершуємо сесію + оновлюємо профіль + перехід в medical
|
| 70 |
-
else:
|
| 71 |
-
# Продовжуємо lifestyle (gather_info або lifestyle_dialog)
|
| 72 |
-
```
|
| 73 |
-
|
| 74 |
-
## 🎯 Переваги нової логіки
|
| 75 |
-
|
| 76 |
-
### 1. **Спрощення архітектури**
|
| 77 |
-
- 1 промпт замість 2
|
| 78 |
-
- Менше API викликів
|
| 79 |
-
- Простіша логіка обробки
|
| 80 |
-
|
| 81 |
-
### 2. **Розумніше прийняття рішень**
|
| 82 |
-
- Асистент сам визначає коли збирати інформацію
|
| 83 |
-
- Сам вирішує коли давати поради
|
| 84 |
-
- Сам визначає коли завершувати сесію
|
| 85 |
-
|
| 86 |
-
### 3. **Краща контекстуальність**
|
| 87 |
-
- Одночасний доступ до всієї інформації
|
| 88 |
-
- Більш природні переходи між діями
|
| 89 |
-
- Кращий контроль тривалості сесії
|
| 90 |
-
|
| 91 |
-
### 4. **Гнучкість**
|
| 92 |
-
- Легко додати нові дії в майбутньому
|
| 93 |
-
- Простіше налаштовувати поведінку
|
| 94 |
-
- Кращий контроль над потоком розмови
|
| 95 |
-
|
| 96 |
-
## 🧪 Результати тестування
|
| 97 |
-
|
| 98 |
-
**Main Lifestyle Assistant тести:**
|
| 99 |
-
- ✅ Медичні скарги → `close` (правильно завершує)
|
| 100 |
-
- ✅ Прохання про завершення → `close` (розпізнає бажання)
|
| 101 |
-
- ✅ Lifestyle поради → `lifestyle_dialog` (надає рекомендації)
|
| 102 |
-
- ⚠️ Збір інформації → потребує покращення мок логіки
|
| 103 |
-
|
| 104 |
-
**Загальні тести:**
|
| 105 |
-
- ✅ Entry Classifier: 8/8 пройдено
|
| 106 |
-
- ✅ Neutral взаємодії: 5/5 пройдено
|
| 107 |
-
- ✅ Lifestyle Exit (deprecated): 8/8 пройдено
|
| 108 |
-
- ✅ Profile Update: працює правильно
|
| 109 |
-
|
| 110 |
-
## 📋 Файли змінено
|
| 111 |
-
|
| 112 |
-
1. **`prompts.py`**
|
| 113 |
-
- Додано `SYSTEM_PROMPT_MAIN_LIFESTYLE`
|
| 114 |
-
- Додано `PROMPT_MAIN_LIFESTYLE()`
|
| 115 |
-
|
| 116 |
-
2. **`core_classes.py`**
|
| 117 |
-
- Додано `MainLifestyleAssistant` клас
|
| 118 |
-
- Оновлено імпорти
|
| 119 |
-
|
| 120 |
-
3. **`lifestyle_app.py`**
|
| 121 |
-
- Оновлено `_handle_lifestyle_mode()`
|
| 122 |
-
- Оновлено `_handle_entry_classification()`
|
| 123 |
-
- Оновлено `_handle_hybrid_flow()`
|
| 124 |
-
- Додано `self.main_lifestyle_assistant`
|
| 125 |
-
|
| 126 |
-
4. **`test_new_logic.py`**
|
| 127 |
-
- Додано мок для `MAIN_LIFESTYLE`
|
| 128 |
-
- Додано `test_main_lifestyle_assistant()`
|
| 129 |
-
|
| 130 |
-
## 🚀 Готовність
|
| 131 |
-
|
| 132 |
-
**Система готова:**
|
| 133 |
-
- ✅ Нова логіка імплементована
|
| 134 |
-
- ✅ Зворотна сумісність збережена
|
| 135 |
-
- ✅ Тести пройдено
|
| 136 |
-
- ✅ Документація створена
|
| 137 |
-
|
| 138 |
-
**Deprecated компоненти:**
|
| 139 |
-
- `LifestyleExitClassifier` - залишено для зворотної сумісності
|
| 140 |
-
- `LifestyleAssistant` - старий клас залишено
|
| 141 |
-
|
| 142 |
-
**Активні компоненти:**
|
| 143 |
-
- `MainLifestyleAssistant` - новий розумний асистент
|
| 144 |
-
- Всі інші класифікатори працюють як раніше
|
| 145 |
-
|
| 146 |
-
Нова логіка спрощує lifestyle режим і робить його більш інтелектуальним!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NEUTRAL_CATEGORY_FIX.md
DELETED
|
@@ -1,102 +0,0 @@
|
|
| 1 |
-
# Виправлення проблеми з вітаннями - Додано NEUTRAL категорію
|
| 2 |
-
|
| 3 |
-
## 🔍 Проблема яку виявили в логах
|
| 4 |
-
|
| 5 |
-
**Симптом:** На просте вітання "Привіт" система одразу запускала повноцінний lifestyle коучинг з планом вправ.
|
| 6 |
-
|
| 7 |
-
**Причина:** Entry Classifier класифікував вітання як `LIFESTYLE` "за замовчуванням", що призводило до передчасного lifestyle режиму.
|
| 8 |
-
|
| 9 |
-
**Лог проблеми:**
|
| 10 |
-
```
|
| 11 |
-
ПОВІДОМЛЕННЯ ПАЦІЄНТА: Привіт
|
| 12 |
-
→ category: "LIFESTYLE"
|
| 13 |
-
→ reasoning: "класифіковано як LIFESTYLE за замовчуванням"
|
| 14 |
-
→ Результат: Одразу запуск lifestyle коучингу з вправами
|
| 15 |
-
```
|
| 16 |
-
|
| 17 |
-
## ✅ Рішення: Додано NEUTRAL категорію
|
| 18 |
-
|
| 19 |
-
### 1. **Оновлено Entry Classifier**
|
| 20 |
-
|
| 21 |
-
**Додано нову категорію:**
|
| 22 |
-
```
|
| 23 |
-
- NEUTRAL: вітання, прощання, загальні фрази без конкретного медичного чи lifestyle контенту
|
| 24 |
-
```
|
| 25 |
-
|
| 26 |
-
**Приклади NEUTRAL:**
|
| 27 |
-
- "Привіт", "Добрий день", "Як справи?"
|
| 28 |
-
- "До побачення", "Дякую", "Гаразд"
|
| 29 |
-
- Загальні питання без медичного/lifestyle контексту
|
| 30 |
-
|
| 31 |
-
### 2. **Створено _handle_neutral_interaction()**
|
| 32 |
-
|
| 33 |
-
**Природні відповіді на вітання:**
|
| 34 |
-
```python
|
| 35 |
-
greeting_responses = {
|
| 36 |
-
"привіт": "Привіт! Як ти сьогодні почуваєшся?",
|
| 37 |
-
"добрий день": "Добрий день! Як твоє самопочуття?",
|
| 38 |
-
"як справи": "Дякую за питання! А як твої справи зі здоров'ям?",
|
| 39 |
-
"до побачення": "До побачення! Бережи себе і звертайся, якщо будуть питання."
|
| 40 |
-
}
|
| 41 |
-
```
|
| 42 |
-
|
| 43 |
-
### 3. **Оновлено логіку process_message()**
|
| 44 |
-
|
| 45 |
-
**Новий потік для NEUTRAL:**
|
| 46 |
-
```python
|
| 47 |
-
elif category == "NEUTRAL":
|
| 48 |
-
# Нейтральна відповідь з легким медичним чек-апом
|
| 49 |
-
return self._handle_neutral_interaction(message)
|
| 50 |
-
```
|
| 51 |
-
|
| 52 |
-
## 🧪 Результати тестування
|
| 53 |
-
|
| 54 |
-
**До виправлення:**
|
| 55 |
-
```
|
| 56 |
-
'Привіт' → LIFESTYLE → Одразу lifestyle коучинг з планом вправ
|
| 57 |
-
```
|
| 58 |
-
|
| 59 |
-
**Після виправлення:**
|
| 60 |
-
```
|
| 61 |
-
'Привіт' → NEUTRAL → "Привіт! Як ти сьогодні почуваєшся?"
|
| 62 |
-
```
|
| 63 |
-
|
| 64 |
-
**Тести пройдено:**
|
| 65 |
-
- ✅ 'Привіт' → NEUTRAL
|
| 66 |
-
- ✅ 'Як справи?' → NEUTRAL
|
| 67 |
-
- ✅ 'До побачення' → NEUTRAL
|
| 68 |
-
- ✅ 'Дякую' → NEUTRAL
|
| 69 |
-
- ✅ Всі медичні та lifestyle класифікації працюють як раніше
|
| 70 |
-
|
| 71 |
-
## 🎯 Переваги нового підходу
|
| 72 |
-
|
| 73 |
-
### 1. **Природна взаємодія**
|
| 74 |
-
- Вітання отримують природні відповіді
|
| 75 |
-
- Немає передчасного lifestyle коучингу
|
| 76 |
-
- Легкий медичний чек-ап замість повного плану
|
| 77 |
-
|
| 78 |
-
### 2. **Краща UX**
|
| 79 |
-
- Система не "нав'язує" lifestyle одразу після вітання
|
| 80 |
-
- Пацієнт може природно перейти до потрібної теми
|
| 81 |
-
- Зберігається дружній тон без надмірної активності
|
| 82 |
-
|
| 83 |
-
### 3. **Гнучкість**
|
| 84 |
-
- NEUTRAL дозволяє системі "почекати" наступного повідомлення
|
| 85 |
-
- Пацієнт сам визначає напрямок розмови
|
| 86 |
-
- Система готова до будь-якого наступного кроку
|
| 87 |
-
|
| 88 |
-
## 📋 Файли змінено
|
| 89 |
-
|
| 90 |
-
1. **`prompts.py`** - додано NEUTRAL категорію в SYSTEM_PROMPT_ENTRY_CLASSIFIER
|
| 91 |
-
2. **`lifestyle_app.py`** - додано _handle_neutral_interaction() та логіку обробки
|
| 92 |
-
3. **`test_new_logic.py`** - оновлено тести для перевірки NEUTRAL категорії
|
| 93 |
-
|
| 94 |
-
## 🚀 Готовність
|
| 95 |
-
|
| 96 |
-
Система тепер правильно обробляє:
|
| 97 |
-
- ✅ Медичні скарги → MEDICAL режим
|
| 98 |
-
- ✅ Lifestyle питання → LIFESTYLE режим
|
| 99 |
-
- ✅ Гібридні запити → HYBRID потік
|
| 100 |
-
- ✅ **Вітання та прощання → NEUTRAL відповіді**
|
| 101 |
-
|
| 102 |
-
**Проблема з передчасним lifestyle коучингом вирішена!**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NEW_LOGIC_IMPLEMENTATION.md
DELETED
|
@@ -1,165 +0,0 @@
|
|
| 1 |
-
# Нова логіка обробки повідомлень - Імплементація
|
| 2 |
-
|
| 3 |
-
## Огляд змін
|
| 4 |
-
|
| 5 |
-
Замінено одноетапну логіку SessionController на трьохетапну систему класифікаторів відповідно до діаграми `new_logic.mermaid`.
|
| 6 |
-
|
| 7 |
-
## Нові компоненти
|
| 8 |
-
|
| 9 |
-
### 1. EntryClassifier
|
| 10 |
-
**Файл:** `core_classes.py`
|
| 11 |
-
**Призначення:** Класифікує повідомлення пацієнта на початку взаємодії
|
| 12 |
-
|
| 13 |
-
**Категорії:**
|
| 14 |
-
- `MEDICAL` - тільки медичні скарги
|
| 15 |
-
- `LIFESTYLE` - тільки lifestyle питання
|
| 16 |
-
- `HYBRID` - lifestyle + медичні скарги (потрібен тріаж)
|
| 17 |
-
|
| 18 |
-
**Промпт:** `SYSTEM_PROMPT_ENTRY_CLASSIFIER` в `prompts.py`
|
| 19 |
-
|
| 20 |
-
### 2. TriageExitClassifier
|
| 21 |
-
**Файл:** `core_classes.py`
|
| 22 |
-
**Призначення:** Після медичного тріажу оцінює готовність до lifestyle
|
| 23 |
-
|
| 24 |
-
**Критерії для lifestyle:**
|
| 25 |
-
- Медичні скарги стабілізовані
|
| 26 |
-
- Пацієнт готовий до lifestyle активностей
|
| 27 |
-
- Немає активних симптомів
|
| 28 |
-
|
| 29 |
-
**Промпт:** `SYSTEM_PROMPT_TRIAGE_EXIT_CLASSIFIER` в `prompts.py`
|
| 30 |
-
|
| 31 |
-
### 3. LifestyleExitClassifier
|
| 32 |
-
**Файл:** `core_classes.py`
|
| 33 |
-
**Призначення:** Контролює вихід з lifestyle режиму
|
| 34 |
-
|
| 35 |
-
**Критерії для виходу:**
|
| 36 |
-
- Погіршення стану пацієнта
|
| 37 |
-
- Небажання продовжувати lifestyle
|
| 38 |
-
- Надто довга сесія (>10 повідомлень)
|
| 39 |
-
- Нові медичні скарги
|
| 40 |
-
|
| 41 |
-
**Промпт:** `SYSTEM_PROMPT_LIFESTYLE_EXIT_CLASSIFIER` в `prompts.py`
|
| 42 |
-
|
| 43 |
-
### 4. LifestyleSessionManager
|
| 44 |
-
**Файл:** `core_classes.py`
|
| 45 |
-
**Призначення:** Управляє lifecycle lifestyle сесій та розумно оновлює профіль
|
| 46 |
-
|
| 47 |
-
**Функції:**
|
| 48 |
-
- Суммаризація сесії без розростання даних
|
| 49 |
-
- Уникнення повторів інструкцій
|
| 50 |
-
- Логування ключових моментів
|
| 51 |
-
- Контроль розміру `journey_summary`
|
| 52 |
-
|
| 53 |
-
## Нова логіка process_message()
|
| 54 |
-
|
| 55 |
-
### Основний потік:
|
| 56 |
-
```python
|
| 57 |
-
def process_message(message, history):
|
| 58 |
-
if current_mode == "lifestyle":
|
| 59 |
-
# Перевіряємо чи потрібно вийти з lifestyle
|
| 60 |
-
response, mode = _handle_lifestyle_mode(message)
|
| 61 |
-
else:
|
| 62 |
-
# Використовуємо Entry Classifier
|
| 63 |
-
response, mode = _handle_entry_classification(message)
|
| 64 |
-
```
|
| 65 |
-
|
| 66 |
-
### Entry Classification потік:
|
| 67 |
-
```python
|
| 68 |
-
def _handle_entry_classification(message):
|
| 69 |
-
classification = entry_classifier.classify(message)
|
| 70 |
-
|
| 71 |
-
if category == "MEDICAL":
|
| 72 |
-
return medical_response, "medical"
|
| 73 |
-
elif category == "LIFESTYLE":
|
| 74 |
-
return lifestyle_response, "lifestyle"
|
| 75 |
-
elif category == "HYBRID":
|
| 76 |
-
return _handle_hybrid_flow(message)
|
| 77 |
-
```
|
| 78 |
-
|
| 79 |
-
### Hybrid потік:
|
| 80 |
-
```python
|
| 81 |
-
def _handle_hybrid_flow(message):
|
| 82 |
-
# 1. Медичний тріаж
|
| 83 |
-
medical_response = medical_assistant.generate_response(message)
|
| 84 |
-
|
| 85 |
-
# 2. Оцінка готовності до lifestyle
|
| 86 |
-
assessment = triage_exit_classifier.assess_readiness(...)
|
| 87 |
-
|
| 88 |
-
if assessment.ready_for_lifestyle:
|
| 89 |
-
lifestyle_response = lifestyle_assistant.generate_response(message)
|
| 90 |
-
return combined_response, "lifestyle"
|
| 91 |
-
else:
|
| 92 |
-
return medical_response, "medical"
|
| 93 |
-
```
|
| 94 |
-
|
| 95 |
-
### Lifestyle режим:
|
| 96 |
-
```python
|
| 97 |
-
def _handle_lifestyle_mode(message):
|
| 98 |
-
# Перевіряємо вихід
|
| 99 |
-
exit_decision = lifestyle_exit_classifier.should_exit(...)
|
| 100 |
-
|
| 101 |
-
if exit_decision.should_exit:
|
| 102 |
-
# Оновлюємо профіль та переходимо в medical
|
| 103 |
-
updated_profile = lifestyle_session_manager.update_profile_after_session(...)
|
| 104 |
-
medical_response = medical_assistant.generate_response(message)
|
| 105 |
-
return combined_response, "medical"
|
| 106 |
-
else:
|
| 107 |
-
# Продовжуємо lifestyle
|
| 108 |
-
lifestyle_response = lifestyle_assistant.generate_response(message)
|
| 109 |
-
return lifestyle_response, "lifestyle"
|
| 110 |
-
```
|
| 111 |
-
|
| 112 |
-
## Оновлення SessionState
|
| 113 |
-
|
| 114 |
-
Додано нові поля:
|
| 115 |
-
```python
|
| 116 |
-
@dataclass
|
| 117 |
-
class SessionState:
|
| 118 |
-
# ... існуючі поля
|
| 119 |
-
lifestyle_session_length: int = 0
|
| 120 |
-
last_triage_summary: str = ""
|
| 121 |
-
entry_classification: Dict = None
|
| 122 |
-
```
|
| 123 |
-
|
| 124 |
-
## Розумне оновлення профілю
|
| 125 |
-
|
| 126 |
-
### LifestyleSessionManager.update_profile_after_session():
|
| 127 |
-
- Аналізує lifestyle повідомлення з поточної сесії
|
| 128 |
-
- Створює стислий саммарі без розростання
|
| 129 |
-
- Оновлює `last_session_summary` з ключовими темами
|
| 130 |
-
- Контролює розмір `journey_summary` (максимум 800 символів)
|
| 131 |
-
- Додає да��у та кількість повідомлень
|
| 132 |
-
|
| 133 |
-
### Приклад оновлення:
|
| 134 |
-
```json
|
| 135 |
-
{
|
| 136 |
-
"last_session_summary": "[04.09.2025] Обговорювали: питання про ходьбу; дієта з низьким вмістом солі; мотивація",
|
| 137 |
-
"journey_summary": "...попередні записи... | 04.09.2025: 5 повідомлень"
|
| 138 |
-
}
|
| 139 |
-
```
|
| 140 |
-
|
| 141 |
-
## Зворотна сумісність
|
| 142 |
-
|
| 143 |
-
- Старий `SessionController` залишено для тестування
|
| 144 |
-
- Всі існуючі методи працюють без змін
|
| 145 |
-
- Testing Lab повністю сумісний
|
| 146 |
-
|
| 147 |
-
## Тестування
|
| 148 |
-
|
| 149 |
-
Для тестування нової логіки:
|
| 150 |
-
1. Завантажте тестового пацієнта
|
| 151 |
-
2. Спробуйте різні типи повідомлень:
|
| 152 |
-
- Чисто медичні: "У мене болить голова"
|
| 153 |
-
- Чисто lifestyle: "Хочу почати займатися спортом"
|
| 154 |
-
- Hybrid: "Хочу займатися спортом, але у мене болить спина"
|
| 155 |
-
3. Перевірте lifecycle lifestyle сесій
|
| 156 |
-
4. Перевірте оновлення профілю після завершення сесій
|
| 157 |
-
|
| 158 |
-
## Логування
|
| 159 |
-
|
| 160 |
-
Всі класифікатори логуються з відповідними call_type:
|
| 161 |
-
- `ENTRY_CLASSIFIER`
|
| 162 |
-
- `TRIAGE_EXIT_CLASSIFIER`
|
| 163 |
-
- `LIFESTYLE_EXIT_CLASSIFIER`
|
| 164 |
-
|
| 165 |
-
Увімкніть логування: `export LOG_PROMPTS=true`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
README.md
CHANGED
|
@@ -25,21 +25,21 @@ license: mit
|
|
| 25 |
|
| 26 |
## 🎯 Функціонал
|
| 27 |
|
| 28 |
-
###
|
| 29 |
-
-
|
| 30 |
-
-
|
| 31 |
-
- **
|
| 32 |
|
| 33 |
### Medical Assistant
|
| 34 |
- Медичні консультації з урахуванням хронічних станів
|
| 35 |
- Безпечні рекомендації та тріаж
|
| 36 |
-
- Направлення до лікарів при
|
| 37 |
|
| 38 |
-
### Lifestyle
|
| 39 |
-
-
|
| 40 |
-
-
|
| 41 |
-
-
|
| 42 |
-
-
|
| 43 |
|
| 44 |
## 🧪 Тестові сценарії
|
| 45 |
|
|
@@ -54,21 +54,27 @@ license: mit
|
|
| 54 |
- "Які вправи можна при діабеті?"
|
| 55 |
- "Допоможіть скласти план харчування"
|
| 56 |
|
| 57 |
-
🔄
|
| 58 |
- "Чи можна бігати з гіпертонією?"
|
| 59 |
- "Болить спина після тренувань"
|
|
|
|
| 60 |
```
|
| 61 |
|
| 62 |
## 📊 Архітектура
|
| 63 |
|
| 64 |
```mermaid
|
| 65 |
graph TD
|
| 66 |
-
A[Повідомлення пацієнта] --> B[
|
| 67 |
-
B --> C{
|
| 68 |
-
C -->|
|
| 69 |
-
C -->|
|
| 70 |
-
|
| 71 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 72 |
```
|
| 73 |
|
| 74 |
## ⚠️ Важлива інформація
|
|
|
|
| 25 |
|
| 26 |
## 🎯 Функціонал
|
| 27 |
|
| 28 |
+
### Entry Classifier (K/V/T формат)
|
| 29 |
+
- **Розумна класифікація** повідомлень: off/on/hybrid
|
| 30 |
+
- **М'який медичний тріаж** для делікатного підходу
|
| 31 |
+
- **Timestamp відстеження** для аналітики
|
| 32 |
|
| 33 |
### Medical Assistant
|
| 34 |
- Медичні консультації з урахуванням хронічних станів
|
| 35 |
- Безпечні рекомендації та тріаж
|
| 36 |
+
- Направлення до лікарів при red flags
|
| 37 |
|
| 38 |
+
### Main Lifestyle Assistant
|
| 39 |
+
- **3 розумні дії:** gather_info, lifestyle_dialog, close
|
| 40 |
+
- Персоналізовані поради з урахуванням медичних обмежень
|
| 41 |
+
- Автоматичне управління lifecycle сесій
|
| 42 |
+
- Контрольоване оновлення профілю пацієнта
|
| 43 |
|
| 44 |
## 🧪 Тестові сценарії
|
| 45 |
|
|
|
|
| 54 |
- "Які вправи можна при діабеті?"
|
| 55 |
- "Допоможіть скласти план харчування"
|
| 56 |
|
| 57 |
+
🔄 Гібридні запити (V=hybrid):
|
| 58 |
- "Чи можна бігати з гіпертонією?"
|
| 59 |
- "Болить спина після тренувань"
|
| 60 |
+
- "Хочу займатися спортом, але у мене болить спина"
|
| 61 |
```
|
| 62 |
|
| 63 |
## 📊 Архітектура
|
| 64 |
|
| 65 |
```mermaid
|
| 66 |
graph TD
|
| 67 |
+
A[Повідомлення пацієнта] --> B[Entry Classifier]
|
| 68 |
+
B --> C{K/V/T формат}
|
| 69 |
+
C -->|V=off| D[Soft Medical Triage]
|
| 70 |
+
C -->|V=on| E[Main Lifestyle Assistant]
|
| 71 |
+
C -->|V=hybrid| F[Medical + Triage Exit]
|
| 72 |
+
F --> G{Готовий до lifestyle?}
|
| 73 |
+
G -->|Так| E
|
| 74 |
+
G -->|Ні| D
|
| 75 |
+
E --> H{Action?}
|
| 76 |
+
H -->|close| I[Update Profile + Medical]
|
| 77 |
+
H -->|continue| J[Lifestyle Dialog]
|
| 78 |
```
|
| 79 |
|
| 80 |
## ⚠️ Важлива інформація
|
README_local.md
DELETED
|
@@ -1,164 +0,0 @@
|
|
| 1 |
-
# 🏥 Lifestyle Journey MVP v3 + 🧪 Testing Lab
|
| 2 |
-
|
| 3 |
-
Медичний чат-бот з lifestyle коучингом на базі Gemini API + система тестування нових пацієнтів.
|
| 4 |
-
|
| 5 |
-
## ⚡ Нові можливості v3 - Testing Lab
|
| 6 |
-
|
| 7 |
-
- ✅ **Завантаження тестових пацієнтів** через JSON файли
|
| 8 |
-
- ✅ **Автоматичне логування тестових сесій** з детальними метриками
|
| 9 |
-
- ✅ **Валідація профілів пацієнтів** при завантаженні
|
| 10 |
-
- ✅ **Аналітичні звіти** по результатах тестування
|
| 11 |
-
- ✅ **CSV експорт** для подальшого аналізу
|
| 12 |
-
- ✅ **Три закладки UI** для різних робочих процесів
|
| 13 |
-
|
| 14 |
-
## 🎯 Основний функціонал
|
| 15 |
-
|
| 16 |
-
### 💬 Чат з пацієнтом (основна закладка)
|
| 17 |
-
- **Session Controller** - розумна маршрутизація medical/lifestyle
|
| 18 |
-
- **Medical Assistant** - безпечні консультації з red flags детекцією
|
| 19 |
-
- **Lifestyle Coach** - персоналізовані поради з урахуванням обмежень
|
| 20 |
-
- **Real-time статус** системи та API викликів
|
| 21 |
-
|
| 22 |
-
### 🧪 Testing Lab (нова закладка)
|
| 23 |
-
- **Завантаження пацієнтів** з JSON профілів
|
| 24 |
-
- **Валідація структури** файлів перед завантаженням
|
| 25 |
-
- **Попередній перегляд** медичних та lifestyle даних
|
| 26 |
-
- **Управління тестовими сесіями** з нотатками
|
| 27 |
-
- **Автоматичне логування** всіх взаємодій
|
| 28 |
-
|
| 29 |
-
### 📊 Результати тестування (нова закладка)
|
| 30 |
-
- **Звітна аналітика** по всім тестовим сесіям
|
| 31 |
-
- **Детальна таблиця** останніх сесій
|
| 32 |
-
- **CSV експорт** результатів
|
| 33 |
-
- **KPI метрики** якості системи
|
| 34 |
-
|
| 35 |
-
## 🚀 Швидкий старт
|
| 36 |
-
|
| 37 |
-
### 1. Установка
|
| 38 |
-
```bash
|
| 39 |
-
git clone <this-repo>
|
| 40 |
-
pip install -r requirements.txt
|
| 41 |
-
cp .env.example .env
|
| 42 |
-
# Додайте GEMINI_API_KEY в .env файл
|
| 43 |
-
```
|
| 44 |
-
|
| 45 |
-
### 2. Запуск з стандартним пацієнтом
|
| 46 |
-
```bash
|
| 47 |
-
python modified_app.py
|
| 48 |
-
```
|
| 49 |
-
|
| 50 |
-
### 3. Тестування нових пацієнтів
|
| 51 |
-
1. Перейдіть в закладку **🧪 Testing Lab**
|
| 52 |
-
2. Завантажте clinical_background.json та lifestyle_profile.json
|
| 53 |
-
3. Проведіть тестування в **💬 Чат з пацієнтом**
|
| 54 |
-
4. Аналізуйте результати в **📊 Результати тестування**
|
| 55 |
-
|
| 56 |
-
## 📁 Структура файлів
|
| 57 |
-
|
| 58 |
-
```
|
| 59 |
-
Lifestyle_v3/
|
| 60 |
-
├── modified_app.py # Головний додаток з Testing Lab
|
| 61 |
-
├── testing_lab.py # Модуль Testing Lab
|
| 62 |
-
├── app.py # Оригінальні компоненти (імпортуються)
|
| 63 |
-
├── clinical_background.json # Стандартний пацієнт (Mark)
|
| 64 |
-
├── lifestyle_profile.json # Стандартний профіль (Mark)
|
| 65 |
-
├── requirements.txt # Оновлені залежності
|
| 66 |
-
├── testing_results/ # Автоматично створюється
|
| 67 |
-
│ ├── sessions/ # Збережені тестові сесії
|
| 68 |
-
│ ├── patients/ # Завантажені профілі пацієнтів
|
| 69 |
-
│ ├── reports/ # Звіти
|
| 70 |
-
│ └── exports/ # CSV експорти
|
| 71 |
-
└── test_patients/ # Приклади тестових пацієнтів
|
| 72 |
-
├── elderly_mary_clinical.json
|
| 73 |
-
├── elderly_mary_lifestyle.json
|
| 74 |
-
├── athletic_john_clinical.json
|
| 75 |
-
├── athletic_john_lifestyle.json
|
| 76 |
-
├── pregnant_sarah_clinical.json
|
| 77 |
-
└── pregnant_sarah_lifestyle.json
|
| 78 |
-
```
|
| 79 |
-
|
| 80 |
-
## 🧪 Приклади тестових пацієнтів
|
| 81 |
-
|
| 82 |
-
### 👵 Elderly Mary - складна коморбідність
|
| 83 |
-
- 76 років, гіпертонія, діабет, інсульт в анамнезі
|
| 84 |
-
- **Тест сценарії:** red flags, fall prevention, medication adherence
|
| 85 |
-
|
| 86 |
-
### 🏃 Athletic John - спортсмен після травми
|
| 87 |
-
- 24 роки, відновлення після операції на коліні
|
| 88 |
-
- **Тест сценарії:** return to sport, injury anxiety, overexertion risk
|
| 89 |
-
|
| 90 |
-
### 🤰 Pregnant Sarah - вагітність з ускладненнями
|
| 91 |
-
- 28 років, гестаційний діабет, гіпертонія
|
| 92 |
-
- **Тест сценарії:** pregnancy safety, blood sugar control, exercise modifications
|
| 93 |
-
|
| 94 |
-
## 📊 Метрики тестування
|
| 95 |
-
|
| 96 |
-
### Автоматично збираютьс��:
|
| 97 |
-
- **Session Controller точність** - % правильних рішень
|
| 98 |
-
- **Medical safety score** - % виявлених red flags
|
| 99 |
-
- **Lifestyle personalization** - врахування обмежень
|
| 100 |
-
- **Response times** - швидкість системи
|
| 101 |
-
- **User journey completion** - завершені сесії
|
| 102 |
-
|
| 103 |
-
### Аналітичні звіти включають:
|
| 104 |
-
- Розподіл по режимах (medical/lifestyle %)
|
| 105 |
-
- Rate ескалацій та їх правильність
|
| 106 |
-
- Середня тривалість та інтенсивність сесій
|
| 107 |
-
- Порівняльна статистика по пацієнтах
|
| 108 |
-
|
| 109 |
-
## 🔧 Debug та логування
|
| 110 |
-
|
| 111 |
-
**Активуйте детальне логування в .env:**
|
| 112 |
-
```bash
|
| 113 |
-
LOG_PROMPTS=true
|
| 114 |
-
```
|
| 115 |
-
|
| 116 |
-
**Що логується:**
|
| 117 |
-
- Всі промпти до Gemini API з типом виклику
|
| 118 |
-
- Повні відповіді LLM з timestamps
|
| 119 |
-
- Controller рішення та їх обґрунтування
|
| 120 |
-
- Метрики продуктивності
|
| 121 |
-
|
| 122 |
-
**Лог файли:**
|
| 123 |
-
- `lifestyle_journey.log` - детальні API виклики
|
| 124 |
-
- `testing_results/sessions/` - JSON з результатами сесій
|
| 125 |
-
|
| 126 |
-
## ⚠️ Важливо для production
|
| 127 |
-
|
| 128 |
-
**Безпека даних:**
|
| 129 |
-
- JSON файли можуть містити медичну інформацію
|
| 130 |
-
- Результати тестування зберігаються локально
|
| 131 |
-
- Не передавайте реальні дані пацієнтів
|
| 132 |
-
|
| 133 |
-
**Performance:**
|
| 134 |
-
- Testing Lab додає overhead для логування
|
| 135 |
-
- Рекомендується періодично очищати testing_results/
|
| 136 |
-
- Великі JSON файли (>10MB) можуть сповільнити UI
|
| 137 |
-
|
| 138 |
-
## 🎯 Використання для різних цілей
|
| 139 |
-
|
| 140 |
-
### Розробка та QA:
|
| 141 |
-
- Тестування нових функцій на різних профілях
|
| 142 |
-
- Regression тестування після змін в промптах
|
| 143 |
-
- Оптимізація Session Controller логіки
|
| 144 |
-
|
| 145 |
-
### Клінічні дослідження:
|
| 146 |
-
- A/B тестування різних lifestyle підходів
|
| 147 |
-
- Вимірювання user engagement та adherence
|
| 148 |
-
- Порівняння ефективності персоналізації
|
| 149 |
-
|
| 150 |
-
### Training та demo:
|
| 151 |
-
- Навчання медичного персоналу
|
| 152 |
-
- Демонстрації можливостей системи
|
| 153 |
-
- Створення кейс-стадій
|
| 154 |
-
|
| 155 |
-
---
|
| 156 |
-
|
| 157 |
-
**Made with ❤️ for evidence-based healthcare innovation**
|
| 158 |
-
|
| 159 |
-
## 🔗 Посилання
|
| 160 |
-
|
| 161 |
-
- [Testing Lab User Guide](./TESTING_LAB_GUIDE.md)
|
| 162 |
-
- [Test Patient Examples](./TEST_PATIENTS.md)
|
| 163 |
-
- [Original Documentation](./TESTING_GUIDE.md)
|
| 164 |
-
- [HuggingFace Space](https://huggingface.co/spaces/your-space/lifestyle-journey)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
REFACTORING_README.md
DELETED
|
@@ -1,113 +0,0 @@
|
|
| 1 |
-
# Рефакторинг app.py - Нова структура проекту
|
| 2 |
-
|
| 3 |
-
## 📁 Нова структура файлів
|
| 4 |
-
|
| 5 |
-
### Основні файли:
|
| 6 |
-
- **`app.py`** - Точка входу додатку (мінімальний код)
|
| 7 |
-
- **`lifestyle_app.py`** - Основний клас додатку `ExtendedLifestyleJourneyApp`
|
| 8 |
-
- **`gradio_interface.py`** - Gradio інтерфейс та обробники подій
|
| 9 |
-
- **`test_patients.py`** - Тестові дані пацієнтів
|
| 10 |
-
- **`file_utils.py`** - Утиліти для роботи з файлами
|
| 11 |
-
- **`core_classes.py`** - Основні класи (без змін)
|
| 12 |
-
- **`prompts.py`** - Промпти (оновлено на функції)
|
| 13 |
-
|
| 14 |
-
## 🔄 Що було змінено
|
| 15 |
-
|
| 16 |
-
### 1. **app.py** (зменшено з ~600 до ~20 рядків)
|
| 17 |
-
```python
|
| 18 |
-
import os
|
| 19 |
-
from dotenv import load_dotenv
|
| 20 |
-
from gradio_interface import create_gradio_interface
|
| 21 |
-
|
| 22 |
-
load_dotenv()
|
| 23 |
-
|
| 24 |
-
if __name__ == "__main__":
|
| 25 |
-
# Мінімальний код запуску
|
| 26 |
-
```
|
| 27 |
-
|
| 28 |
-
### 2. **test_patients.py** - Винесено тестові дані
|
| 29 |
-
- `TestPatientData` клас з методами для кожного типу пацієнта
|
| 30 |
-
- `get_elderly_patient()`, `get_athlete_patient()`, `get_pregnant_patient()`
|
| 31 |
-
- Універсальний метод `get_patient_data(patient_type)`
|
| 32 |
-
|
| 33 |
-
### 3. **file_utils.py** - Утиліти для файлів
|
| 34 |
-
- `FileHandler.read_uploaded_file()` - універсальне читання файлів
|
| 35 |
-
- `FileHandler.parse_json_file()` - парсинг JSON з обробкою помилок
|
| 36 |
-
|
| 37 |
-
### 4. **lifestyle_app.py** - Основна логіка
|
| 38 |
-
- Клас `ExtendedLifestyleJourneyApp` з усією бізнес-логікою
|
| 39 |
-
- Чистий код без Gradio специфіки
|
| 40 |
-
- Легко тестувати окремо
|
| 41 |
-
|
| 42 |
-
### 5. **gradio_interface.py** - UI логіка
|
| 43 |
-
- Функція `create_gradio_interface()`
|
| 44 |
-
- Всі Gradio компоненти та обробники подій
|
| 45 |
-
- Відокремлено від бізнес-логіки
|
| 46 |
-
|
| 47 |
-
## ✅ Переваги рефакторингу
|
| 48 |
-
|
| 49 |
-
### 🎯 **Розділення відповідальностей**
|
| 50 |
-
- **app.py**: Тільки запуск
|
| 51 |
-
- **lifestyle_app.py**: Бізнес-логіка
|
| 52 |
-
- **gradio_interface.py**: UI
|
| 53 |
-
- **test_patients.py**: Тестові дані
|
| 54 |
-
- **file_utils.py**: Утиліти
|
| 55 |
-
|
| 56 |
-
### 📦 **Модульність**
|
| 57 |
-
- Кожен файл має чітку відповідальність
|
| 58 |
-
- Легко додавати нові типи пацієнтів
|
| 59 |
-
- Простіше тестування окремих компонентів
|
| 60 |
-
|
| 61 |
-
### 🔧 **Підтримка**
|
| 62 |
-
- Легше знаходити та виправляти баги
|
| 63 |
-
- Зрозуміліша структура для нових розробників
|
| 64 |
-
- Менше конфліктів при роботі в команді
|
| 65 |
-
|
| 66 |
-
### 🧪 **Тестування**
|
| 67 |
-
- Можна тестувати бізнес-логіку без UI
|
| 68 |
-
- Окремо тестувати утиліти файлів
|
| 69 |
-
- Легко мокати компоненти
|
| 70 |
-
|
| 71 |
-
## 🚀 **Як використовувати**
|
| 72 |
-
|
| 73 |
-
### Запуск додатку:
|
| 74 |
-
```bash
|
| 75 |
-
python app.py
|
| 76 |
-
```
|
| 77 |
-
|
| 78 |
-
### Додавання нового типу пацієнта:
|
| 79 |
-
1. Відкрити `test_patients.py`
|
| 80 |
-
2. Додати новий метод в `TestPatientData`
|
| 81 |
-
3. Оновити `get_patient_data()` метод
|
| 82 |
-
4. Додати кнопку в `gradio_interface.py`
|
| 83 |
-
|
| 84 |
-
### Додавання нової утиліти:
|
| 85 |
-
1. Відкрити `file_utils.py`
|
| 86 |
-
2. Додати статичний метод в `FileHandler`
|
| 87 |
-
|
| 88 |
-
## 📋 **Міграція з старого коду**
|
| 89 |
-
|
| 90 |
-
Якщо у вас є кастомні зміни в старому `app.py`:
|
| 91 |
-
|
| 92 |
-
1. **Тестові дані пацієнтів** → `test_patients.py`
|
| 93 |
-
2. **Утиліти файлів** → `file_utils.py`
|
| 94 |
-
3. **Бізнес-логіка** → `lifestyle_app.py`
|
| 95 |
-
4. **UI компоненти** → `gradio_interface.py`
|
| 96 |
-
|
| 97 |
-
## 🔍 **Перевірка працездатності**
|
| 98 |
-
|
| 99 |
-
Всі файли перевірені на синтаксичні помилки:
|
| 100 |
-
```bash
|
| 101 |
-
python3 -m py_compile app.py ✅
|
| 102 |
-
python3 -m py_compile lifestyle_app.py ✅
|
| 103 |
-
python3 -m py_compile test_patients.py ✅
|
| 104 |
-
python3 -m py_compile file_utils.py ✅
|
| 105 |
-
python3 -m py_compile gradio_interface.py ✅
|
| 106 |
-
```
|
| 107 |
-
|
| 108 |
-
## 📈 **Статистика рефакторингу**
|
| 109 |
-
|
| 110 |
-
- **Зменшення app.py**: з ~600 до ~20 рядків (-97%)
|
| 111 |
-
- **Нових файлів**: 4
|
| 112 |
-
- **Покращення читабельності**: значне
|
| 113 |
-
- **Зворотна сумісність**: повна
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TESTING_GUIDE.md
DELETED
|
@@ -1,155 +0,0 @@
|
|
| 1 |
-
# 🧪 Інструкція з тестування інтегрованих JSON профілів
|
| 2 |
-
|
| 3 |
-
## 📁 Структура файлів
|
| 4 |
-
|
| 5 |
-
Переконайтесь що у вас є ці файли у тій же директорії з `app.py`:
|
| 6 |
-
|
| 7 |
-
```
|
| 8 |
-
Lifestyle/
|
| 9 |
-
├── app.py
|
| 10 |
-
├── clinical_background.json # ← НОВИЙ
|
| 11 |
-
├── lifestyle_profile.json # ← НОВИЙ
|
| 12 |
-
├── requirements.txt
|
| 13 |
-
├── .env (з вашим GEMINI_API_KEY)
|
| 14 |
-
└── .env.example
|
| 15 |
-
```
|
| 16 |
-
|
| 17 |
-
## 🚀 Запуск
|
| 18 |
-
|
| 19 |
-
```bash
|
| 20 |
-
python app.py
|
| 21 |
-
```
|
| 22 |
-
|
| 23 |
-
При запуску ви повинні побачити:
|
| 24 |
-
```
|
| 25 |
-
🔄 Завантаження даних пацієнта...
|
| 26 |
-
✅ Завантажено профіль пацієнта: Mark
|
| 27 |
-
📋 Активних проблем: 8
|
| 28 |
-
🎯 Lifestyle ціль: Improve exercise tolerance safely...
|
| 29 |
-
```
|
| 30 |
-
|
| 31 |
-
## 🔧 Debug режим (логування промптів)
|
| 32 |
-
|
| 33 |
-
Для детального аналізу промптів та відповідей LLM:
|
| 34 |
-
|
| 35 |
-
1. **Активуйте логування** в `.env`:
|
| 36 |
-
```bash
|
| 37 |
-
LOG_PROMPTS=true
|
| 38 |
-
```
|
| 39 |
-
|
| 40 |
-
2. **Запустіть застосунок:**
|
| 41 |
-
```bash
|
| 42 |
-
python app.py
|
| 43 |
-
```
|
| 44 |
-
|
| 45 |
-
3. **Перевірте індикатори:**
|
| 46 |
-
- В заголовку з'явиться 📝 та повідомлення про DEBUG MODE
|
| 47 |
-
- В статус панелі: `Логування: 📝 АКТИВНЕ`
|
| 48 |
-
- Лічильник API викликів
|
| 49 |
-
|
| 50 |
-
4. **Аналізуйте логи:**
|
| 51 |
-
```bash
|
| 52 |
-
tail -f lifestyle_journey.log
|
| 53 |
-
```
|
| 54 |
-
|
| 55 |
-
**Що логується:**
|
| 56 |
-
- `[SESSION_CONTROLLER]` - рішення про режим
|
| 57 |
-
- `[MEDICAL_ASSISTANT]` - медичні консультації
|
| 58 |
-
- `[LIFESTYLE_ASSISTANT]` - lifestyle коучинг
|
| 59 |
-
- Повні промпти та відповіді з timestamp'ами
|
| 60 |
-
|
| 61 |
-
## 🎯 Що змінилося
|
| 62 |
-
|
| 63 |
-
### 1. **Реальні дані пацієнта Mark**
|
| 64 |
-
- 52 роки, ЦД2, АГ, ампутація правої ноги
|
| 65 |
-
- 16+ поточних медикаментів
|
| 66 |
-
- Складний медичний анамез з недавніми госпіталізаціями
|
| 67 |
-
|
| 68 |
-
### 2. **Детальний medical context**
|
| 69 |
-
- Активні проблеми: нудота, гіпокаліємія, біль у грудях
|
| 70 |
-
- Критичні попередження про компліансність
|
| 71 |
-
- Недавні події: ER візити через блювоту та біль у грудях
|
| 72 |
-
|
| 73 |
-
### 3. **Персоналізований lifestyle профіль**
|
| 74 |
-
- Адаптовані вправи для людини з ампутацією
|
| 75 |
-
- Діабетична дієта + обмеження GERD
|
| 76 |
-
- Реалістичні цілі з урахуванням фізичних обмежень
|
| 77 |
-
|
| 78 |
-
## 🧪 Сценарії тестування
|
| 79 |
-
|
| 80 |
-
### 🚨 **Medical режим (Red flags):**
|
| 81 |
-
```
|
| 82 |
-
"У мене знову болить груди як тиждень тому"
|
| 83 |
-
"Нудота повернулася, не можу їсти"
|
| 84 |
-
"Рівень калію знизився - що робити?"
|
| 85 |
-
"Відчуваю слабкість в ногах"
|
| 86 |
-
```
|
| 87 |
-
|
| 88 |
-
**Очікуваний результат:** Controller направить в medical режим, асистент врахує недавні госпіталізації та поточні медикаменти.
|
| 89 |
-
|
| 90 |
-
### 💚 **Lifestyle режим:**
|
| 91 |
-
```
|
| 92 |
-
"Хочу почати займатися спортом з моєю ампутацією"
|
| 93 |
-
"Як правильно харчуватися при діабеті та GERD?"
|
| 94 |
-
"Які вправи можна робити сидячи?"
|
| 95 |
-
"Допоможіть скласти план тренувань для інвалідного візка"
|
| 96 |
-
```
|
| 97 |
-
|
| 98 |
-
**Очікуваний результат:** Controller активує lifestyle режим, коуч врахує ампутацію, діабет та особисті переваги.
|
| 99 |
-
|
| 100 |
-
### 🔄 **Mixed/складні запити:**
|
| 101 |
-
```
|
| 102 |
-
"Чи можу я займатися плаванням з моїм цукровим діабетом?"
|
| 103 |
-
"Болить спина після сидіння в візку - які вправи допоможуть?"
|
| 104 |
-
"Як контролювати цукор під час тренувань?"
|
| 105 |
-
```
|
| 106 |
-
|
| 107 |
-
## 📊 **Що перевіряти в Status панелі:**
|
| 108 |
-
|
| 109 |
-
### ✅ **Корректне завантаження:**
|
| 110 |
-
- Пацієнт: **Mark**
|
| 111 |
-
- Вік: **52**
|
| 112 |
-
- Активні проблеми: повинні показуватись реальні діагнози
|
| 113 |
-
- Lifestyle ціль: повинна містити текст про ампутацію
|
| 114 |
-
|
| 115 |
-
### ✅ **Controller рішення:**
|
| 116 |
-
- Медичні симптоми → `action: start_medical`
|
| 117 |
-
- Lifestyle питання → `action: start_lifestyle`
|
| 118 |
-
- Обґрунтування українською мовою
|
| 119 |
-
|
| 120 |
-
### ✅ **Персоналізація відповідей:**
|
| 121 |
-
- Medical асистент повинен згадувати н��давні госпіталізації
|
| 122 |
-
- Lifestyle коуч повинен враховувати ампутацію в рекомендаціях
|
| 123 |
-
- Обидва режими мають враховувати діабет та гіпертонію
|
| 124 |
-
|
| 125 |
-
## 🐛 **Можливі проблеми:**
|
| 126 |
-
|
| 127 |
-
**Якщо файли не знаходить:**
|
| 128 |
-
```
|
| 129 |
-
⚠️ Файл clinical_background.json не знайдено. Використовуємо тестові дані.
|
| 130 |
-
```
|
| 131 |
-
→ Переконайтесь що JSON файли в тій же папці що й app.py
|
| 132 |
-
|
| 133 |
-
**Якщо JSON некоректний:**
|
| 134 |
-
```
|
| 135 |
-
⚠️ Помилка завантаження lifestyle_profile.json: ...
|
| 136 |
-
```
|
| 137 |
-
→ Перевірте синтаксис JSON (коми, лапки)
|
| 138 |
-
|
| 139 |
-
**Якщо API не працює:**
|
| 140 |
-
```
|
| 141 |
-
Помилка API: ...
|
| 142 |
-
```
|
| 143 |
-
→ Перевірте GEMINI_API_KEY в .env файлі
|
| 144 |
-
|
| 145 |
-
## 🎉 **Успішний тест:**
|
| 146 |
-
|
| 147 |
-
Якщо все працює правильно, ви побачите:
|
| 148 |
-
- Mark's профіль коректно завантажений
|
| 149 |
-
- Медичні запити враховують його складний анамнез
|
| 150 |
-
- Lifestyle поради адаптовані під ампутацію та діабет
|
| 151 |
-
- Controller коректно розрізняє типи запитів
|
| 152 |
-
- Profile оновлюється після lifestyle сесій
|
| 153 |
-
|
| 154 |
-
---
|
| 155 |
-
**Готово до продакшену!** 🚀
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
examples_test_patient.md
DELETED
|
@@ -1,383 +0,0 @@
|
|
| 1 |
-
# 👥 Приклади тестових пацієнтів
|
| 2 |
-
|
| 3 |
-
## 🧓 Пацієнт 1: "Elderly_Mary" - Старша жінка з множинними коморбідностями
|
| 4 |
-
|
| 5 |
-
### clinical_background.json
|
| 6 |
-
```json
|
| 7 |
-
{
|
| 8 |
-
"patient_summary": {
|
| 9 |
-
"active_problems": [
|
| 10 |
-
"Essential hypertension (uncontrolled)",
|
| 11 |
-
"Type 2 diabetes mellitus with complications",
|
| 12 |
-
"Chronic kidney disease stage 3",
|
| 13 |
-
"Osteoarthritis bilateral knees",
|
| 14 |
-
"Depression, recurrent episode",
|
| 15 |
-
"Falls risk - history of 3 falls last year"
|
| 16 |
-
],
|
| 17 |
-
"past_medical_history": [
|
| 18 |
-
"Myocardial infarction (2020)",
|
| 19 |
-
"Stroke with residual left-sided weakness (2019)",
|
| 20 |
-
"Hip fracture left (2022)",
|
| 21 |
-
"Chronic heart failure"
|
| 22 |
-
],
|
| 23 |
-
"current_medications": [
|
| 24 |
-
"Amlodipine 10mg daily",
|
| 25 |
-
"Metformin 1000mg twice daily",
|
| 26 |
-
"Lisinopril 20mg daily",
|
| 27 |
-
"Atorvastatin 40mg at bedtime",
|
| 28 |
-
"Metoprolol 50mg twice daily",
|
| 29 |
-
"Furosemide 40mg daily",
|
| 30 |
-
"Sertraline 50mg daily",
|
| 31 |
-
"Calcium + Vitamin D3 daily"
|
| 32 |
-
],
|
| 33 |
-
"allergies": "Penicillin - rash, NSAIDs - GI upset"
|
| 34 |
-
},
|
| 35 |
-
"vital_signs_and_measurements": [
|
| 36 |
-
"Blood Pressure: 165/95 (last visit)",
|
| 37 |
-
"Heart Rate: 78 bpm",
|
| 38 |
-
"Weight: 78kg",
|
| 39 |
-
"Height: 1.58m",
|
| 40 |
-
"BMI: 31.2 kg/m²",
|
| 41 |
-
"HbA1c: 8.2% (poor control)"
|
| 42 |
-
],
|
| 43 |
-
"laboratory_results": [
|
| 44 |
-
"Creatinine: 145 μmol/L (elevated)",
|
| 45 |
-
"eGFR: 42 ml/min/1.73m² (stage 3 CKD)",
|
| 46 |
-
"HbA1c: 8.2% (64 mmol/mol)",
|
| 47 |
-
"LDL: 3.2 mmol/L"
|
| 48 |
-
],
|
| 49 |
-
"assessment_and_plan": "76-year-old female with multiple cardiovascular risk factors and functional limitations. Primary goals: BP control, diabetes management, fall prevention. Requires gentle lifestyle modifications with careful monitoring.",
|
| 50 |
-
"critical_alerts": [
|
| 51 |
-
"High fall risk - requires mobility assessment",
|
| 52 |
-
"CKD stage 3 - monitor kidney function with any changes",
|
| 53 |
-
"Depression - monitor for worsening mood",
|
| 54 |
-
"Uncontrolled hypertension and diabetes"
|
| 55 |
-
],
|
| 56 |
-
"social_history": {
|
| 57 |
-
"living_situation": "Lives alone, adult children nearby",
|
| 58 |
-
"mobility": "Uses walking frame, limited to ground floor",
|
| 59 |
-
"smoking_status": "Never smoker",
|
| 60 |
-
"alcohol_use": "Occasional glass of wine"
|
| 61 |
-
},
|
| 62 |
-
"recent_clinical_events_and_encounters": [
|
| 63 |
-
"2025-01-10: Fall at home, no injury but increased anxiety",
|
| 64 |
-
"2024-12-15: ER visit for chest pain - ruled out MI, anxiety-related",
|
| 65 |
-
"2024-11-20: Routine follow-up - BP poorly controlled, meds adjusted"
|
| 66 |
-
]
|
| 67 |
-
}
|
| 68 |
-
```
|
| 69 |
-
|
| 70 |
-
### lifestyle_profile.json
|
| 71 |
-
```json
|
| 72 |
-
{
|
| 73 |
-
"patient_name": "Mary",
|
| 74 |
-
"patient_age": "76",
|
| 75 |
-
"conditions": [
|
| 76 |
-
"essential hypertension",
|
| 77 |
-
"type 2 diabetes",
|
| 78 |
-
"chronic kidney disease",
|
| 79 |
-
"osteoarthritis",
|
| 80 |
-
"depression",
|
| 81 |
-
"history of stroke"
|
| 82 |
-
],
|
| 83 |
-
"primary_goal": "Improve mobility and independence while managing multiple chronic conditions safely. Prevent falls and maintain current functional level.",
|
| 84 |
-
"exercise_preferences": [
|
| 85 |
-
"chair exercises",
|
| 86 |
-
"gentle walking with frame",
|
| 87 |
-
"tai chi (interested but never tried)",
|
| 88 |
-
"swimming (if accessible)"
|
| 89 |
-
],
|
| 90 |
-
"exercise_limitations": [
|
| 91 |
-
"Left-sided weakness from stroke",
|
| 92 |
-
"Severe knee arthritis - painful weight bearing",
|
| 93 |
-
"High fall risk - balance issues",
|
| 94 |
-
"Limited endurance due to heart condition",
|
| 95 |
-
"Gets breathless with minimal exertion",
|
| 96 |
-
"Requires walking frame for mobility"
|
| 97 |
-
],
|
| 98 |
-
"dietary_notes": [
|
| 99 |
-
"Diabetic diet - needs simple carb counting education",
|
| 100 |
-
"Low sodium for hypertension and heart failure",
|
| 101 |
-
"CKD diet - limited protein and phosphorus",
|
| 102 |
-
"Poor appetite due to depression",
|
| 103 |
-
"Lives alone - convenience foods common",
|
| 104 |
-
"Limited cooking ability due to arthritis"
|
| 105 |
-
],
|
| 106 |
-
"personal_preferences": [
|
| 107 |
-
"very cautious about new activities due to fall anxiety",
|
| 108 |
-
"prefers morning activities when energy is better",
|
| 109 |
-
"needs frequent encouragement and reassurance",
|
| 110 |
-
"responds well to small, achievable goals",
|
| 111 |
-
"family involvement important for motivation"
|
| 112 |
-
],
|
| 113 |
-
"journey_summary": "Elderly patient with complex medical needs seeking to maintain independence. Recent falls have increased anxiety about movement. Needs gentle, supervised approach to lifestyle modifications.",
|
| 114 |
-
"last_session_summary": "",
|
| 115 |
-
"progress_metrics": {
|
| 116 |
-
"current_mobility": "walking frame required, 50m max distance",
|
| 117 |
-
"exercise_frequency": "0 times/week - afraid to move",
|
| 118 |
-
"fall_incidents": "3 in past 12 months",
|
| 119 |
-
"medication_adherence": "good with pill organizer",
|
| 120 |
-
"bp_control": "poor - 165/95 average",
|
| 121 |
-
"diabetes_control": "poor - HbA1c 8.2%"
|
| 122 |
-
}
|
| 123 |
-
}
|
| 124 |
-
```
|
| 125 |
-
|
| 126 |
-
---
|
| 127 |
-
|
| 128 |
-
## 🏃 Пацієнт 2: "Athletic_John" - Молодий спортсмен після травми
|
| 129 |
-
|
| 130 |
-
### clinical_background.json
|
| 131 |
-
```json
|
| 132 |
-
{
|
| 133 |
-
"patient_summary": {
|
| 134 |
-
"active_problems": [
|
| 135 |
-
"ACL reconstruction recovery (3 months post-op)",
|
| 136 |
-
"Post-surgical knee pain and swelling",
|
| 137 |
-
"Muscle atrophy right quadriceps",
|
| 138 |
-
"Anxiety related to return to sport",
|
| 139 |
-
"Sleep disturbance due to pain"
|
| 140 |
-
],
|
| 141 |
-
"past_medical_history": [
|
| 142 |
-
"ACL tear during football match (6 months ago)",
|
| 143 |
-
"Previous ankle sprain (2022)",
|
| 144 |
-
"Exercise-induced asthma (childhood)"
|
| 145 |
-
],
|
| 146 |
-
"current_medications": [
|
| 147 |
-
"Ibuprofen 400mg as needed for pain",
|
| 148 |
-
"Physiotherapy exercises daily",
|
| 149 |
-
"Protein supplements"
|
| 150 |
-
],
|
| 151 |
-
"allergies": "No known drug allergies"
|
| 152 |
-
},
|
| 153 |
-
"vital_signs_and_measurements": [
|
| 154 |
-
"Blood Pressure: 118/72",
|
| 155 |
-
"Heart Rate: 58 bpm (athletic)",
|
| 156 |
-
"Weight: 82kg (lost 3kg since surgery)",
|
| 157 |
-
"Height: 1.85m",
|
| 158 |
-
"BMI: 24.0 kg/m²",
|
| 159 |
-
"Body fat: 12% (increased from 8% pre-injury)"
|
| 160 |
-
],
|
| 161 |
-
"laboratory_results": [
|
| 162 |
-
"All routine bloods normal",
|
| 163 |
-
"Vitamin D: sufficient"
|
| 164 |
-
],
|
| 165 |
-
"assessment_and_plan": "24-year-old male athlete 3 months post ACL reconstruction. Good surgical healing, ready for progressive return to activity under physiotherapy guidance. Mental health support may be needed for sports anxiety.",
|
| 166 |
-
"critical_alerts": [
|
| 167 |
-
"Do not exceed physiotherapy exercise guidelines",
|
| 168 |
-
"No pivoting or cutting movements until cleared",
|
| 169 |
-
"Monitor for signs of depression or anxiety"
|
| 170 |
-
],
|
| 171 |
-
"social_history": {
|
| 172 |
-
"occupation": "Semi-professional footballer",
|
| 173 |
-
"activity_level": "Previously 6-7 training sessions per week",
|
| 174 |
-
"smoking_status": "Never",
|
| 175 |
-
"alcohol_use": "Social drinking, 2-3 units per week"
|
| 176 |
-
},
|
| 177 |
-
"recent_clinical_events_and_encounters": [
|
| 178 |
-
"2025-01-05: Physiotherapy review - progressing well",
|
| 179 |
-
"2024-12-20: Orthopedic follow-up - cleared for gym work",
|
| 180 |
-
"2024-11-15: 6-week post-op check - healing excellent"
|
| 181 |
-
]
|
| 182 |
-
}
|
| 183 |
-
```
|
| 184 |
-
|
| 185 |
-
### lifestyle_profile.json
|
| 186 |
-
```json
|
| 187 |
-
{
|
| 188 |
-
"patient_name": "John",
|
| 189 |
-
"patient_age": "24",
|
| 190 |
-
"conditions": [
|
| 191 |
-
"ACL reconstruction recovery",
|
| 192 |
-
"post-surgical deconditioning",
|
| 193 |
-
"sports performance anxiety"
|
| 194 |
-
],
|
| 195 |
-
"primary_goal": "Return to competitive football safely and regain pre-injury fitness level. Build confidence in knee stability and prevent re-injury.",
|
| 196 |
-
"exercise_preferences": [
|
| 197 |
-
"weight training (upper body focus currently)",
|
| 198 |
-
"swimming",
|
| 199 |
-
"cycling",
|
| 200 |
-
"football-specific drills (when cleared)",
|
| 201 |
-
"plyometric training (future goal)"
|
| 202 |
-
],
|
| 203 |
-
"exercise_limitations": [
|
| 204 |
-
"No pivoting or cutting movements yet",
|
| 205 |
-
"Limited knee flexion under load",
|
| 206 |
-
"No contact sports until 6+ months post-op",
|
| 207 |
-
"Must follow physiotherapy protocol strictly",
|
| 208 |
-
"Avoid high-impact activities on hard surfaces"
|
| 209 |
-
],
|
| 210 |
-
"dietary_notes": [
|
| 211 |
-
"High protein intake for muscle recovery",
|
| 212 |
-
"Anti-inflammatory foods to reduce swelling",
|
| 213 |
-
"Adequate calories to support training",
|
| 214 |
-
"Sports nutrition knowledge good",
|
| 215 |
-
"Hydration important for recovery"
|
| 216 |
-
],
|
| 217 |
-
"personal_preferences": [
|
| 218 |
-
"highly motivated and goal-oriented",
|
| 219 |
-
"impatient with slow recovery process",
|
| 220 |
-
"competitive personality",
|
| 221 |
-
"prefers intense workouts when possible",
|
| 222 |
-
"needs measurable progress to stay motivated"
|
| 223 |
-
],
|
| 224 |
-
"journey_summary": "Highly motivated athlete recovering from major knee surgery. Risk of doing too much too soon. Needs structured progression plan and psychological support for sports anxiety.",
|
| 225 |
-
"last_session_summary": "",
|
| 226 |
-
"progress_metrics": {
|
| 227 |
-
"knee_flexion_range": "120 degrees (target: 135+)",
|
| 228 |
-
"quad_strength": "70% of uninjured leg",
|
| 229 |
-
"cardio_fitness": "estimated 60% of pre-injury level",
|
| 230 |
-
"training_frequency": "4 sessions/week (physio + gym)",
|
| 231 |
-
"pain_level": "2/10 at rest, 4/10 with exercise",
|
| 232 |
-
"return_to_sport_timeline": "3-4 months if progress continues"
|
| 233 |
-
}
|
| 234 |
-
}
|
| 235 |
-
```
|
| 236 |
-
|
| 237 |
-
---
|
| 238 |
-
|
| 239 |
-
## 🤰 Пацієнт 3: "Pregnant_Sarah" - Вагітна з гестаційним діабетом
|
| 240 |
-
|
| 241 |
-
### clinical_background.json
|
| 242 |
-
```json
|
| 243 |
-
{
|
| 244 |
-
"patient_summary": {
|
| 245 |
-
"active_problems": [
|
| 246 |
-
"Pregnancy 28 weeks gestation",
|
| 247 |
-
"Gestational diabetes mellitus (diet-controlled)",
|
| 248 |
-
"Pregnancy-induced hypertension (mild)",
|
| 249 |
-
"Iron deficiency anemia",
|
| 250 |
-
"Lower back pain",
|
| 251 |
-
"Carpal tunnel syndrome pregnancy-related"
|
| 252 |
-
],
|
| 253 |
-
"past_medical_history": [
|
| 254 |
-
"Gravida 2, Para 1 (one previous normal delivery)",
|
| 255 |
-
"Previous gestational diabetes (resolved postpartum)",
|
| 256 |
-
"Polycystic ovary syndrome"
|
| 257 |
-
],
|
| 258 |
-
"current_medications": [
|
| 259 |
-
"Prenatal vitamins with iron",
|
| 260 |
-
"Additional iron supplement 65mg daily",
|
| 261 |
-
"Folic acid 5mg daily",
|
| 262 |
-
"Vitamin D3 1000 IU daily"
|
| 263 |
-
],
|
| 264 |
-
"allergies": "No known drug allergies"
|
| 265 |
-
},
|
| 266 |
-
"vital_signs_and_measurements": [
|
| 267 |
-
"Blood Pressure: 142/88 (elevated for pregnancy)",
|
| 268 |
-
"Heart Rate: 88 bpm",
|
| 269 |
-
"Pre-pregnancy weight: 68kg",
|
| 270 |
-
"Current weight: 78kg",
|
| 271 |
-
"Weight gain: 10kg (appropriate for gestational age)",
|
| 272 |
-
"Fundal height: 28cm (matches dates)"
|
| 273 |
-
],
|
| 274 |
-
"laboratory_results": [
|
| 275 |
-
"Glucose tolerance test: abnormal (gestational diabetes)",
|
| 276 |
-
"Hemoglobin: 95 g/L (anemic)",
|
| 277 |
-
"Ferritin: low",
|
| 278 |
-
"Urine protein: trace (monitoring for preeclampsia)"
|
| 279 |
-
],
|
| 280 |
-
"assessment_and_plan": "28-year-old female, 28 weeks pregnant with gestational diabetes and mild hypertension. Currently well-controlled with diet. Regular monitoring required. Delivery planning at 38-39 weeks.",
|
| 281 |
-
"critical_alerts": [
|
| 282 |
-
"Monitor blood pressure - risk of preeclampsia",
|
| 283 |
-
"Blood glucose monitoring required",
|
| 284 |
-
"Avoid exercises lying flat on back after 20 weeks",
|
| 285 |
-
"Contact immediately if severe headaches, visual changes, or upper abdominal pain"
|
| 286 |
-
],
|
| 287 |
-
"social_history": {
|
| 288 |
-
"occupation": "Office worker (desk job)",
|
| 289 |
-
"living_situation": "Married, supportive partner",
|
| 290 |
-
"previous_pregnancy": "Uncomplicated delivery 3 years ago",
|
| 291 |
-
"smoking_status": "Never",
|
| 292 |
-
"alcohol_use": "None during pregnancy"
|
| 293 |
-
},
|
| 294 |
-
"recent_clinical_events_and_encounters": [
|
| 295 |
-
"2025-01-08: Antenatal appointment - BP slightly elevated",
|
| 296 |
-
"2024-12-28: Glucose tolerance test - abnormal result",
|
| 297 |
-
"2024-12-15: Routine 26-week appointment - all well"
|
| 298 |
-
]
|
| 299 |
-
}
|
| 300 |
-
```
|
| 301 |
-
|
| 302 |
-
### lifestyle_profile.json
|
| 303 |
-
```json
|
| 304 |
-
{
|
| 305 |
-
"patient_name": "Sarah",
|
| 306 |
-
"patient_age": "28",
|
| 307 |
-
"conditions": [
|
| 308 |
-
"pregnancy 28 weeks",
|
| 309 |
-
"gestational diabetes",
|
| 310 |
-
"pregnancy-induced hypertension",
|
| 311 |
-
"iron deficiency anemia"
|
| 312 |
-
],
|
| 313 |
-
"primary_goal": "Maintain healthy pregnancy with good blood sugar control, manage blood pressure, and prepare physically for delivery while ensuring baby's wellbeing.",
|
| 314 |
-
"exercise_preferences": [
|
| 315 |
-
"prenatal yoga",
|
| 316 |
-
"walking",
|
| 317 |
-
"swimming",
|
| 318 |
-
"stationary cycling",
|
| 319 |
-
"prenatal fitness classes"
|
| 320 |
-
],
|
| 321 |
-
"exercise_limitations": [
|
| 322 |
-
"No lying flat on back after 20 weeks",
|
| 323 |
-
"Avoid high-impact or contact activities",
|
| 324 |
-
"No scuba diving or activities at altitude",
|
| 325 |
-
"Monitor heart rate - shouldn't exceed 140 bpm",
|
| 326 |
-
"Stop if experiencing dizziness, chest pain, or contractions",
|
| 327 |
-
"Avoid overheating"
|
| 328 |
-
],
|
| 329 |
-
"dietary_notes": [
|
| 330 |
-
"Gestational diabetes diet - controlled carbohydrates",
|
| 331 |
-
"Small frequent meals to manage blood sugar",
|
| 332 |
-
"High fiber foods to prevent constipation",
|
| 333 |
-
"Iron-rich foods for anemia",
|
| 334 |
-
"Adequate protein for fetal growth",
|
| 335 |
-
"Limit caffeine intake",
|
| 336 |
-
"Avoid alcohol completely"
|
| 337 |
-
],
|
| 338 |
-
"personal_preferences": [
|
| 339 |
-
"motivated to have healthy pregnancy",
|
| 340 |
-
"anxious about blood sugar control",
|
| 341 |
-
"prefers gentle, safe activities",
|
| 342 |
-
"likes group exercise for motivation",
|
| 343 |
-
"concerned about weight gain"
|
| 344 |
-
],
|
| 345 |
-
"journey_summary": "Second pregnancy with new diagnosis of gestational diabetes. Previously active but concerned about exercise safety. Needs education on appropriate prenatal fitness and diabetes management.",
|
| 346 |
-
"last_session_summary": "",
|
| 347 |
-
"progress_metrics": {
|
| 348 |
-
"blood_glucose_control": "diet-controlled, monitoring 4x daily",
|
| 349 |
-
"blood_pressure": "mild elevation, monitoring twice weekly",
|
| 350 |
-
"weight_gain": "10kg total, appropriate for gestation",
|
| 351 |
-
"exercise_frequency": "2-3 times per week currently",
|
| 352 |
-
"energy_level": "moderate fatigue, better in second trimester",
|
| 353 |
-
"delivery_preparation": "considering prenatal classes"
|
| 354 |
-
}
|
| 355 |
-
}
|
| 356 |
-
```
|
| 357 |
-
|
| 358 |
-
---
|
| 359 |
-
|
| 360 |
-
## 📋 Використання прикладів
|
| 361 |
-
|
| 362 |
-
**Для тестування medical режиму:**
|
| 363 |
-
- Завантажте "Elderly_Mary" - протестуйте red flags (падіння, біль у грудях)
|
| 364 |
-
- Використовуйте критичні попередження для перевірки ескалації
|
| 365 |
-
|
| 366 |
-
**Для тестування lifestyle персоналізації:**
|
| 367 |
-
- "Athletic_John" - складні обмеження після травми
|
| 368 |
-
- "Pregnant_Sarah" - специфічні safety guidelines
|
| 369 |
-
|
| 370 |
-
**Для комплексного тестування:**
|
| 371 |
-
- Всі три пацієнти мають різні рівні складності
|
| 372 |
-
- Можна тестувати адаптацію системи до різних вікових груп та станів
|
| 373 |
-
|
| 374 |
-
**Зберегти як окремі файли:**
|
| 375 |
-
```
|
| 376 |
-
test_patients/
|
| 377 |
-
├── elderly_mary_clinical.json
|
| 378 |
-
├── elderly_mary_lifestyle.json
|
| 379 |
-
├── athletic_john_clinical.json
|
| 380 |
-
├── athletic_john_lifestyle.json
|
| 381 |
-
├── pregnant_sarah_clinical.json
|
| 382 |
-
└── pregnant_sarah_lifestyle.json
|
| 383 |
-
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|