Чтобы создать несложного чат-бота для Telegram, который получит мощь LLM llama3 вам необходимо выполнить несколько простых шагов. Все будем делать под Ubuntu 22.04 с использованием GPU NVIDIA (подойдут модели RTX2xxx и новее от 8 Гб видеопамяти). Также убедитесь, что у вас на компьютере минимум 16 Гб ОЗУ.

Перед началом работы проверьте, установлены ли у вас драйвера от Nvidia и CUDA вот по этой инструкции.

Устанавливаем Ollama

  1. Скачиваем и устанавливаем Ollama

curl -L https://ollama.com/download/ollama-linux-amd64 -o /usr/bin/ollama
chmod +x /usr/bin/ollama
sudo useradd -r -s /bin/false -m -d /usr/share/ollama ollama
  1. Запускаем Ollama как сервис. Создаем файл сервиса:

tee /usr/lib/systemd/system/ollama.service > /dev/null <<EOF
[Unit]
Description=Ollama Service
After=network-online.target

[Service]
ExecStart=/usr/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="OLLAMA_HOST=0.0.0.0"
Environment="OLLAMA_ORIGINS=*"

[Install]
WantedBy=default.target
EOF
  1. Включаем сервис ollama:

sudo systemctl daemon-reload
sudo systemctl enable ollama
sudo systemctl start ollama
  1. Скачиваем модель llama3:8b

ollama run llama3 | exit

Вы можете скачать и установить любую модель, которые поддерживает Ollama, например Phi3 или Codestral. Полный список моделей можно посмотреть по ссылке. А нажав на конкретную модель, можно выбрать также ее размер, контекст и тип.

  1. Перезапускаем сервис:

ollama run llama3 | exit

Создаем чат-бот

1. Устанавливаем Python 3.10:

sudo apt install python3.10

2. Создаем виртуальное окружение:

python3 -m venv venv

3. Активируем данное окружение:

source venv/bin/activate

При успешной активации в строке приглашения появится имя виртуального окружения в скобках:

(venv) user@you_server:~$

4. Ставим в окружении необходимые библиотеки:

pip install python-telegram-bot ollama nest_asyncio

8. Заходим на https://t.me/BotFather , создаем бота и получаем его токен.

9. Создаем файл bot.py со следующим содержанием (можно в корне вашей домашней директории). Данный код позволяет работать чат-боту в асинхронном режиме, обслуживая несколько пользователей, а также хранить контекст на 8 последних сообщений:

import logging
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, filters
import ollama
import nest_asyncio

nest_asyncio.apply()

# Включаем ведение журнала
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)

# Токен, который вы получили от @BotFather
TOKEN = 'YOU_TELEGRAM_BOT_TOKEN'  # Replace with your actual token

# Словарь для хранения данных пользователей
user_ids = {}
context_memory = {}

# Функция для обработки команды /start
async def start(update: Update, context) -> None:
    await update.message.reply_text('Привет! Я чат-бот. Чем могу помочь?')

# Функция для обработки обычных сообщений
async def handle_message(update: Update, context):
    user_id = update.effective_user.id
    if user_id not in user_ids:
        user_ids[user_id] = {'last_message': None, 'preferences': {}}
        context_memory[user_id] = []

    message_text = update.message.text
    context_messages = context_memory[user_id]

    # Добавляем новое сообщение в контекст
    context_messages.append({'role': 'user', 'content': message_text})

    # Ограничиваем историю контекста последними 8 сообщениями
    context_memory[user_id] = context_messages[-8:]

    try:
        # Call the ollama.chat function with the context messages
        response = ollama.chat(model='llama3:latest', messages=context_memory[user_id])
        # Отправляем ответ пользователю
        await update.message.reply_text(response['message']['content'])
    except Exception as e:
        logging.error(f"Error while getting response from ollama: {e}")
        await update.message.reply_text('Произошла ошибка, попробуйте позже.')

# Основная функция
async def main() -> None:
    application = ApplicationBuilder().token(TOKEN).build()

    application.add_handler(CommandHandler('start', start))
    application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))

    await application.run_polling()

if __name__ == '__main__':
    import asyncio
    asyncio.run(main())

В строку

response = ollama.chat(model='llama3', messages=context_memory[user_id])

нужно подставить имя нужной вам модели, которое можно посмотреть по команде

ollama list

