- Добавлены логи в frontend (ClaimForm.tsx) для отслеживания unified_id и запросов к API - Добавлены логи в backend (claims.py) для отладки SQL запросов - Создан лог сессии с описанием проблемы и текущего состояния - Проблема: API возвращает 0 черновиков, хотя в БД есть данные
265 lines
12 KiB
Markdown
265 lines
12 KiB
Markdown
# Анализ оптимизации генерации визарда
|
||
|
||
**Дата:** 2025-01-XX
|
||
**Текущее время генерации:** ~30-40 секунд
|
||
**Цель:** Сократить до 5-15 секунд
|
||
|
||
---
|
||
|
||
## 🎯 Вариант 1: Двухэтапный подход (твоя идея)
|
||
|
||
### Концепция:
|
||
1. **ИИ только классифицирует** случай и выдаёт список нужных документов/полей
|
||
2. **Бэкенд строит визард** по шаблонам на основе классификации
|
||
|
||
### Архитектура:
|
||
|
||
```
|
||
Описание → ИИ (классификация) → Бэкенд (шаблоны) → Визард
|
||
```
|
||
|
||
**ИИ возвращает:**
|
||
```json
|
||
{
|
||
"case_type": "product_defect", // или "service_issue", "delay", "conflict"
|
||
"required_fields": ["item", "purchase_date", "purchase_amount", "warranty_info"],
|
||
"required_documents": ["contract", "payment", "photos"],
|
||
"optional_documents": ["correspondence", "diagnosis"],
|
||
"extracted_data": {
|
||
"item": "Смартфон",
|
||
"seller": "DNS",
|
||
"purchase_date": "2024-12-15"
|
||
}
|
||
}
|
||
```
|
||
|
||
**Бэкенд использует шаблоны:**
|
||
```python
|
||
WIZARD_TEMPLATES = {
|
||
"product_defect": {
|
||
"questions": [
|
||
{"name": "item", "label": "Как называется товар?", ...},
|
||
{"name": "purchase_date", "label": "Когда купили?", "control": "input[type=\"date\"]", ...},
|
||
{"name": "purchase_amount", "label": "Сколько стоил?", ...},
|
||
{"name": "warranty_info", "label": "Есть ли гарантия?", ...},
|
||
{"name": "problem_description", "label": "Опишите проблему", "control": "textarea", ...},
|
||
{"name": "documents_available", "label": "Какие документы есть?", "control": "input[type=\"checkbox\"]", ...},
|
||
{"name": "desired_outcome", "label": "Что хотите получить?", "control": "input[type=\"radio\"]", ...}
|
||
],
|
||
"documents": [
|
||
{"id": "contract", "name": "Договор", "required": true, ...},
|
||
{"id": "payment", "name": "Чек", "required": true, ...},
|
||
{"id": "photos", "name": "Фото дефекта", "required": true, ...}
|
||
]
|
||
},
|
||
"service_issue": { ... },
|
||
"delay": { ... },
|
||
"conflict": { ... }
|
||
}
|
||
```
|
||
|
||
### Плюсы:
|
||
✅ **Скорость:** ИИ только классифицирует (5-10 сек) + бэкенд мгновенно (0.1 сек) = **5-10 сек всего**
|
||
✅ **Предсказуемость:** Визарды всегда структурированы одинаково
|
||
✅ **Контроль:** Легко менять вопросы/документы без изменения промпта
|
||
✅ **Кеширование:** Можно кешировать шаблоны в памяти
|
||
✅ **Тестирование:** Легко тестировать шаблоны отдельно от ИИ
|
||
|
||
### Минусы:
|
||
❌ **Гибкость:** Сложные/уникальные случаи могут не попасть в шаблоны
|
||
❌ **Разработка:** Нужно создать и поддерживать библиотеку шаблонов
|
||
❌ **Классификация:** ИИ должен точно определить тип дела
|
||
|
||
### Реализация:
|
||
1. Создать `wizard_templates.py` в бэкенде с шаблонами
|
||
2. Упростить промпт для ИИ (только классификация + список полей/документов)
|
||
3. Создать `WizardBuilder` сервис, который собирает визард из шаблона
|
||
4. Обновить n8n workflow для упрощённого ответа
|
||
|
||
**Ожидаемое время:** 5-10 секунд
|
||
|
||
---
|
||
|
||
## 🚀 Вариант 2: Гибридный подход
|
||
|
||
### Концепция:
|
||
1. **ИИ классифицирует** и выдаёт список полей/документов (быстро)
|
||
2. **Бэкенд использует шаблоны** для стандартных случаев
|
||
3. **ИИ достраивает** уникальные вопросы для сложных случаев (опционально)
|
||
|
||
### Плюсы:
|
||
✅ **Баланс:** Скорость + гибкость
|
||
✅ **Fallback:** Если шаблон не подходит, ИИ достраивает
|
||
|
||
### Минусы:
|
||
❌ **Сложность:** Нужно решать, когда использовать шаблон, а когда ИИ
|
||
|
||
**Ожидаемое время:** 5-15 секунд (зависит от сложности)
|
||
|
||
---
|
||
|
||
## ⚡ Вариант 3: Кеширование готовых визардов
|
||
|
||
### Концепция:
|
||
1. **Кешировать** готовые визарды по типу дела
|
||
2. **ИИ только извлекает** данные из описания для автозаполнения
|
||
|
||
### Плюсы:
|
||
✅ **Максимальная скорость:** 1-2 секунды для стандартных случаев
|
||
✅ **Простота:** Минимальные изменения в коде
|
||
|
||
### Минусы:
|
||
❌ **Ограниченность:** Только для типовых случаев
|
||
❌ **Хранение:** Нужно хранить кеш визардов
|
||
|
||
**Ожидаемое время:** 1-2 секунды (кеш) или 30 сек (первый раз)
|
||
|
||
---
|
||
|
||
## 🔥 Вариант 4: Упрощение промпта + быстрая модель
|
||
|
||
### Концепция:
|
||
1. **Сократить промпт** до минимума (убрать примеры, оставить только структуру)
|
||
2. **Использовать `gpt-4o-mini`** вместо `gpt-4.1-mini`
|
||
3. **Убрать неиспользуемые поля** из ответа
|
||
|
||
### Плюсы:
|
||
✅ **Простота:** Минимальные изменения
|
||
✅ **Скорость:** 10-15 секунд
|
||
|
||
### Минусы:
|
||
❌ **Качество:** Может снизиться качество визардов
|
||
❌ **Ограничение:** Всё ещё зависит от скорости ИИ
|
||
|
||
**Ожидаемое время:** 10-15 секунд
|
||
|
||
---
|
||
|
||
## 🎨 Вариант 5: Предгенерированные шаблоны + ИИ только для извлечения
|
||
|
||
### Концепция:
|
||
1. **Все визарды предгенерированы** в бэкенде (шаблоны)
|
||
2. **ИИ только извлекает** данные из описания для автозаполнения
|
||
3. **Бэкенд выбирает** подходящий шаблон на основе ключевых слов
|
||
|
||
### Плюсы:
|
||
✅ **Максимальная скорость:** 1-3 секунды
|
||
✅ **Предсказуемость:** Всегда одинаковые визарды
|
||
|
||
### Минусы:
|
||
❌ **Ограниченность:** Только для типовых случаев
|
||
❌ **Классификация:** Нужна простая классификация (можно без ИИ)
|
||
|
||
**Ожидаемое время:** 1-3 секунды
|
||
|
||
---
|
||
|
||
## 📊 Сравнение вариантов
|
||
|
||
| Вариант | Время | Гибкость | Сложность | Рекомендация |
|
||
|---------|------|----------|-----------|--------------|
|
||
| **1. Двухэтапный** | 5-10 сек | ⭐⭐⭐⭐ | ⭐⭐⭐ | ✅ **Лучший баланс** |
|
||
| **2. Гибридный** | 5-15 сек | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ✅ Хорошо для сложных случаев |
|
||
| **3. Кеширование** | 1-2 сек | ⭐⭐ | ⭐⭐ | ✅ Для типовых случаев |
|
||
| **4. Упрощение** | 10-15 сек | ⭐⭐⭐⭐ | ⭐ | ✅ Быстрая реализация |
|
||
| **5. Предгенерированные** | 1-3 сек | ⭐⭐ | ⭐⭐ | ✅ Для простых случаев |
|
||
|
||
---
|
||
|
||
## 🎯 Рекомендация
|
||
|
||
### Для начала: **Вариант 1 (Двухэтапный)**
|
||
|
||
**Почему:**
|
||
1. **Оптимальный баланс** скорости и гибкости
|
||
2. **Масштабируемость:** Легко добавлять новые типы дел
|
||
3. **Контроль:** Все визарды структурированы и предсказуемы
|
||
4. **Тестируемость:** Шаблоны легко тестировать
|
||
|
||
### План реализации:
|
||
|
||
#### Этап 1: Классификация (ИИ)
|
||
```python
|
||
# Упрощённый промпт для ИИ
|
||
"""
|
||
Проанализируй описание проблемы и определи:
|
||
1. Тип дела (product_defect, service_issue, delay, conflict, other)
|
||
2. Какие поля нужно собрать (item, purchase_date, purchase_amount, warranty_info, ...)
|
||
3. Какие документы нужны (contract, payment, photos, correspondence, ...)
|
||
4. Что уже известно из описания (для автозаполнения)
|
||
|
||
Верни JSON:
|
||
{
|
||
"case_type": "product_defect",
|
||
"required_fields": ["item", "purchase_date", "purchase_amount", "warranty_info"],
|
||
"required_documents": ["contract", "payment", "photos"],
|
||
"optional_documents": ["correspondence"],
|
||
"extracted_data": {
|
||
"item": "Смартфон",
|
||
"seller": "DNS"
|
||
}
|
||
}
|
||
"""
|
||
```
|
||
|
||
#### Этап 2: Шаблоны (Бэкенд)
|
||
```python
|
||
# ticket_form/backend/app/services/wizard_builder.py
|
||
class WizardBuilder:
|
||
TEMPLATES = {
|
||
"product_defect": {
|
||
"questions": [...],
|
||
"documents": [...]
|
||
},
|
||
"service_issue": {...},
|
||
"delay": {...},
|
||
"conflict": {...}
|
||
}
|
||
|
||
def build_wizard(self, classification: dict) -> dict:
|
||
template = self.TEMPLATES[classification["case_type"]]
|
||
# Собираем визард из шаблона
|
||
# Добавляем автозаполнение из extracted_data
|
||
return wizard_plan
|
||
```
|
||
|
||
#### Этап 3: Интеграция
|
||
- Обновить n8n workflow для упрощённого ответа
|
||
- Создать эндпоинт `/api/v1/wizard/build` в бэкенде
|
||
- Обновить фронтенд для работы с новым форматом
|
||
|
||
---
|
||
|
||
## 💡 Дополнительные идеи
|
||
|
||
### 1. Параллельная обработка
|
||
- ИИ классифицирует
|
||
- Параллельно бэкенд готовит шаблоны
|
||
- Собираем результат
|
||
|
||
### 2. Инкрементальная генерация
|
||
- Сначала показываем базовые вопросы (из шаблона)
|
||
- Потом достраиваем уникальные (если нужно)
|
||
|
||
### 3. Умное кеширование
|
||
- Кешировать классификации по хешу описания
|
||
- Кешировать готовые визарды по типу дела
|
||
|
||
### 4. Предзагрузка шаблонов
|
||
- Загружать шаблоны в память при старте
|
||
- Не обращаться к БД/файлам каждый раз
|
||
|
||
---
|
||
|
||
## 🚀 Следующие шаги
|
||
|
||
1. **Создать шаблоны** для основных типов дел (5-7 типов)
|
||
2. **Упростить промпт** для классификации
|
||
3. **Реализовать WizardBuilder** в бэкенде
|
||
4. **Обновить n8n workflow**
|
||
5. **Протестировать** на реальных случаях
|
||
6. **Измерить скорость** и сравнить с текущей
|
||
|
||
**Ожидаемый результат:** 5-10 секунд вместо 30-40 секунд
|
||
|