В айти я уже давно, и в какой-то момент проектов стало сильно больше, чем я могу вывезти. Отказаться даже от одного из них — не вариант, деньги нужны катастрофически. После того как рабочий день снова закончился к 2-3 ночи, я начал думать, как освободить себе хотя пару часов на поспать или пожить.
Сначала завел таск-трекер, потом вставал пораньше, но кардинально ничего не поменялось.
Тогда залез в статистику экранного времени и увидел, что сижу в телеграме по 5-6 часов в день. И это не только личные переписки с друзьями, еще и коллеги спрашивают одно и тоже: «Подскажи, а что это за схема?, «Где тот файл?», «А где лежат все отчёты?». Сообщения приходят постоянно, даже ночью. Да и я не против помочь, но одно и то же объяснять по 10 раз — реально устал.
Тогда решил собрать себе личного чат-бота в телеграм и поставить его на Gemma 3. Сделал так, чтобы он понимал команды, опечатки и нормально отвечал. Рассказываю, как настроил — и как он теперь экономит мне время и нервы.
В статье:
Про Gemma 3 и её возможности — что такое Gemma 3, почему подходит для локального чат-бота и с чем поможет.
Подготовлю сервер для Gemma 3 — настрою Ubuntu 24.04, чтобы модель работала без облаков.
Установлю и запущу Gemma 3 с Ollama.
Создам Python-приложение для работы с Gemma 3.
Настрою и подключу Telegram-бота — к Gemma 3 через Python.
Я написал эту статью специально для блога Minervasoft. Компания помогает среднему и крупному бизнесу эффективно внедрять GenAI: объединяет все корпоративные знания в одном источнике — системе управления знаниями Minerva Knowledge — и с помощью авторской методологии делает так, чтобы статьи всегда оставались актуальными, структурированными и понятными. Это снижает риск галлюцинаций и повышает корректность ответов ИИ-агента до 94%.
Про Gemma 3 и её плюшки

Gemma 3 от Google DeepMind вышла ещё в марте 2025-го. Я взял версию на 12 миллиардов параметров. Звучит громоздко, но на деле — очень даже удобная штука, запускается на ноуте. Достаточно мощная, чтобы разбираться в сложных запросах, и при этом не требует облака или мощного сервера.
Когда я искал, чем бы таким заменить себя на случай банальных (и почти любых других) вопросов, список требований получился короткий, но важный:
— чтобы работал локально и не сливал данные в облако,
— чтобы не тормозил,
— чтобы нормально понимал русский,
— и чтобы работал в Telegram через PythonГемма подходит под все эти пункты: по скорости почти как облачные модели, но без требований к космическим видеокартам — хватит 16 ГБ оперативки и нормального проца. Умеет всё подряд: отвечает, пишет код, анализирует тексты. И главное — понимает русский.
Как чат-бот на Gemma 3 поможет страдающему мне
Допустим, пишет мне коллега в телеграм: «Где искать инструкцию по работе с (чем угодно)?». Раньше бы пришлось отвлекаться, искать ссылки, подробно всё объяснять. А теперь — бот отвечает сам: «Вот здесь (ссылка) лежат все рабочие инструкции».
И это не какой-то тупой шаблон. Модель реально понимает, что от неё хотят, и адаптирует ответ под контекст. Главное — дать ей базу знаний и пару инструкций, дальше — она сама.
Ещё эта ИИ-модель может помочь с: автоматизацией FAQ (паролями, инструкциями, сбросами), анализом запросов, генерацией скриптов, настройкой стиля ответов — от серьёзного до «эй, дружище, щас порешаем».
Технические требования
Что нужно, чтобы запустить Gemma 3 12B:
сервер или комп с Ubuntu 24.04 (подойдёт и что-то похожее),
16 ГБ оперативки — комфортный минимум; с 8 ГБ тоже можно, но будет тормозить.
20–30 ГБ свободного места под саму модель и всё, что с ней связано,
желательно — видеокарта, но и на обычном процессоре всё будет работать,
Python 3.8+ — для самого бота и связки с Telegram.
ИИ-модель подоцдет и для небольшой команды, и для тех, кто просто хочет «пощупать ИИ» без бюджета на пару серверов.
Также предвещаю вопрос: зачем вообще возиться с локальной моделью, если вокруг полно облачных ИИ-сервисов? Всё просто — контроль и приватность.
Так в переписке вы сможете скинуть всё: пароли, настройки, логи. А с Gemma всё остаётся у вас. Модель работает локально, никакие запросы не улетают за периметр. А ещё у неё открытая лицензия — не надо оформлять подписки, платить за каждый запрос и бояться, что завтра сервис «прикроется по политическим причинам».
Подготовка сервера для Gemma 3
Прежде чем бот начнёт отвечать всем, кому не лень, нужно подготовить ему сервер. Для примера взял свой виртуальный с Ubuntu 24.04.
Первый шаг — привести систему в порядок
Подключаемся к серверу по SSH (или просто открываем терминал, если всё локально), и начинаем с базового:
sudo apt update && sudo apt upgrade -y
Эта строка обновит списки пакетов и установит последние версии программ.
Также понадобится:
curl — для загрузки файлов из сети.
git — пригодится для работы с репозиториями.
build-essential — для компиляции, если потребуется.
python3 и python3-pip — для нашего Python-приложения и Telegram-бота.
Net-tools - чтобы иметь инструменты для анализа сетевых подключений
Docker - чтобы установить Ollama
Виртуальное окружение Python - чтобы запускать код в sandbox.
Проверка ресурсов сервера
Проверяю доступную оперативную память: free -h
Для нормальной жизни Gemma 3 нужно 16 ГБ оперативки. Но если у вас всего 8 — не беда, модель всё равно заведётся. Правда, с нюансами: может притормаживать или слетать при нагрузке.
Чтобы такого не случилось, создадим swap-файл — это как временная память на диске, когда основной не хватает. Добавим 4 ГБ:
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

