UpPetto

This is a real course generated by UpPetto — unedited.

AI-generated · source-grounded review: written by two AI models, cross-checked by a third. Yours takes ~5 minutes.

Create my own course

Финальный проект: создание рабочего решения

Pareto core

Создание комплексного рабочего решения

Финальный проект объединяет все изученные техники в production-ready систему. Рассмотрим полный цикл разработки — от анализа задачи до развёртывания и мониторинга.

Этап 1: Проектирование решения

Перед написанием кода определите архитектуру системы:

Чек-лист проектирования:

## Анализ задачи
- [ ] Чёткое определение входных данных и ожидаемого результата
- [ ] Идентификация edge cases и граничных условий
- [ ] Определение метрик успеха (accuracy, latency, cost)
- [ ] Оценка объёма обработки (запросов в день/час)

## Архитектурные решения
- [ ] Выбор модели (баланс качество/стоимость/скорость)
- [ ] Определение структуры промптов (системный + пользовательский)
- [ ] Проектирование пайплайна обработки
- [ ] Стратегия обработки ошибок и fallback'ов

## Интеграция
- [ ] API endpoints и форматы данных
- [ ] Хранение результатов (БД, кэш)
- [ ] Логирование и мониторинг
- [ ] Безопасность (rate limiting, валидация входных данных)

Пример: Система автоматической обработки заявок

Разработаем полное решение для обработки входящих заявок с извлечением данных, категоризацией и маршрутизацией:

# config.py - Конфигурация системы
class Config:
    # Параметры модели
    TEMPERATURE_EXTRACTION = 0.1  # Для извлечения данных
    TEMPERATURE_GENERATION = 0.4  # Для генерации ответов
    MAX_RETRIES = 3
    TIMEOUT = 30

    # Пороги качества
    CONFIDENCE_THRESHOLD = 0.7
    AUTO_APPROVE_THRESHOLD = 0.85

    # Бизнес-правила
    PRIORITY_RULES = {
        'enterprise': 'high',
        'urgent_keywords': ['срочно', 'критично', 'немедленно']
    }

# prompts.py - Библиотека промптов
class PromptLibrary:

    SYSTEM_EXTRACTION = """
Ты — система обработки заявок. Извлекай структурированные данные.

СХЕМА ВЫВОДА:
{
  "request_type": "technical_support" | "sales" | "general_inquiry" | "complaint",
  "contact": {
    "name": "string",
    "company": "string или null",
    "email": "string",
    "phone": "string или null"
  },
  "details": {
    "subject": "краткая суть (max 100 chars)",
    "description": "детальное описание",
    "products": ["упомянутые продукты"],
    "urgency": "low" | "medium" | "high"
  },
  "extracted_requirements": ["requirement 1", "requirement 2"],
  "sentiment": "positive" | "neutral" | "negative",
  "confidence": 0.0-1.0
}

ПРАВИЛА URGENCY:
- high: содержит urgent_keywords или complaint с negative sentiment
- medium: sales запрос или technical_support
- low: general_inquiry

Возвращай ТОЛЬКО валидный JSON.
"""

    SYSTEM_RESPONSE_GENERATION = """
Ты — ассистент службы поддержки. Генерируй профессиональные ответы на заявки.

TONE: вежливый, профессиональный, helpful
СТРУКТУРА:
1. Приветствие с обращением по имени
2. Подтверждение понимания запроса
3. Конкретные следующие шаги
4. Контактная информация и timeline

ПРАВИЛА:
- Не обещай того, что не можешь гарантировать
- Для технических вопросов — предложи эскалацию к специалисту
- Для sales — укажи, что менеджер свяжется в течение рабочего дня
- Для complaints — выражай сожаление и предлагай конкретное решение
"""

