Files
crm.clientright.ru/ticket_form/docs/WIZARD_OPTIMIZATION_ANALYSIS.md
Fedor de011efba9 fix: исправлен конфликт имён переменных в loadDraft (claimId -> finalClaimId)
- Исправлена ошибка ReferenceError при загрузке черновиков
- Переименована локальная переменная claimId в finalClaimId для избежания конфликта с параметром функции
- Обновлена логика извлечения claim_id из разных источников (claim.claim_id, payload.claim_id, body.claim_id, claim.id)
- Добавлен fallback на параметр claimId функции для надёжности
2025-11-19 23:33:52 +03:00

265 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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