← Writing index

Field note / AI · Go · Side Project

Why I Built Numpao Bot for Our Telegram Group

A personal experiment in building a Khmer-friendly Telegram AI bot, tuning its personality, adding web search, and learning Go along the way.

Most of my side projects begin with a serious problem. Numpao Bot did not.

It started because a few friends and I already spent too much time talking in a Telegram group. We joked around, shared random links, asked questions, and moved between Khmer and English without thinking about it. I thought it would be fun to put an AI in the middle of that conversation and see what happened.

That was the whole product brief: make the group chat more fun.

No startup pitch. No user-growth plan. No complicated roadmap. Just a bot for a small group of people who already knew each other.

Making a bot is the easy part

Connecting Telegram to an AI model is not especially difficult. A message comes in, the bot sends it to a model, and a response comes back.

The first version worked, technically. It could answer questions. But it did not feel like it belonged in the group.

It answered too often. It wrote too much. Sometimes a simple joke received a response that looked like a school essay. Other times, it joined a conversation where nobody had asked for it. The answers could be correct and still feel wrong.

That became the interesting part of the project.

I was no longer only learning how to call an AI API. I was learning how to define an AI:

  • When should it speak?
  • How long should an answer be?
  • How much conversation history should it remember?
  • When is a sharp joke funny, and when is it annoying?
  • How do you make it useful without letting it take over the chat?

These questions sound small, but they completely change the experience.

Why I chose Gemini

Our group mostly writes in Khmer, often mixed with English and internet slang. In my own testing, Gemini handled that combination well enough to become the base model for Numpao Bot.

I am not claiming that it is objectively the best Khmer model. I did not run a formal benchmark. I chose it because, in our actual conversations, it usually understood what we meant and replied in a way we could work with. For this project, that mattered more than a leaderboard.

Khmer support is only the starting point, though. Understanding the language does not automatically mean understanding the group.

Cambodian conversations have their own rhythm. Friends switch languages, shorten words, tease each other, and rely on context that would look confusing outside the chat. I wanted Numpao Bot to feel closer to that rhythm—not like a customer-support assistant that had accidentally joined Telegram.

So I kept adjusting its system prompt and configuration. I added different response modes, reduced the default verbosity, and experimented with how proactive it should be. Some settings make it more direct. Others allow more playful replies. The group can decide whether it should stay quiet, answer normally, or become a little more aggressive with the jokes.

There is still no perfect configuration. That is part of the fun.

Teaching it when to stop talking

One of the first things I learned was that more output does not mean more intelligence.

In a group chat, a five-paragraph answer can be worse than a useful sentence. People are not opening Telegram to read documentation every time they mention a topic. The bot has to respect the pace of the conversation.

I added controls for how much it can “yap.” It can answer normally, keep things short, or reduce a response to only a few words. I also added a sharper mode that limits replies to one or two sentences.

These controls began as jokes, but they taught me something practical about AI products: model quality is only one part of the result. The surrounding decisions—prompting, context, limits, defaults, and interface—shape whether the model is pleasant to use.

A powerful model with the wrong behavior is still a bad product.

Giving it access to the web

The early bot could only work with the model’s existing knowledge and whatever appeared in the group history. That was fine for casual conversation, but not for current information.

Later, I integrated the Brave Search API. Numpao Bot can search the web, read result snippets, and use them as context when answering. It can do this through a direct search command or as a tool when it recognizes that a question needs current information.

This made the bot feel much more capable. We could ask about something recent without immediately leaving Telegram to search for it ourselves.

It does not make every answer true. Search results can be poor, sources can disagree, and an AI can still misunderstand what it reads. The bot should show its sources, and important information still needs to be checked. But web access gives it a better starting point than pretending its stored knowledge is always current.

I want to keep expanding this side of the project: better source selection, more useful page reading, and stronger handling of Khmer-language searches. Each improvement creates another small problem to study.

Why Go?

I also used Numpao Bot as an excuse to spend more time with Go.

A Telegram bot spends much of its life waiting—waiting for messages, waiting for the model, waiting for search results, and occasionally running several pieces of network work at once. That workload fits Go naturally.

Goroutines made it straightforward to run independent tool calls concurrently, while the main bot remained easy to follow. The core service compiles into a simple executable and is uncomplicated to operate. I wanted to experience those qualities in a real, continuously running project instead of another small tutorial.

I did not choose Go because I had proof that it would outperform every alternative. I chose it because I wanted to learn how its performance and concurrency model felt in practice. A side project is a good place to test that kind of curiosity.

The result has been encouraging. The bot stays conceptually small even as I add more behavior around it.

A project without a finish line

Numpao Bot is still a project for friends. That keeps the feedback honest.

If it becomes too wordy, someone complains. If a joke is bad, the bot hears about it immediately. If a new feature is useful, it becomes part of the conversation without anyone needing an onboarding guide.

That environment gives me room to experiment with questions I care about:

  • How should an AI participate in a shared social space?
  • How much personality is useful?
  • What should it remember, and what should it forget?
  • How can it feel local without turning Cambodian culture into a stereotype?
  • Which tools make it genuinely smarter rather than simply more complicated?

I will keep improving it over time—better search, smarter tool use, tighter responses, and probably ideas that have not appeared yet. Some experiments will work. Others will be removed after my friends tell me they are annoying.

That is the purpose of Numpao Bot. It is a useful excuse to learn Go, AI configuration, tool integration, and conversational design. But more importantly, it is something fun that lives in a real group chat with people I know.

Not every project needs to become a company. Sometimes it can simply make your friends laugh while teaching you how intelligent systems actually behave.

The source code is available on GitHub.