# request_processor.py - Основная логика
class RequestProcessor:

    def __init__(self, config, llm_client):
        self.config = config
        self.llm = llm_client
        self.prompts = PromptLibrary()

    def process_request(self, raw_request):
        """Полный цикл обработки заявки"""

        # Шаг 1: Извлечение структурированных данных
        extraction_result = self._extract_data(raw_request)

        if not extraction_result['success']:
            return self._handle_extraction_failure(raw_request)

        request_data = extraction_result['data']

        # Шаг 2: Валидация и обогащение данных
        validated_data = self._validate_and_enrich(request_data)

        # Шаг 3: Определение приоритета и маршрутизация
        routing = self._determine_routing(validated_data)

        # Шаг 4: Генерация ответа
        if routing['auto_respond']:
            response = self._generate_response(validated_data)
        else:
            response = None  # Требуется ручная обработка

        # Шаг 5: Сохранение и уведомления
        result = self._save_and_notify(validated_data, routing, response)

        return result

    def _extract_data(self, raw_text):
        """Извлечение данных с retry логикой"""

        for attempt in range(self.config.MAX_RETRIES):
            try:
                response = self.llm.generate(
                    system=self.prompts.SYSTEM_EXTRACTION,
                    user=f"Заявка:\n\n{raw_text}",
                    temperature=self.config.TEMPERATURE_EXTRACTION,
                    timeout=self.config.TIMEOUT
                )

                # Парсинг и валидация
                data = self._parse_json_response(response)
                self._validate_schema(data)

                return {'success': True, 'data': data, 'attempts': attempt + 1}

            except Exception as e:
                if attempt == self.config.MAX_RETRIES - 1:
                    self._log_error('extraction_failed', raw_text, str(e))
                    return {'success': False, 'error': str(e)}

                time.sleep(2 ** attempt)  # Exponential backoff

    def _determine_routing(self, data):
        """Определение маршрутизации и необходимости ручной обработки"""

        # Автоматический ответ только для простых случаев
        auto_respond = (
            data['confidence'] >= self.config.AUTO_APPROVE_THRESHOLD and
            data['request_type'] in ['general_inquiry', 'sales'] and
            data['sentiment'] != 'negative' and
            data['details']['urgency'] != 'high'
        )

        # Определение ответственного
        if data['request_type'] == 'technical_support':
            team = 'support'
        elif data['request_type'] == 'sales':
            team = 'sales'
        elif data['request_type'] == 'complaint':
            team = 'customer_success'
        else:
            team = 'general'

        return {
            'auto_respond': auto_respond,
            'assigned_team': team,
            'priority': data['details']['urgency'],
            'requires_review': not auto_respond
        }

Этап 2: Тестирование и оптимизация

Создайте comprehensive test suite:

# tests.py
class TestRequestProcessor:

    def test_extraction_accuracy(self):
        """Тест точности извлечения данных"""

        test_cases = [
            {
                'input': "Здравствуйте, меня зовут Иван Петров...",
                'expected': {
                    'contact.name': 'Иван Петров',
                    'request_type': 'technical_support'
                }
            }
        ]

        for case in test_cases:
            result = processor.process_request(case['input'])
            assert result['data']['contact']['name'] == case['expected']['contact.name']

    def test_edge_cases(self):
        """Тест граничных случаев"""

        edge_cases = [
            "",  # Пустой запрос
            "a" * 10000,  # Очень длинный текст
            "🚀💡🔥",  # Только эмодзи
        ]

        for case in edge_cases:
            result = processor.process_request(case)
            assert result['status'] in ['processed', 'error']

Этап 3: Мониторинг и документирование

Ключевые метрики: - Auto-response rate (целевое значение: >60%) - Average confidence (целевое значение: >0.8) - Error rate (целевое значение: <5%) - Processing time (целевое значение: <2s)

Алерты: - Error rate > 10% → уведомление команды - Confidence < 0.5 в значительной части запросов → ревью промптов - Processing time > 5s → проверка инфраструктуры

Ключевые принципы финального проекта

1. Начинайте с минимального MVP: - Один use case - Базовая функциональность - Ручная проверка всех результатов

2. Итеративно расширяйте: - Добавляйте автоматизацию постепенно - Собирайте метрики на каждом этапе - Оптимизируйте на основе реальных данных

3. Документируйте всё: - Архитектурные решения и их обоснование - Конфигурацию и параметры - Известные ограничения и edge cases

4. Мониторьте в production: - Логируйте все запросы и ответы - Отслеживайте ключевые метрики - Настройте алерты на аномалии

5. Планируйте поддержку: - Версионирование промптов - A/B тестирование изменений - Регулярный ревью качества

Успешное решение — это не идеальный промпт, а система, которая надёжно работает, легко поддерживается и постоянно улучшается на основе реальных данных.

AI-generated · source-grounded review

🛡 Fact-checked: 1 risky claim verified · 2 removed · confidence: high
[verified] Проектирование → разработка → тестирование → документирование — правильная последовательность
Соответствует инженерному циклу из knowledge base
[softened] Конкретное число '24 часа' для ответа менеджера
Заменено на 'в течение рабочего дня' — конкретный таймфрейм не верифицирован
[removed] Removed specific claim '24 часов' as arbitrary timeframe not in knowledge base, replaced with 'в течение рабочего дня'
[removed] Removed specific numeric threshold '100000' as arbitrary value not verified

A second opinion has not checked this lesson.

Key concepts: Финальный проект Интеграция техник Практическое применение Комплексное решение
Tell me more 🔒 Didn't understand — explain simply 🔒 Show examples 🔒 Sources 🔒

On your own course these buttons answer instantly, quizzes track what you've mastered, and lessons adapt to your gaps. Sign up free →

Check yourself

1. Какой должна быть последовательность этапов при создании production-ready решения на LLM?
2. Что является признаком качественного финального проекта?
3. Зачем нужны разные значения temperature для разных этапов обработки (например, 0.1 для извлечения данных и 0.4 для генерации ответов)?
Sign up free to check your answers