Чтобы создать несложного чат-бота для Telegram, который получит мощь LLM llama3 вам необходимо выполнить несколько простых шагов. Все будем делать под Ubuntu 22.04 с использованием GPU NVIDIA (подойдут модели RTX2xxx и новее от 8 Гб видеопамяти). Также убедитесь, что у вас на компьютере минимум 16 Гб ОЗУ.
Перед началом работы проверьте, установлены ли у вас драйвера от Nvidia и CUDA вот по этой инструкции.
Устанавливаем Ollama
Скачиваем и устанавливаем 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
Запускаем 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
EOFInsert your text here
Включаем сервис ollama:
sudo systemctl daemon-reload
sudo systemctl enable ollama
sudo systemctl start ollama
Скачиваем модель llama3:8b
ollama run llama3 | exit
Вы можете скачать и установить любую модель, которые поддерживает Ollama, например Phi3 или Codestral. Полный список моделей можно посмотреть по ссылке. А нажав на конкретную модель, можно выбрать также ее размер, контекст и тип.
Перезапускаем сервис:
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
EOF12. Запускаем сервис.
sudo systemctl daemon-reload
sudo systemctl enable bot
sudo systemctl start bot
Что делать, если у вас нет компьютера с RTX картой от Nvidia
- Вы можете запустить Ollama на CPU. Будет работать в разы медленнее, чем на GPU, но попробовать можно. Если у вас нет 8 Гб RTX видеокарты, вы все равно можете попробовать запустить чат-бот, но ollama будет работать в GPU-offload режиме с переносом части нагрузки на процессор.
- C марта 2024 года существует версия Ollama для GPU от AMD. Как установить и настроить эту версию и какие видеокарты поддерживаются, читайте на этой странице.
- Вы можете арендовать виртуальный сервер с GPU у нас. Подойдут сервера с GPU от Nvidia начиная с A4000.