Чтобы swap-файл работал после перезагрузки, добавляю его в /etc/fstab:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Теперь проверяю процессор:
lscpu
Gemma не требует топового CPU, но многоядерный процессор (4 ядра и выше) ускорит работу. Если сервер скромный, модель всё равно будет работать, хоть и медленнее. Создаю директорию для проекта и виртуальное окружение:
mkdir ~/gemma-bot
cd ~/gemma-bot
python3 -m venv venv
source venv/bin/activate

Устанавливаю и запускаю Gemma 3 с Ollama
Теперь немного про Ollama — без него Гемма просто не заработает. Это open-source помощник, который берёт на себя всё: скачивает модель, запускает её и выдаёт удобный API, через который мы потом будем общаться с ботом.
Если упрощать, Ollama — это мост между Gemma 3 и нашим Python-приложением. Python отправляет запрос — Ollama обрабатывает и возвращает ответ от модели.
Установка Ollama
Сначала создаю директорий для хранения данных Ollama — моделей и настроек:
mkdir -p ~/ollama
Теперь запускаю Ollama в Docker-контейнере:
docker run -d -v ~/ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama
Где:
-d — запускает контейнер в фоновом режиме.
-v ~/ollama:/root/.ollama — подключает локальную папку ~/ollama для сохранения моделей.
-p 11434:11434 — открывает порт 11434 для общения с Ollama.
--name ollama — даёт контейнеру имя.
ollama/ollama — официальный образ Ollama.
Если у вас есть GPU, добавьте флаг --gpus all для ускорения работы:
docker run -d --gpus all -v ~/ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama
Проверяю, что контейнер работает (docker ps) и нахожу контейнер с именем ollama. Если что-то пошло не так, смотрю на логи:
docker logs ollama
Дальше проверяю, что Ollama работает:
curl http://localhost:11434

Ответ: Ollama is running — система работает. Если ответа нет, проверяю порт 11434:
sudo netstat -tuln | grep 11434

Загрузка Gemma 3 12B
Gemma 3 12B весит около 20–25 ГБ, так что надо убедиться, что в директории ~/ollama хватает места (лучше 30 ГБ для надёжности).
docker exec -it ollama ollama pull gemma3:12b
Ollama начнёт грузить модель:

Дальше запускаю Гемму:
docker exec -it ollama ollama run gemma3:12b
Тогда Ollama открывает интерактивный режим, а я задаю ей вопрос:

