Эфир 18.11 · Поток 318 ноября в 19:00 МСК — бесплатный практический эфир по ИИ-агентам · Живой Поток 3 стартует 23.11Эфир 18 ноября →Поток 3 (23.11)
РелизРазбор · На радарHabr AI→ оригинал

Новичок написал Go-бота для собеседований: голос, 860 вопросов и 25–35 МБ памяти

Автор учил Go и упёрся в то, что знает темы, но не может внятно рассказать их вслух. Он собрал Telegram-бота: тот принимает голосовые ответы, распознаёт их через Deepgram и сверяет с эталонными критериями, а не просто хвалит. Слабые вопросы возвращаются в очередь на Redis. Стек лёгкий: бот занимает 25–35 МБ памяти и живёт на VPS за 200 рублей.

AI-обработка оригинала Habr AI; редакция Hamidun News
Новичок написал Go-бота для собеседований: голос, 860 вопросов и 25–35 МБ памяти
Источник: Habr AI. Коллаж: Hamidun News.
Слушать статью
Паспорт материала и цифры
ПараметрДанные
ПервоисточникHabr AI ↗
Главный редактор
Ключевой факт #1Whisper на VPS без GPU грузил CPU на 100%, Deepgram справился быстрее секунды
Ключевой факт #2Чек-лист key_points в промпте лечит поддакивание модели
Ключевой факт #3Баг с двойным кликом по кнопкам решается мгновенным EditReplyMarkup

Знакомая ситуация: прочитал десяток статей про рантайм Go, в голове каша из слайсов, планировщика GMP и escape analysis, а на собеседовании язык заплетается. Автор этого проекта днём работает в автосервисе, а ночами учит бэкенд. Проблему он решил кодом: написал Telegram-бота, который задаёт технические вопросы, слушает голосовые ответы и оценивает их без скидок.

Почему голос и почему не Whisper

Идея проекта в том, что на собеседовании эссе никто не просит, там нужно говорить. Поэтому бот принимает именно войсы. Первая попытка с локальным Whisper провалилась: на дешёвом VPS без видеокарты каждое аудиосообщение укладывало процессор на 100%.

Автор перешёл на облачный Deepgram с моделью Nova-2. Голосовое из Telegram в формате OGG/Opus обрабатывается меньше чем за секунду. Русский айтишный сленг вроде «горутины», «мьютекс» или «дженерики» не превращается в кашу, а это для такого бота критично. Практический вывод простой: если у вас нет GPU, а проект небольшой, самохостинг распознавания речи часто обходится дороже готового API, если считать время и нервы.

Как заставить модель не поддакивать

Главная беда LLM-оценщиков в лести. Спросите «как тебе мой ответ?», и почти наверняка получите «молодец, отлично!», даже если ответ был слабым. Автор собрал базу из 860 вопросов по 85 темам и к каждому добавил эталонные критерии, key_points. Промпт заставляет DeepSeek (он работает через Groq Cloud API) пройти по списку: проверить каждый критерий, поставить оценку от 1 до 10, перечислить упущенное и дать короткий жёсткий разбор без комплиментов.

Пример из проекта. Кандидат говорит: «слайс при переполнении удваивается». Но он не упомянул порог в 256 элементов и новую формулу из Go 1.18+. Без чек-листа модель легко засчитала бы такой ответ. С чек-листом она указывает, чего именно не хватило.

Приём универсальный. Не просите модель «оценить», дайте ей рубрику с обязательными пунктами. То же работает для автопроверки код-ревью, ответов поддержки или тестовых заданий.

Повторение, мок-собес и грабли

Зубрить вопросы подряд бесполезно, поэтому автор добавил интервальное повторение. Для каждого пользователя в Redis собирается очередь на сессию. Ответ на 8–10 баллов отправляет вопрос в конец очереди. Если баллов меньше 6, вопрос вернётся уже через пару шагов. Все попытки пишутся в PostgreSQL, из них строится статистика. Есть и режим симуляции собеседования: выбираешь грейд от стажёра до сеньора, получаешь 10 вопросов с уточнениями по ходу и итоговый вердикт Hire или No Hire с разбором ошибок.

