Files
aiform_dev/docs/WIZARD_OPTIMIZATION_ANALYSIS.md

265 lines
12 KiB
Markdown
Raw Normal View History

# Анализ оптимизации генерации визарда
**Дата:** 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 секунд