Модель ответила, а значит — всё работает. Если возникли проблемы, проверяю логи (docker logs ollama).
Теперь можно задать несколько вопросов Гемме:
Практический: «Как перезагрузить роутер, если интернет не работает?»
Аналитический: «Проанализируй жалобу клиента: "Wi-Fi постоянно отключается".»
Код: «Напиши bash-скрипт для проверки сетевого соединения.»
Как это может выглядеть
Запрос: Клиент жалуется: "Мой компьютер не подключается к Wi-Fi". Дай краткую инструкцию.
Ответ:

Чтобы Ollama запускалась автоматически при перезагрузке сервера, добавляю политику перезапуска:
docker update --restart unless-stopped ollama

Оптимизация для слабых серверов
Если сервер скромный (8 ГБ RAM или слабый CPU), Gemma может тормозить. Какие есть варианты:
Нужно убедиться, что Ollama использует GPU (если есть): проверяю с помощью nvidia-smi внутри контейнера.
Можно ограничить количество одновременных запросов:
docker stop ollama
docker run -d --gpus all -v ~/ollama:/root/.ollama -p 11434:11434 --name ollama -e OLLAMA_MAX_QUEUE=1 ollama/ollama
Увеличить swap-файл, как я написал в предыдущей главе.
Установив Ollama и запустив Gemma 3, я создал ядро Telegram-бота. Ollama упростит работу с моделью, предоставляя API, через который мы подключим бота.
Создание Python-приложения для работы с Gemma 3
Наш сервер с Ubuntu 24.04 уже стал хостом для Gemma 3, а Ollama запустила эту модель. Теперь пора создать Python-приложение, чтобы:
Подключаться к Ollama через её API (порт 11434) для отправки запросов к Gemma 3.
Обрабатывать входящие сообщения от Telegram (мы настроим бота в следующей главе).
Формировать ответы, адаптированные для техподдержки.
Логировать запросы для отладки и анализа.
Я возьму библиотеку requests для общения с Ollama и python-telegram-bot для интеграции с Telegram. Код будет простым, с комментариями, но достаточно гибким для доработок.
Подготовка окружения
Устанавливаю нужные Python-библиотеки:
pip install requests python-telegram-bot "apscheduler>=3.11,<3.12" "tzlocal>=4.0" python-dotenv
requests — для отправки HTTP-запросов к Ollama.
python-telegram-bot — для работы с Telegram Bot API.
apscheduler>=3.11 — для совместимости с планировщиком задач.
zlocal>=4.0 — для обработки часовых поясов.
Python-dotenv - для того чтобы спрятать токен в Environment файл
Затем создаю файл bot.py в директории ~/gemma-bot: touch bot.py
Открываю его в редакторе (например, nano bot.py) и вставляю код. Вот базовая версия приложения:
import requests
import json
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes
# Конфигурация
OLLAMA_API_URL = "http://localhost:11434/api/generate"
MODEL_NAME = "gemma3:12b"
BOT_TOKEN = "Ваш токен здесь" # Замените на ваш токен Telegram-бота
# Функция для отправки запроса к Gemma 3 через Ollama
def query_gemma(prompt):
# Быстрая проверка, запущен ли Ollama
try:
requests.get("http://localhost:11434")
except requests.ConnectionError:
return "Ошибка: Ollama не запущен или недоступен."
payload = {
"model": MODEL_NAME,
"prompt": prompt,
"stream": False,
"options": {
"temperature": 0.7,
"max_tokens": 200
}
}
try:
response = requests.post(OLLAMA_API_URL, json=payload, timeout=30)
response.raise_for_status()
result = response.json()
return result.get("response", "Ошибка: нет ответа от модели")
except requests.RequestException as e:
return f"Ошибка при обращении к Ollama: {str(e)}"
# Обработчик команды /start
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text(
"Привет! Я бот техподдержки на базе Gemma 3. Задавайте вопросы, и я помогу!"
)
# Обработчик текстовых сообщений
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
user_message = update.message.text
prompt = f"Ты — ассистент технической поддержки'. " \
f"Клиент написал: '{user_message}'. " \
f"Дай краткий, профессиональный ответ на русском языке."
response = query_gemma(prompt)
await update.message.reply_text(response)
# Основная функция
def main():
app = Application.builder().token(BOT_TOKEN).job_queue(None).build()
app.add_handler(CommandHandler("start", start))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
print("Бот запущен...")
app.run_polling()
if name == "__main__":
main()
Разбор кода
Конфигурация:
OLLAMA_API_URL указывает на API Ollama (порт 11434).
MODEL_NAME — это наша модель gemma3:12b.
BOT_TOKEN — токен Telegram-бота, загружаемый из переменных окружения (для безопасности; храните его в файле .env или установите в терминале, чтобы избежать hardcoded значения в коде).
Функция query_gemma:
Отправляет запрос к Ollama с промптом.
Устанавливает параметры: temperature (0.7 для баланса между точностью и креативностью) и max_tokens (200 для кратких ответов).
Обрабатывает ошибки, чтобы бот не падал при сбоях Ollama, включая предварительную проверку доступности Ollama.
Обработчик /start:
Отвечает приветственным сообщением, когда пользователь запускает бота.
Обработчик сообщений:
Принимает текст от пользователя, формирует промпт с контекстом техподдержки и отправляет его в Gemma 3.
Возвращает ответ клиенту через Telegram.
Функция main:
Инициализирует бота (с отключением JobQueue, если он не нужен) и запускает его в режиме polling (периодический опрос сообщений).
Настройка Telegram-бота
Создание тг-бота
Тут нам нужен будет BotFather — официальный бот Telegram для управления другими ботами. Откройте Telegram на телефоне или десктопе и найдите @BotFather. Начинаю диалог: /newbot.
Тогда BotFather попросит:
Имя бота (например, "TechSupportGemmaBot").
Юзернейм (должен заканчиваться на "bot", например, "techsupport_gemma_bot").
После этого BotFather выдаст токен — длинную строку вроде 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11. Скопируйте его и сохраните.
Ну и вот пример диалога с BotFather:

