Узнайте, как за 8 месяцев я построил гибридный AI-пайплайн для анализа экзаменов. От прототипа на Streamlit до продакшна на Django и Gemini. Практические советы для разработчиков.
Восемь месяцев назад я сдавал экзамен по CS и должен был писать псевдокод, хотя уже умел программировать. Вместо зубрежки я в ярости создал приложение. Сегодня examintelligence.app жив. В этой статье я расскажу, как прошёл путь от «виб-кода» до продакшен-гибридного AI-пайплайна — без глянцевого стартап-глянца. Вы узнаете, какие архитектурные решения работают, а какие ведут в тупик, и как построить реальный продукт с нуля.
Я всегда считал, что учёба ради оценок ≠ настоящее обучение. Когда я впервые столкнулся с органической химией, я её возненавидел. Но потом я наткнулся на графовые нейронные сети (GNN) в книге Machine Learning with PyTorch and Scikit-Learn в связке с датасетом MoleculeNet. Всё встало на места. Проблема в том, что экзамены оптимизируют распознавание шаблонов, а не любопытство. Они rm -rf веселье от обучения. За неделю до первых промежуточных экзаменов я решил построить экзаменационный интеллект. План был прост: внедрить брутальную эффективность с помощью AI для того, для чего он создан — распознавания шаблонов. Парсить все прошлые работы, схемы оценивания и отчёты экзаменаторов. Дистиллировать только то, что действительно важно. Освободить время для кодинга и творческой работы.
Я против виб-кодинга: это ненадёжно, трудно поддерживать и опасно для безопасности. Но перед лицом экзаменов у меня не было выбора. Я открыл Claude и виб-кодил модуль за модулем. Единственный code review, на который у меня было время, — проверка подозрительных вызовов os.system или subprocess. Я запустил как есть.
Начальный стек: Gemini API (без фреймворков агентов, без LangGraph), Streamlit фронтенд, PostgreSQL. Это подтвердило идею, но функционально едва держалось. После экзаменов я наконец посмотрел, что AI построил: дашборд со случайными статистиками, запрос к Gemini на JSON с 5 ключами — сохранено только 2, случайное создание таблиц БД при попытке читать предметы. Типичный код, когда AI готовит без присмотра неделю. Я сделал единственное разумное: открыл Neovim и перестроил с нуля.
Смена стека: Streamlit → Django. Сырые API-вызовы → правильный LangGraph workflow с авто-повторами. Спагетти → код, который можно осмыслить. Моё мнение: позволять кодинговому агенту писать вашу основную архитектуру — рецепт неподдерживаемого кода. Чтобы построить что-то реальное, фундамент должен быть реальным.
Теперь я пишу базовую архитектуру сам. Не сбрасывая решения в .md файл, а пиша реальный код в Neovim с минимальной опорой на AI, полагаясь на документацию и классическую отладку (и, конечно, StackOverflow). Затем я передаю агенту реальную отправную точку.
Пример workflow: я строю страницу логина. Агент берёт её, превращает в регистрацию. Модифицирует точечно — вместо генерации мусора с нуля. Консистентные паттерны, обозримые диффы, код, который я могу осмыслить.
Агенты, которые я использую: Claude web для точных правок, OpenCode для облачных моделей, Pi coding agents для локальных моделей. И да, я потратил $0 на агентов. Не прыгая по бесплатным тарифам, а делая каждую правку целенаправленной и осмысленной. Потраченные токены = доставленная ценность. Это не замедлило меня. 8 месяцев были потрачены не на стратегию агентов, а на эксперименты: тонкая настройка, гибридные ML/LLM системы, обеспечение качества на уровне, который я хотел бы видеть в продакшне. Стратегия агентов просто поддерживала код в чистоте для этих экспериментов.
Когда базовое приложение стабилизировалось, я углубился в AI-ядро. Я попробовал перенести пайплайн обработки с Gemini 2.5 Flash на локальные веса Llama. Потратил неделю на бенчмаркинг Python-парсеров PDF в текст (PyMuPDF, pdfplumber). Результаты были отличны для чистого текста, но одна сложная структурная диаграмма ломала всё. Переключился на маленькие мультимодальные модели (Llama-3.2-3B-Instruct). Использовал скользящее окно контекста: передача изображений страниц вместе с кумулятивным JSON-состоянием с предыдущих страниц. Оказалось, что думать как GIL было ошибкой.
Я сжёг GPU-бюджет на Lightning AI на инференс и циклы тонкой настройки с Unsloth. Это заняло гораздо больше времени, чем облачные эндпоинты. Результат — чистый «мусор на входе, мусор на выходе»: пайплайн данных случайно обучился на нефильтрованных, сломанных выходах v1. Вернулся к Gemini. Но чрезмерная инженерия UI-движка (JS динамически рендерит сложные JSON-схемы) сломала JSON-выходы модели. Перед вторыми промежуточными экзаменами пришлось сделать git restore и сбросить.
После вторых экзаменов я сделал полную перестройку с нуля. Тот же стек, но с мыслью о продакшне. Исправил брендинг, цветовую тему, типографику, UX-потоки и упростил требования к схеме для UI заметок. Когда фронтенд был готов, я вернулся к AI-ядру.
Спекулятивное декодирование: Связал Qwen 3.5 0.8B и 2B модели. Обе давали качественные ответы независимо, но связывание полностью сломало выходы (вероятно, баг в логике сэмплирования). Отбросил из-за временных ограничений и риска для продакшна.
Авто-исследование: Поручил OpenCode запустить sweep промптов с локальными Gemma 4 и Qwen 3.5 для разбивки PDF в нужную структурированную разметку. Небольшой тюнинг промптов приблизил выходы к качеству Gemini и требуемому формату, но время обработки (текстовый промпт + изображения всех страниц → JSON) было неприемлемо медленным для продакшна.
Финальное решение: Гибридная архитектура. Gemini 3.1 Flash-Lite для тяжёлых мультимодальных шагов (парсинг PDF), Qwen 3.6 35B для маршрутизации и текстовых шагов. Обеспечивает продакшн-качество на скоростях, за которые я могу поручиться. Приложение официально запущено 5 июня.
Если вы разработчик, который хочет построить AI-продукт: начните с прототипа на чём угодно (Streamlit, Gradio), но будьте готовы выбросить его. Пишите базовую архитектуру сами — не доверяйте агентам. Используйте агентов только для точечных правок. Экспериментируйте с разными моделями, но для продакшна выбирайте гибрид: мультимодальная модель для ввода, лёгкая текстовая для обработки. И главное — не бойтесь переписывать с нуля, если код стал неуправляемым.
Если вы студент IGCSE, которому нужен инструмент, уважающий ваше время и оценки, откройте список ожидания на examintelligence.app (ранний доступ для первых 500 подписчиков). Подписывайтесь, чтобы увидеть, как проект развивается дальше.
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →