Live Nov 18 · Cohort 3Nov 18, 19:00 MSK — free hands-on AI agents live workshop · Live Cohort 3 starts Nov 23Join Nov 18 Live →Cohort 3 (Nov 23)
ReleaseInsight · On RadarHabr AI→ original

A beginner built a Go interview bot: voice answers, 860 questions and 25–35 MB of memory

While learning Go, the author hit a wall: he understood the topics but couldn't explain them clearly out loud. He built a Telegram bot that accepts voice answers, transcribes them with Deepgram and checks them against reference criteria instead of simply offering praise. Questions he struggles with go back into a Redis queue. The stack is lightweight: the bot uses 25–35 MB of memory and runs on a VPS costing 200 rubles.

AI-processed from Habr AI; edited by Hamidun News
A beginner built a Go interview bot: voice answers, 860 questions and 25–35 MB of memory
Source: Habr AI. Collage: Hamidun News.
Listen to article
Article Fact Sheet & Key Figures
ParameterDetails
Primary sourceHabr AI ↗
Editor-in-Chief
Key metric #1Whisper on a VPS without a GPU pushed CPU usage to 100%; Deepgram finished in under a second
Key metric #2A key_points checklist in the prompt curbs the model's tendency to agree
Key metric #3The double-click bug on buttons is fixed by calling EditReplyMarkup immediately

It's a familiar situation: you've read a dozen articles about the Go runtime, your head is a jumble of slices, the GMP scheduler and escape analysis, and then you stumble over your words in an interview. The author of this project works at an auto repair shop by day and studies backend development at night. He tackled the problem with code: a Telegram bot that asks technical questions, listens to voice answers and grades them without going easy on him.

Why voice, and why not Whisper

The premise is that interviews don't call for essays: you have to speak. So the bot specifically accepts voice messages. The first attempt, using a local Whisper deployment, failed: on a cheap VPS without a GPU, every audio message drove CPU usage to 100%.

The author switched to the cloud-based Deepgram service and its Nova-2 model. A Telegram voice message in OGG/Opus format is processed in under a second. Russian tech slang such as “goroutines,” “mutex” and “generics” doesn't turn into gibberish, which is critical for a bot like this. The practical takeaway is straightforward: if you don't have a GPU and the project is small, self-hosting speech recognition often costs more than a ready-made API once you factor in time and frustration.

How to stop the model from agreeing with everything

The biggest problem with LLM graders is flattery. Ask “What do you think of my answer?” and you'll almost certainly get “Well done, excellent!” even if the answer was weak. The author assembled a bank of 860 questions across 85 topics and added reference criteria, key_points, to each one. The prompt makes DeepSeek, accessed through the Groq Cloud API, work through the checklist: check every criterion, assign a score from 1 to 10, list omissions and give a short, tough critique without compliments.

Here's an example from the project. A candidate says: “A slice doubles in size when it runs out of capacity.” But they haven't mentioned the threshold of 256 elements or the new formula introduced in Go 1.18+. Without a checklist, the model could easily accept that answer. With one, it identifies exactly what was missing.

The technique applies broadly. Don't ask the model to “evaluate”; give it a rubric with mandatory points. The same approach works for automatically checking code reviews, support responses or take-home assignments.

Spaced repetition, mock interviews and pitfalls

Rote-learning questions in sequence is pointless, so the author added spaced repetition. Redis holds a session queue for each user. An answer scoring 8–10 sends the question to the back of the queue. If the score is below 6, the question returns after just a couple of steps. All attempts are recorded in PostgreSQL and used to generate statistics. There's also an interview simulation mode: choose a level from intern to senior, answer 10 questions with follow-ups along the way, and receive a final Hire or No Hire verdict with an analysis of your mistakes.

The pitfalls were familiar ones for any Telegram bot:

  • HTML markup. If the model returns code without backticks or drops a closing tag, Telegram rejects the message. The author wrote a sanitizer that detects Go code using keywords and syntax (package, func, :=), then wraps it in pre/code tags with escaping.
  • Double clicks. Rapidly pressing an inline button produces two callbacks in succession, which caused a race condition in Redis with two parallel sessions. The fix is to disable the buttons through EditReplyMarkup before making any heavy database requests.
  • Deployment security. Containers run as a dedicated appuser rather than root. The docker-compose.prod.yml file enables read_only: true and cap_drop: ALL, with system directories mounted as tmpfs.

What you can take from this project

The stack consists of Go 1.23, telebot.v3, PostgreSQL 16 accessed through pgx/v5, Redis 7 and Docker Compose, organized according to Clean Architecture. According to the author, the bot uses 25–35 MB of memory in production, starts in a fraction of a second and runs on a server costing 200 rubles a month. For a lightweight service that mostly calls external APIs, that's a good argument for Go.

There are limitations, too. This is a beginner's personal project, and the author himself asks experienced developers to review the code and architecture. There is no data on how closely the model's scores match those of a human interviewer. Nor are there quality metrics for transcription or feedback, so its “strictness” can only be judged from the prompt description.

Still, the write-up is useful as a collection of practical solutions. For voice, use cloud speech recognition if you don't have a GPU. For honest LLM grading, provide a checklist instead of asking for an opinion. For a Telegram bot, guard against double taps and broken HTML markup from the outset. The source code is open: github.com/powood/Tg_GO_Mentor, and the bot is available as @go_SikkiMentor_bot.

Story

Key Questions Answered

Why voice, and why not Whisper?

The premise is that interviews don't call for essays: you have to speak. So the bot specifically accepts voice messages. The first attempt, using a local Whisper deployment, failed: on a cheap VPS without a GPU, every audio message drove CPU usage to 100%. The author switched to the cloud-based Deepgram service and its Nova-2 model. A Telegram voice message in OGG/Opus format is processed in under a second.

How to stop the model from agreeing with everything?

The biggest problem with LLM graders is flattery. Ask “What do you think of my answer?” and you'll almost certainly get “Well done, excellent!” even if the answer was weak. The author assembled a bank of 860 questions across 85 topics and added reference criteria, key_points, to each one. The prompt makes DeepSeek, accessed through the Groq Cloud API, work through the checklist: check every criterion, assign a score from 1 to 10, list omissions and give a short, tough critique without compliments.

What are the key details on Spaced repetition, mock interviews and pitfalls?

Rote-learning questions in sequence is pointless, so the author added spaced repetition. Redis holds a session queue for each user. An answer scoring 8–10 sends the question to the back of the queue. If the score is below 6, the question returns after just a couple of steps. All attempts are recorded in PostgreSQL and used to generate statistics.

ZK
Zhemal Khamidun — CPO at Alpina Digital, product manager of AlpinaGPT. Building AI products since 2019. Hamidun News is a pet project that grew into a production aggregator with 6,000+ readers.
✦ Unified AI Workspace · Nomad

Test Frontier LLMs & Autonomous Agents in One Workspace

Run Claude Opus 5.5, GPT-6, Gemini 3.1, and DeepSeek side-by-side in Nomad AI (nomadnet.ai) — unified model routing, deep research, and multimodal workflows under one subscription.

Try Nomad AI →Launch Nomad Agent
What do you think?
Loading comments…