Бот готов, я добавляю его в группу, где он будет работать (для теста можно начать личный диалог).
Подключаю бота к Python-приложению
Возвращаюсь к коду ~/gemma-bot/bot.py. И заменяю YOUR_BOT_TOKEN_HERE на реальный токен:
BOT_TOKEN = "Ваш токен здесь"
Проверяю, чтобы виртуальное окружение работало:
cd ~/gemma-bot
source venv/bin/activate
Запускаю бота (python3 bot.py)
В консоли вижу: "Бот запущен...". Дальше открываю Telegram, нахожу бота по юзернейму и отправлю /start. Бот поздоровается, а я задаю вопрос.

Оптимизация и доработка
Для всех, кто хочет улучшить приложение, вот несколько рекомендаций. Эти изменения можно добавить в существующий код bot.py.
Логирование
Добавьте логи с помощью модуля logging для отладки. Это поможет отслеживать запросы и ошибки в файле bot.log.
Добавьте в начало кода (после импортов):
import logging
Настройка логирования
logging.basicConfig(level=logging.INFO, filename="bot.log",
format="%(asctime)s - %(levelname)s - %(message)s")
Затем в функции handle_message (перед формированием промпта) добавьте:
logging.info(f"Получен запрос от пользователя {update.message.from_user.id}: {user_message}")
После получения ответа от Gemma (перед reply_text) добавьте:
logging.info(f"Ответ модели: {response}")
Это запишет в log-файл информацию о входящих сообщениях и ответах модели.
Контекст (расширение промпта базой знаний)
Если вы делаете бота для себя, то можно использовать тот же FAQ. Но если вы работаете в большой команде, где много регламентов и инструкций, то логичнее подключить базу знаний.
Чтобы ИИ действительно помогал и правильно отвечал на вопросы, необходимо подготовить надёжный источник знаний. Для этого – объединить полезную информацию в одной системе и настроить процессы работы с ней так, чтобы данные всегда оставались актуальными, достоверными и непротиворечивыми.
В Minerva Knowledge можно создавать статьи всей командой, загружать любые файлы и документы и легко находить их с помощью умного поиска, даже если запрос написан с ошибками.

