- Исправлена ошибка ReferenceError при загрузке черновиков - Переименована локальная переменная claimId в finalClaimId для избежания конфликта с параметром функции - Обновлена логика извлечения claim_id из разных источников (claim.claim_id, payload.claim_id, body.claim_id, claim.id) - Добавлен fallback на параметр claimId функции для надёжности
12 KiB
Анализ оптимизации генерации визарда
Дата: 2025-01-XX
Текущее время генерации: ~30-40 секунд
Цель: Сократить до 5-15 секунд
🎯 Вариант 1: Двухэтапный подход (твоя идея)
Концепция:
- ИИ только классифицирует случай и выдаёт список нужных документов/полей
- Бэкенд строит визард по шаблонам на основе классификации
Архитектура:
Описание → ИИ (классификация) → Бэкенд (шаблоны) → Визард
ИИ возвращает:
{
"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"
}
}
Бэкенд использует шаблоны:
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 сек всего
✅ Предсказуемость: Визарды всегда структурированы одинаково
✅ Контроль: Легко менять вопросы/документы без изменения промпта
✅ Кеширование: Можно кешировать шаблоны в памяти
✅ Тестирование: Легко тестировать шаблоны отдельно от ИИ
Минусы:
❌ Гибкость: Сложные/уникальные случаи могут не попасть в шаблоны
❌ Разработка: Нужно создать и поддерживать библиотеку шаблонов
❌ Классификация: ИИ должен точно определить тип дела
Реализация:
- Создать
wizard_templates.pyв бэкенде с шаблонами - Упростить промпт для ИИ (только классификация + список полей/документов)
- Создать
WizardBuilderсервис, который собирает визард из шаблона - Обновить n8n workflow для упрощённого ответа
Ожидаемое время: 5-10 секунд
🚀 Вариант 2: Гибридный подход
Концепция:
- ИИ классифицирует и выдаёт список полей/документов (быстро)
- Бэкенд использует шаблоны для стандартных случаев
- ИИ достраивает уникальные вопросы для сложных случаев (опционально)
Плюсы:
✅ Баланс: Скорость + гибкость
✅ Fallback: Если шаблон не подходит, ИИ достраивает
Минусы:
❌ Сложность: Нужно решать, когда использовать шаблон, а когда ИИ
Ожидаемое время: 5-15 секунд (зависит от сложности)
⚡ Вариант 3: Кеширование готовых визардов
Концепция:
- Кешировать готовые визарды по типу дела
- ИИ только извлекает данные из описания для автозаполнения
Плюсы:
✅ Максимальная скорость: 1-2 секунды для стандартных случаев
✅ Простота: Минимальные изменения в коде
Минусы:
❌ Ограниченность: Только для типовых случаев
❌ Хранение: Нужно хранить кеш визардов
Ожидаемое время: 1-2 секунды (кеш) или 30 сек (первый раз)
🔥 Вариант 4: Упрощение промпта + быстрая модель
Концепция:
- Сократить промпт до минимума (убрать примеры, оставить только структуру)
- Использовать
gpt-4o-miniвместоgpt-4.1-mini - Убрать неиспользуемые поля из ответа
Плюсы:
✅ Простота: Минимальные изменения
✅ Скорость: 10-15 секунд
Минусы:
❌ Качество: Может снизиться качество визардов
❌ Ограничение: Всё ещё зависит от скорости ИИ
Ожидаемое время: 10-15 секунд
🎨 Вариант 5: Предгенерированные шаблоны + ИИ только для извлечения
Концепция:
- Все визарды предгенерированы в бэкенде (шаблоны)
- ИИ только извлекает данные из описания для автозаполнения
- Бэкенд выбирает подходящий шаблон на основе ключевых слов
Плюсы:
✅ Максимальная скорость: 1-3 секунды
✅ Предсказуемость: Всегда одинаковые визарды
Минусы:
❌ Ограниченность: Только для типовых случаев
❌ Классификация: Нужна простая классификация (можно без ИИ)
Ожидаемое время: 1-3 секунды
📊 Сравнение вариантов
| Вариант | Время | Гибкость | Сложность | Рекомендация |
|---|---|---|---|---|
| 1. Двухэтапный | 5-10 сек | ⭐⭐⭐⭐ | ⭐⭐⭐ | ✅ Лучший баланс |
| 2. Гибридный | 5-15 сек | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ✅ Хорошо для сложных случаев |
| 3. Кеширование | 1-2 сек | ⭐⭐ | ⭐⭐ | ✅ Для типовых случаев |
| 4. Упрощение | 10-15 сек | ⭐⭐⭐⭐ | ⭐ | ✅ Быстрая реализация |
| 5. Предгенерированные | 1-3 сек | ⭐⭐ | ⭐⭐ | ✅ Для простых случаев |
🎯 Рекомендация
Для начала: Вариант 1 (Двухэтапный)
Почему:
- Оптимальный баланс скорости и гибкости
- Масштабируемость: Легко добавлять новые типы дел
- Контроль: Все визарды структурированы и предсказуемы
- Тестируемость: Шаблоны легко тестировать
План реализации:
Этап 1: Классификация (ИИ)
# Упрощённый промпт для ИИ
"""
Проанализируй описание проблемы и определи:
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: Шаблоны (Бэкенд)
# 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. Предзагрузка шаблонов
- Загружать шаблоны в память при старте
- Не обращаться к БД/файлам каждый раз
🚀 Следующие шаги
- Создать шаблоны для основных типов дел (5-7 типов)
- Упростить промпт для классификации
- Реализовать WizardBuilder в бэкенде
- Обновить n8n workflow
- Протестировать на реальных случаях
- Измерить скорость и сравнить с текущей
Ожидаемый результат: 5-10 секунд вместо 30-40 секунд