File size: 13,042 Bytes
461adca
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
# Редагування промптів - Документація

## Огляд

Додано можливість редагування промптів з повною ізоляцією сесій для безпечної роботи на хмарних серверах (наприклад, Hugging Face Spaces).

## Основні можливості

### 1. Ізоляція сесій користувачів

Кожен користувач отримує унікальний session ID при відкритті додатку:
- Session ID генерується автоматично при завантаженні інтерфейсу
- Всі дані користувача (правові позиції, результати пошуку, налаштування промптів) зберігаються в ізольованій сесії
- Сесії автоматично видаляються після 30 хвилин неактивності (налаштовується в config)

### 2. Редагування промптів

У вкладці "⚙️ Налаштування" користувачі можуть редагувати три типи промптів:

#### 📋 Системний промпт
Визначає роль та базові інструкції для AI.
- За замовчуванням: "Ти - кваліфікований юрист-аналітик..."
- Впливає на всі операції з AI

#### ⚖️ Промпт генерації правової позиції
Шаблон для генерації правової позиції з судового рішення.
- Містить плейсхолдери: `{court_decision_text}` та `{comment}`
- Впливає на формат та зміст згенерованих правових позицій

#### 🔍 Промпт аналізу прецедентів
Шаблон для порівняльного аналізу правових позицій.
- Містить плейсхолдери: `{query}`, `{question}`, `{context_str}`
- Впливає на аналіз релевантності знайдених позицій

### 3. Операції з промптами

#### 💾 Зберегти промпти
- Зберігає всі три промпти в сесію користувача
- Валідація: максимум 50,000 символів на промпт
- Повідомлення про успішне збереження

#### 🔄 Скинути до стандартних
- Відновлює всі промпти до початкових значень
- Оновлює відображення в полях редагування

## Архітектура

### Компоненти

```
src/session/
├── state.py       - UserSessionState з полем custom_prompts
├── manager.py     - SessionManager для управління сесіями
└── storage.py     - Зберігання (Memory/Redis)

interface.py       - UI з вкладкою "Налаштування" + інтеграція з сесіями
main.py            - generate_legal_position() приймає кастомні промпти
prompts.py         - Стандартні промпти (fallback)
```

### Потік даних

1. **Завантаження додатку**
   - Генерується session_id (UUID4)
   - Створюється нова сесія в SessionManager
   - Завантажуються промпти (кастомні або стандартні)

2. **Редагування промптів**
   - Користувач змінює текст у полях редагування
   - Натискає "💾 Зберегти промпти"
   - Промпти зберігаються в `session.custom_prompts`
   - SessionManager оновлює сесію в storage

3. **Генерація правової позиції**
   - Отримує session_id з Gradio State
   - Завантажує сесію з SessionManager
   - Витягує кастомні промпти через `session.get_prompt()`
   - Передає промпти в `generate_legal_position()`
   - LLM використовує кастомні промпти
   - Результат зберігається в сесію

4. **Закінчення сесії**
   - Автоматична очистка після 30 хв неактивності
   - Background task в SessionManager видаляє застарілі сесії

## Налаштування

### config/environments/default.yaml

```yaml
session:
  timeout_minutes: 30              # Таймаут сесії
  cleanup_interval_minutes: 5      # Інтервал очистки
  max_sessions: 1000               # Максимум активних сесій
  storage_type: "memory"           # "memory" або "redis"
```

### Для production (Redis)

```yaml
session:
  storage_type: "redis"

redis:
  host: "localhost"
  port: 6379
  db: 0
  password: null
```

## Безпека

### Ізоляція користувачів**Гарантовано:**
- Кожен користувач має унікальний session_id
- Дані зберігаються окремо для кожної сесії
- Неможливо отримати доступ до даних іншого користувача

### Валідація промптів