GenAI-ассистент Minerva Copilot, который при подготовке ответов опирается на статьи в Minerva Knowledge, даёт корректные ответы в 94% случаев. А при работе с неструктурированными источниками этот показатель снижается до 50%
Попробовать продукты Minervasoft
Для этого создайте файл faq.txt в директории проекта с часто задаваемыми вопросами (например: "Вопрос: Как сбросить пароль? Ответ: Перейдите в настройки...").
В функции handle_message перед формированием промпта добавьте:
try:
with open("faq.txt", "r", encoding="utf-8") as f:
faq = f.read()
except FileNotFoundError:
faq = "" # Если файл не найден, используем пустую базу
logging.warning("Файл faq.txt не найден. Используем промпт без базы знаний.")
Затем обновите формирование промпта:
prompt = f"База знаний: {faq}\nТы — ассистент технической поддержки. " \
f"Клиент написал: '{user_message}'. " \
f"Дай краткий, профессиональный ответ на русском языке, используя базу знаний где возможно."
Это позволит модели опираться на FAQ для более точных ответов.
Обработка ошибок (retry-логика для запросов к Ollama)
Добавьте retry-механизм для запросов к Ollama, чтобы бот повторял попытки при временных сбоях (например, если Ollama перегружен). Ждя этого берём адаптер из requests.
Добавьте в начало кода (после импортов, если нужно):
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry # Импорт Retry из urllib3
В функции query_gemma замените прямой requests.post на сессию с ретраями (удалите существующий try-except для post и интегрируйте новый):
Это добавит до 3 попыток с экспоненциальной задержкой (backoff) при ошибках соединения или сервера. Логирование ошибок интегрировано для удобства.
Я решил дать коллеге протестировать бота:

Если бот вам не ответил, то проверяю:
Работает ли Ollama (curl http://localhost:11434).
Загружена ли модель (docker exec -it ollama ollama list).
Достаточно ли памяти (free -h).
Правильный ли токен в коде.
Нет ли ошибок в консоли (например, проблемы с подключением к Telegram API).
Заключение
Вот бот и готов. Если у вас есть вопросы или дополнения — пишите в коментах. Я с удовольствием отвечу ?
Больше полезной информации про ИИ и спорные вопросы в найме, менеджменте и планировании — в блоге компании в Telegram. Подпишитесь, чтобы не пропустить новые тексты!
Комментарии (9)
ktibr0
30.07.2025 13:47Хм...а если по ответу от модели потребуются уточнения, то есть, в диалоге будет несколько пар вопрос-ответ, он, судя по коду, не вытащит в контекст предыдущие сообщения?
LittleDuck
30.07.2025 13:47Похоже на то. Я себе тоже сделал бота на базе той же Gemma 3, но еще и храню контекст в базе данных, последние сообщения, укладывающиеся в 8000 токенов. У каждого аккаунта в ТГ свой ID и своя история. При получении запроса я подтягиваю к нему по ID всю историю разговора и тем самым можно задавать уточняющие вопросы и тд.
BasiC2k
30.07.2025 13:47Очень хорошая статья. Считаю что польза подобных мини-помошников пока не оценена, но имеет большой потенциал.
Буду признателен, если расскажете подробнее - как Вы выполняете обучение ИИ? Какие данные, в каком формате можно загрузить? Спасибо!
bodial
30.07.2025 13:47Тут не нужно дообучение, достаточно использовать rag. Я бы на месте автора составил файл со статическими данными по которым должен ориентироваться llm , а динамические (время созвонов и тд) выгружал бы например каждое утро, после чего очищал бы имеющиеся коллекции в qdrant (или его аналоге) и разбивал на чанки и заливал в базу два этих файла. Ну и нужен будет ещё один скрипт который будет формировать реальный промпт с учётом контекста
Shellon
30.07.2025 13:47А что вам помешало без танцев с бубнами поставить локально n8n в связке с ollama? Процентов на 70 себе бы упростили жизнь... Или это просто рекламный пост?))
Kanalja
Интересно, откуда он берет из вашего примера время созвона по продукту? Из того же файла faq.txt?
21_copilots Автор
Конечно данное приложение не верх возможностей, но идею вы понимаете правильно. Цель статьи было - показать возможность связать бота и ИИ сидящую у вас на сервере, и не тратить платные токены. Также что есть возможность собрать свой датасет, и скормить ИИ модели.
Hardcoin
Токены почти ничего не стоят, ценность в контексте, из которого можно взять ответ. И 95% работы тоже там, а бота любая LLM набросает за 10 минут