10. Проверяем работу бота, запустив его в виртуальном окружении:

python./bot.py

и посмотрев ответы на ваши запросы из бота в Telegram.

Код не идеальный и его можно и нужно улучшать. Сам код был создан нами также с помощью LLM-модели (использовали llama3-8b-instruct), но есть идея протестировать и другие свободные модели, в том числе специализированные типа Codestral или Codellama-Python и сравнить между собой и с ChatGPT4o.

11. Если все работает и бот отвечает, создаем сервис для его запуска в системе:

tee /usr/lib/systemd/system/bot.service > /dev/null <<EOF

[Unit]
Description=Chat AI Bot Service
After=network-online.target

[Service]
Type=idle
Restart=always
RestartSec=3
User=root
WorkingDirectory=/home/user/
ExecStart=/home/user/venv/bin/python /home/user/bot.py

[Install]
WantedBy=default.target

EOF

12. Запускаем сервис.

sudo systemctl daemon-reload
sudo systemctl enable bot
sudo systemctl start bot

Что делать, если у вас нет компьютера с RTX картой от Nvidia?

  1. Вы можете запустить Ollama на CPU. Будет работать в разы медленнее, чем на GPU, но попробовать можно. Если у вас нет 8 Гб RTX видеокарты, вы все равно можете попробовать запустить чат-бот, но ollama будет работать в GPU-offload режиме с переносом части нагрузки на процессор.

  2. C марта 2024 года существует версия Ollama для GPU от AMD. Как установить и настроить эту версию и какие видеокарты поддерживаются, читайте на этой странице.

  3. Вы можете арендовать виртуальный сервер с GPU у нас. Подойдут сервера с GPU от Nvidia начиная с A4000.

