В айти я уже давно, и в какой-то момент проектов стало сильно больше, чем я могу вывезти. Отказаться даже от одного из них — не вариант, деньги нужны катастрофически. После того как рабочий день снова закончился к 2-3 ночи, я начал думать, как освободить себе хотя пару часов на поспать или пожить. 

Сначала завел таск-трекер, потом вставал пораньше, но кардинально ничего не поменялось.

Тогда залез в статистику экранного времени и увидел, что сижу в телеграме по 5-6 часов в день. И это не только личные переписки с друзьями, еще и коллеги спрашивают одно и тоже: «Подскажи, а что это за схема?, «Где тот файл?», «А где лежат все отчёты?». Сообщения приходят постоянно, даже ночью. Да и я не против помочь, но одно и то же объяснять по 10 раз — реально устал. 

Тогда решил собрать себе личного чат-бота в телеграм и поставить его на Gemma 3.  Сделал так, чтобы он понимал команды, опечатки и нормально отвечал. Рассказываю, как настроил — и как он теперь экономит мне время и нервы.

В статье:

  1. Про Gemma 3 и её возможности — что такое Gemma 3, почему подходит для локального чат-бота и с чем поможет.

  2. Подготовлю сервер для Gemma 3 — настрою Ubuntu 24.04, чтобы модель работала без облаков.

  3. Установлю и запущу Gemma 3 с Ollama.

  4. Создам Python-приложение для работы с Gemma 3.

  5. Настрою и подключу 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 можно создавать статьи всей командой, загружать любые файлы и документы и легко находить их с помощью умного поиска, даже если запрос написан с ошибками.

Minerva Copilot встраивается в любую рабочую систему и даёт ответы с указанием источника
Minerva Copilot встраивается в любую рабочую систему и даёт ответы с указанием источника

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)


  1. Kanalja
    30.07.2025 13:47

    Интересно, откуда он берет из вашего примера время созвона по продукту? Из того же файла faq.txt?


    1. 21_copilots Автор
      30.07.2025 13:47

      Конечно данное приложение не верх возможностей, но идею вы понимаете правильно. Цель статьи было - показать возможность связать бота и ИИ сидящую у вас на сервере, и не тратить платные токены. Также что есть возможность собрать свой датасет, и скормить ИИ модели.


      1. Hardcoin
        30.07.2025 13:47

        Токены почти ничего не стоят, ценность в контексте, из которого можно взять ответ. И 95% работы тоже там, а бота любая LLM набросает за 10 минут


  1. ktibr0
    30.07.2025 13:47

    Хм...а если по ответу от модели потребуются уточнения, то есть, в диалоге будет несколько пар вопрос-ответ, он, судя по коду, не вытащит в контекст предыдущие сообщения?


    1. LittleDuck
      30.07.2025 13:47

      Похоже на то. Я себе тоже сделал бота на базе той же Gemma 3, но еще и храню контекст в базе данных, последние сообщения, укладывающиеся в 8000 токенов. У каждого аккаунта в ТГ свой ID и своя история. При получении запроса я подтягиваю к нему по ID всю историю разговора и тем самым можно задавать уточняющие вопросы и тд.


  1. BasiC2k
    30.07.2025 13:47

    Очень хорошая статья. Считаю что польза подобных мини-помошников пока не оценена, но имеет большой потенциал.

    Буду признателен, если расскажете подробнее - как Вы выполняете обучение ИИ? Какие данные, в каком формате можно загрузить? Спасибо!


    1. bodial
      30.07.2025 13:47

      Тут не нужно дообучение, достаточно использовать rag. Я бы на месте автора составил файл со статическими данными по которым должен ориентироваться llm , а динамические (время созвонов и тд) выгружал бы например каждое утро, после чего очищал бы имеющиеся коллекции в qdrant (или его аналоге) и разбивал на чанки и заливал в базу два этих файла. Ну и нужен будет ещё один скрипт который будет формировать реальный промпт с учётом контекста


  1. Shellon
    30.07.2025 13:47

    А что вам помешало без танцев с бубнами поставить локально n8n в связке с ollama? Процентов на 70 себе бы упростили жизнь... Или это просто рекламный пост?))


  1. rSedoy
    30.07.2025 13:47

    ох уж этот requests в async функциях