Files
aiform_dev/docs/WIZARD_OPTIMIZATION_ANALYSIS.md
AI Assistant 4c8fda5f55 Добавлено логирование для отладки черновиков
- Добавлены логи в frontend (ClaimForm.tsx) для отслеживания unified_id и запросов к API
- Добавлены логи в backend (claims.py) для отладки SQL запросов
- Создан лог сессии с описанием проблемы и текущего состояния
- Проблема: API возвращает 0 черновиков, хотя в БД есть данные
2025-11-19 18:46:48 +03:00

12 KiB
Raw Blame History

Анализ оптимизации генерации визарда

Дата: 2025-01-XX
Текущее время генерации: ~30-40 секунд
Цель: Сократить до 5-15 секунд


🎯 Вариант 1: Двухэтапный подход (твоя идея)

Концепция:

  1. ИИ только классифицирует случай и выдаёт список нужных документов/полей
  2. Бэкенд строит визард по шаблонам на основе классификации

Архитектура:

Описание → ИИ (классификация) → Бэкенд (шаблоны) → Визард

ИИ возвращает:

{
  "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 сек всего
Предсказуемость: Визарды всегда структурированы одинаково
Контроль: Легко менять вопросы/документы без изменения промпта
Кеширование: Можно кешировать шаблоны в памяти
Тестирование: Легко тестировать шаблоны отдельно от ИИ

Минусы:

Гибкость: Сложные/уникальные случаи могут не попасть в шаблоны
Разработка: Нужно создать и поддерживать библиотеку шаблонов
Классификация: ИИ должен точно определить тип дела

Реализация:

  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: Классификация (ИИ)

# Упрощённый промпт для ИИ
"""
Проанализируй описание проблемы и определи:
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. Предзагрузка шаблонов

  • Загружать шаблоны в память при старте
  • Не обращаться к БД/файлам каждый раз

🚀 Следующие шаги

  1. Создать шаблоны для основных типов дел (5-7 типов)
  2. Упростить промпт для классификации
  3. Реализовать WizardBuilder в бэкенде
  4. Обновить n8n workflow
  5. Протестировать на реальных случаях
  6. Измерить скорость и сравнить с текущей

Ожидаемый результат: 5-10 секунд вместо 30-40 секунд