Комментарии (13)


  1. Moog_Prodigy
    03.06.2024 12:50

    Вот бы такое сделать, но под Windows.


    1. akdengi Автор
      03.06.2024 12:50
      +2

      По идее все будет работать и под Windows (ollama есть под windows, а питон он и в Африке...), просто я не проверял :) Плюс можно все развернуть на той же Ubuntu 22.04 под WSL2 в Win10/11


      1. Moog_Prodigy
        03.06.2024 12:50

        WSL

        А вот это было неожиданно)

        Ушел проверять.


  1. Pol1mus
    03.06.2024 12:50

    Такую мелкую ламу дают бесплатно у groq и openrouter, и возможно еще где-нибудь, не искал их специально, они слишком слабые для реального использования.

    А какое железо нужно что бы юзать локально что-нибудь условно приличное, Mixtral 8x22B например?

    https://ollama.com/library/mixtral

    80гб видеопамяти?


    1. akdengi Автор
      03.06.2024 12:50

      Тот же Phi3:14b с 4К контекстом крутится у меня на 4060 с 8 гигами видеопамяти, чуть GPU оффлоада но скорость приличная вывода. Моделек на 8b/14b хватает для большинства задач типа перевода, генерации текстов, аналитики,кода (чат-бот написал же не зная Питона) и т. п. где не нужен большой контекст. Память сейчас хочу нарастить до 32 гигов по идее в GPU offload смогу и 128k попробовать.

      Для больших от A6000 достаточно, там квантизацией можно их запихнуть в 48 гигов видеопамяти, а для контекста ОЗУ важно, 96 или 128 гигов желательно. Понятно что на H100 такое приятней всего "гонять".

      То что дается бесплатно мелкое все равно не сравнится с движком у себя, так как тут я могу и несколько моделек параллельно и RAG, и даже мультимодальность.


      1. Pol1mus
        03.06.2024 12:50

        Вот не надо ля ля, мелочь не пригодна для работы, для генерации нигерийских писем разве что.


        1. akdengi Автор
          03.06.2024 12:50

          Ну это лично ваше мнение. Вчера инструкцию изделия китайского машиностроения показывал, как переводить с помощью Phi3:14b - сказали, что уровень приличный, не хуже переводов средне-ценового фриланса. Все зависит от того, для чего вы используете модель - тот же нормальный копирайтинг даже ChatGPT с его 175 миллиардами не осиливает ;)


          1. Pol1mus
            03.06.2024 12:50

            Это факт а не мнение. У мелких моделей есть проблемы даже с согласованием речи. Я пробовал использовать Phi3 14b для пересказа текстов, у нее же огромное окно 128к. Результат даже хуже чем у mistral 8b с 32к окном, а он звезд с неба не хватает.


            1. akdengi Автор
              03.06.2024 12:50

              Английский или русский? Английский у моделей норм, а вот русского не хватает по данным тренировки похоже. А Яндекс и Сбер модельками не делятся у которых хорошо с родным и могучим :(

              И еще раз - все упирается в задачи, которые нужно решать. Скрапинг сайтов с подготовкой каркаса для текста, RAG, адаптация текстов под соцсети, переводы, где вне зависимости от модели скармливать больше 2К за раз не стоит и т.п - да. Ревью несложного кода или аналитика по презентации - тоже подойдут. Техподдержку тоже бота написать можно, там не нужны "мысею по древу" растекаться. Fine-tuning тоже для небольших моделей проще сделать и свою LORA.

              Я в своей работе сам использую как Phi3 и Llama3 на своей домашней 4060 локально, так и GigaChat и нейроредактор Яндекса для полировки русских текстов и документации, так как у меня корпоративный VPN не дружит с внешним (привет CISCO :( ) и мне проще локальную модель юзать, чем переключаться для доступа к тому же ChatGPT или Copilot, а потом обратно через 2FA гемороиться.


              1. Pol1mus
                03.06.2024 12:50

                Русский конечно. Задачи - генерация текста, пересказ, перевод. Писать код не может нормально даже большая часть огромных моделей, тот же Gemini 1.5 pro сильно заметно сливает чатгпт4*. А llama3-70b пишет код заметно хуже чем Gemini 1.5 pro.

                Я так подозреваю что писать другие специализированные тексты они тоже не умеют нормально, но тут как с английским - невозможно проверить самому.


                1. akdengi Автор
                  03.06.2024 12:50

                  Я перевожу уже лет 20 с лишним в обе стороны RU-EN, поэтому английский там нормальный, по крайней мере технический начиная с llama3 уже. Причем тот же markdown llama3 не коверкает. Скажу так - перевод с вычиткой (модели иногда любят слова коверкать, даже ChatGPT) native редактор правит всего 4-5 ошибок на 5000 символов. Это показатель текста носителя языка, у меня иногда русский редактор больше правок вносит. Русский, как я уже выше написал, что надо модельку в которой на эти 8-14 миллиардов параметров, будет столько же русских данных, сколько английских. Может быть все таки Сбер выложит свои, было бы круто. А то только немцы и китайцы дообучают модели :(

                  Код более-менее Codestral начиная с 14b и CodeLlama с 34b, но последняя лучше на Python (специализированная), чем на остальных. Но коллега использует Codestral на Go и говорит что хорошо помогает. Опять же волшебной кнопки "напиши код" нет, нужно все таки понимать что и для чего пишешь :) Код из текущего примера я получил рабочий итераций через 50 и то, когда дозагрузил в RAG данные по новому API телеграмм.


    1. Moog_Prodigy
      03.06.2024 12:50

      Codestral 8x22B локально пользую. На CPU. Озушки хватает с запасом, а скорость, скорость вот очень малая. Но я вчера написал одну тестовую задачу с ним, 4 итерации - и код запустился, и отработал без ошибок. И потом запустился еще много тыщ раз. Без ошибок. Мне прям зашло. По скорости - генерирует оно на проце чуть больше одного токена в секунду, среднее время ответа составляет порядка от 5 до15 минут (хронометраж очень приблизительный). С работой чисто на видеокарте это разумеется ни в какие рамки, медленно, печально. Но я этот же функционал когда-то писал за неделю. А тут за пару часов получилось. Это с учетом того, что он ошибается в некоторых местах и надо поправлять.

      3060 стоит мертвым грузом, а в ее озу размещается контекст, и всего лишь. Туда можно подгрузить некоторые слои, но на скорость это не влияет.

      Ollama 3х70b тоже такая же ситуация. А вот квантизованная ollama 3х7b влезает в видеокарту и там ответы молниеносные. И довольно неплохие. Но 7b. Увы.


      1. akdengi Автор
        03.06.2024 12:50
        +1

        3060 с gpu offload можно догрузить, ollama умеет это делать автоматом.

        https://ollama.com/library/codestral:22b

        тут 13 гигов моделька, будет притормаживать на 8 гигах видеопамяти, но не 1 токен в секунду.