**Захист:**
- Обмеження довжини промптів (50,000 символів)
- Очистка застарілих сесій (захист від витоку пам'яті)
- Логування всіх операцій з сесіями

### Відсутність персистентності промптів

⚠️ **Важливо:**
- Кастомні промпти зберігаються тільки на час сесії
- Після таймауту (30 хв) промпти скидаються
- Для збереження промптів назавжди - потрібно додати функціонал експорту/імпорту

## Приклади використання

### Зміна тону відповідей

**Стандартний системний промпт:**
```
Ти - кваліфікований юрист-аналітик, експерт з правових позицій Верховного Суду.
```

**Кастомний (більш формальний):**
```
Ви - висококваліфікований експерт-правознавець з міжнародним досвідом аналізу
судової практики Верховного Суду України. Дотримуйтесь найвищих стандартів
юридичної точності та академічної строгості.
```

### Додавання інструкцій для конкретного типу справ

**Стандартний промпт генерації:**
```
Дотримуйся цих інструкцій...
```

**Кастомний (для цивільних справ):**
```
Дотримуйся цих інструкцій.

ДОДАТКОВІ ВИМОГИ ДЛЯ ЦИВІЛЬНИХ СПРАВ:
1. Обов'язково виділяй позиції щодо процесуальних питань
2. Зазначай застосовані норми ЦПК України
3. Вказуй склад суду та рівень юрисдикції
...
```

## Тестування

### Перевірка ізоляції сесій

1. Відкрийте додаток у двох різних браузерах/вкладках
2. У першій вкладці: змініть системний промпт на "Тест 1"
3. У другій вкладці: змініть системний промпт на "Тест 2"
4. Збережіть в обох вкладках
5. Згенеруйте правову позицію в обох вкладках
6. ✅ Кожна вкладка повинна використовувати свій промпт

### Перевірка persistance

1. Змініть та збережіть промпти
2. Згенеруйте правову позицію (перевірте, що використовуються кастомні промпти)
3. Зачекайте 31 хвилину (або змініть timeout в конфігурації)
4. ✅ Сесія має бути очищена, промпти скинуті до стандартних

## Подальший розвиток

### Планується додати:

1. **Експорт/імпорт промптів**
   - Збереження у JSON/YAML файли
   - Завантаження збережених наборів промптів

2. **Бібліотека шаблонів**
   - Готові набори промптів для різних типів справ
   - Спільнота користувачів може ділитися промптами

3. **Версіонування промптів**
   - Історія змін промптів
   - Можливість відкоту до попередніх версій

4. **A/B тестування**
   - Порівняння результатів з різними промптами
   - Метрики якості генерації

5. **Адміністративна панель**
   - Глобальні промпти для всіх користувачів
   - Статистика використання різних промптів

## Troubleshooting

### Промпти не зберігаються

**Проблема:** Після збереження промптів вони не застосовуються

**Рішення:**
1. Перевірте console в браузері на помилки JavaScript
2. Перевірте логи додатку на помилки Session Manager
3. Переконайтесь, що session_id правильно передається між функціями

### Промпти скидаються занадто швидко

**Проблема:** Сесія закривається раніше 30 хвилин

**Рішення:**
1. Перевірте `config/environments/default.yaml` -> `session.timeout_minutes`
2. Збільште значення таймауту
3. Перезапустіть додаток

### Помилки при використанні кастомних промптів

**Проблема:** LLM повертає помилку або неправильний формат

**Рішення:**
1. Переконайтесь, що промпт містить необхідні плейсхолдери:
   - `{court_decision_text}` і `{comment}` для генерації
   - `{query}`, `{question}`, `{context_str}` для аналізу
2. Перевірте довжину промпту (не більше 50,000 символів)
3. Скиньте промпти до стандартних і перевірте, чи працює базовий функціонал

## Технічні деталі

### UserSessionState.custom_prompts

```python
custom_prompts: Dict[str, str] = {
    'system': str,           # Системний промпт
    'legal_position': str,   # Промпт генерації
    'analysis': str          # Промпт аналізу
}
```

### Методи роботи з промптами

```python
# Отримання промпту (з fallback)
prompt = session.get_prompt('system', DEFAULT_SYSTEM_PROMPT)

# Встановлення промпту
session.set_prompt('system', new_prompt)

# Скидання всіх промптів
session.reset_prompts()
```

### Інтеграція з генерацією

```python
def generate_legal_position(
    # ...існуючі параметри...
    custom_system_prompt: Optional[str] = None,
    custom_lp_prompt: Optional[str] = None
) -> Dict:
    # Використання кастомних або стандартних промптів
    system_prompt = custom_system_prompt or SYSTEM_PROMPT
    lp_prompt = custom_lp_prompt or LEGAL_POSITION_PROMPT

    # Генерація з кастомними промптами
    # ...
```

## Підсумок

Нова функціональність редагування промптів забезпечує:

✅ Повну ізоляцію між користувачами
✅ Безпечну роботу на хмарних серверах
✅ Гнучке налаштування AI під конкретні потреби
✅ Автоматичну очистку застарілих даних
✅ Простий та інтуїтивний інтерфейс

Система готова до production використання на Hugging Face Spaces та інших платформах.