Грабли оказались типичными для любого Telegram-бота:

  • HTML-разметка. Если модель вернула код без бэктиков или потеряла закрывающий тег, Telegram отклоняет сообщение. Автор написал санитайзер: он находит Go-код по ключевым словам (package, func, :=) и сам оборачивает его в pre/code с экранированием.
  • Двойные клики. Быстрое нажатие на инлайн-кнопку даёт два колбэка подряд, и в Redis возникала гонка с двумя параллельными сессиями. Лечится тем, что кнопки гасятся через EditReplyMarkup ещё до тяжёлых запросов в базу.
  • Безопасность деплоя. Контейнеры запускаются не от root, а от отдельного пользователя appuser. В docker-compose.prod.yml включены read_only: true и cap_drop: ALL, а системные папки вынесены в tmpfs.

Что здесь стоит забрать себе

Стек такой: Go 1.23, telebot.v3, PostgreSQL 16 через pgx/v5, Redis 7, Docker Compose, структура по Clean Architecture. По словам автора, в проде бот ест 25–35 МБ памяти, стартует за доли секунды и живёт на сервере за 200 рублей в месяц. Для лёгкого сервиса, который в основном ходит во внешние API, это хороший аргумент в пользу Go.

Есть и ограничения. Это личный проект новичка, и сам автор просит опытных разработчиков посмотреть код и архитектуру. Нет данных о том, насколько оценки модели совпадают с оценками живого интервьюера. Метрик качества распознавания и разбора тоже не приведено, так что о «строгости» можно судить только по описанию промпта.

Но как набор готовых решений текст полезен. Для голоса берите облачное распознавание, если нет GPU. Для честной оценки от LLM давайте ей чек-лист, а не просите мнение. Для Telegram-бота заранее защищайтесь от двойных нажатий и битой HTML-разметки. Исходники открыты: github.com/powood/Tg_GO_Mentor, а бот доступен как @go_SikkiMentor_bot.

Сюжет

Вопросы и ответы по материалу

Что известно по теме: почему голос и почему не Whisper?

Идея проекта в том, что на собеседовании эссе никто не просит, там нужно говорить. Поэтому бот принимает именно войсы. Первая попытка с локальным Whisper провалилась: на дешёвом VPS без видеокарты каждое аудиосообщение укладывало процессор на 100%. Автор перешёл на облачный Deepgram с моделью Nova-2. Голосовое из Telegram в формате OGG/Opus обрабатывается меньше чем за секунду. Русский айтишный сленг вроде «горутины», «мьютекс» или «дженерики» не превращается в кашу, а это для такого бота критично.

Что известно по теме: как заставить модель не поддакивать?

Главная беда LLM-оценщиков в лести. Спросите «как тебе мой ответ?», и почти наверняка получите «молодец, отлично!», даже если ответ был слабым. Автор собрал базу из 860 вопросов по 85 темам и к каждому добавил эталонные критерии, key_points. Промпт заставляет DeepSeek (он работает через Groq Cloud API) пройти по списку: проверить каждый критерий, поставить оценку от 1 до 10, перечислить упущенное и дать короткий жёсткий разбор без комплиментов. Пример из проекта.

Что известно по теме: повторение, мок-собес и грабли?

Зубрить вопросы подряд бесполезно, поэтому автор добавил интервальное повторение. Для каждого пользователя в Redis собирается очередь на сессию. Ответ на 8–10 баллов отправляет вопрос в конец очереди. Если баллов меньше 6, вопрос вернётся уже через пару шагов. Все попытки пишутся в PostgreSQL, из них строится статистика. Есть и режим симуляции собеседования: выбираешь грейд от стажёра до сеньора, получаешь 10 вопросов с уточнениями по ходу и итоговый вердикт Hire или No Hire с разбором ошибок.

ЖХ
Жемал Хамидун — CPO Alpina Digital, продакт-менеджер AlpinaGPT. Делает AI-продукты с 2019 года. Hamidun News — pet project, который вырос в production-агрегатор с 6000+ читателей.
✦ Единое AI-пространство · Nomad

Протестируйте новые LLM и мультимодальные модели в одном окне

Платформа Nomad AI (nomadnet.ai) даёт прямой доступ к Claude Opus 5.5, GPT-6, Gemini 3.1, DeepSeek и автономным агентам без VPN, зарубежных карт и зоопарка подписок.

Открыть Nomad AI →Автономный Nomad Agent
Что вы думаете?
Загружаем комментарии…