Добавить в корзинуПозвонить
Найти в Дзене
ИИ без страха

Как сделать Telegram-бота для локального ИИ, который помогает в кулинарии (рецепты, замена продуктов)

Введение: зачем нужен свой кулинарный бот с локальным ИИ
Современные технологии искусственного интеллекта открывают удивительные возможности для повседневной жизни. Одним из самых интересных применений ИИ стала помощь в кулинарии — от подбора рецептов до замены ингредиентов и создания персонализированных меню. Однако большинство существующих решений работают через облачные сервисы, что вызывает

Введение: зачем нужен свой кулинарный бот с локальным ИИ

Современные технологии искусственного интеллекта открывают удивительные возможности для повседневной жизни. Одним из самых интересных применений ИИ стала помощь в кулинарии — от подбора рецептов до замены ингредиентов и создания персонализированных меню. Однако большинство существующих решений работают через облачные сервисы, что вызывает вопросы о конфиденциальности данных, скорости работы и стоимости использования.

Локальный ИИ, работающий на вашем собственном компьютере или сервере, решает эти проблемы. Вы получаете полный контроль над своими данными, не зависите от интернет-соединения при обработке запросов и можете настроить систему под свои конкретные потребности. В этой статье мы подробно разберем, как создать Telegram-бота, подключенного к локальной языковой модели, которая станет вашим персональным кулинарным помощником.

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

Выбор технологий: что понадобится для создания бота

Для реализации нашего проекта потребуется несколько ключевых компонентов. Первый — это платформа для запуска локальных языковых моделей. Наиболее популярным и удобным решением является Ollama, который позволяет легко устанавливать и запускать различные открытые модели прямо на вашем компьютере. Ollama поддерживает множество архитектур, включая Llama, Mistral, Gemma и другие, и работает на Windows, macOS и Linux.

Второй компонент — фреймворк для создания Telegram-ботов. Мы будем использовать python-telegram-bot, мощную библиотеку Python, которая предоставляет удобный API для взаимодействия с Telegram Bot API. Эта библиотека поддерживает как синхронный, так и асинхронный режим работы, имеет встроенную обработку ошибок и позволяет легко масштабировать функциональность бота.

Третий элемент — сама языковая модель. Для кулинарных задач отлично подходят модели среднего размера, такие как Llama 3 8B, Mistral 7B или Gemma 7B. Они достаточно компактны для работы на домашнем компьютере с 16 ГБ оперативной памяти, но при этом демонстрируют высокое качество ответов на специализированные темы. Для более продвинутых задач можно использовать модели большего размера, если у вас есть видеокарта с достаточным объемом памяти.

Дополнительно нам понадобится база знаний по кулинарии. Хотя современные языковые модели уже содержат обширные знания о еде и готовке, для повышения точности ответов полезно добавить контекстную информацию. Это может быть коллекция проверенных рецептов, таблица замен ингредиентов или информация о пищевых аллергиях и диетах.

Настройка окружения и установка необходимых инструментов

Начнем с подготовки рабочего окружения. Убедитесь, что на вашем компьютере установлен Python версии 3.8 или выше. Проверить версию можно командой:

bash

python --version

Если Python не установлен, скачайте его с официального сайта python.org и следуйте инструкциям по установке. Также рекомендуется установить пакетный менеджер pip, который обычно идет в комплекте с Python.

Следующий шаг — установка Ollama. Перейдите на официальный сайт ollama.ai и скачайте установщик для вашей операционной системы. После установки откройте терминал или командную строку и проверьте работоспособность:

bash

ollama --version

Теперь загрузим подходящую языковую модель. Для начала рекомендую использовать модель llama3.2, которая хорошо справляется с кулинарными задачами и требует относительно мало ресурсов:

bash

ollama pull llama3.2

Процесс загрузки может занять некоторое время в зависимости от скорости вашего интернета. Размер модели составляет около 4-5 ГБ. После завершения загрузки вы можете протестировать модель напрямую через терминал:

bash

ollama run llama3.2 "Напиши рецепт борща"

Если модель отвечает корректно, значит установка прошла успешно. Теперь установим библиотеку для работы с Telegram:

bash

pip install python-telegram-bot

Также полезно установить дополнительные библиотеки для обработки текста и работы с данными:

bash

pip install requests json re

Создание Telegram-бота и получение токена

Прежде чем писать код, нужно зарегистрировать бота в Telegram и получить уникальный токен доступа. Откройте Telegram и найдите бота @BotFather — это официальный бот для управления другими ботами. Напишите ему команду /start, затем выберите опцию создания нового бота через команду /newbot.

BotFather попросит вас придумать имя для бота (например, "Кулинарный Помощник") и username (уникальное имя пользователя, например, "cooking_ai_helper_bot"). После этого он выдаст вам токен доступа — длинную строку символов, которую нужно сохранить в безопасном месте. Этот токен является ключом к управлению вашим ботом, поэтому никому его не передавайте.

Также полезно настроить описание бота и приветственное сообщение. Используйте команды /setdescription и /setabouttext в диалоге с BotFather, чтобы пользователи понимали, для чего предназначен ваш бот. Например, описание может звучать так: "Персональный кулинарный помощник на базе локального ИИ. Помогаю с рецептами, заменой ингредиентов и планированием меню".

Теперь создадим базовую структуру проекта. Создайте новую папку для вашего бота и внутри нее файл bot.py. Начнем с простого кода, который просто отвечает на сообщения пользователей:

python

application.run_polling()

if __name__ == '__main__':

    main()

Замените "ВАШ_ТОКЕН_ЗДЕСЬ" на реальный токен, полученный от BotFather. Запустите бота командой:

bash

python bot.py

Если все настроено правильно, вы увидите сообщение "Бот запущен!" и сможете протестировать бота в Telegram, отправив ему команду /start.

Интеграция с локальной языковой моделью через Ollama API

Теперь самое интересное — подключим нашего бота к локальной языковой модели. Ollama предоставляет простой REST API, который позволяет отправлять запросы к модели и получать ответы. Мы будем использовать библиотеку requests для взаимодействия с этим API.

Сначала создадим отдельный модуль для работы с ИИ. Создайте файл ai_assistant.py со следующим содержимым:

python

Отвечай на русском языке.

"""

        return self.generate_response(prompt, max_tokens=700)

Теперь обновим основной файл бота, чтобы использовать наш AI-ассистент:

python

application.run_polling()

if __name__ == '__main__':

    main()

Оптимизация производительности и улучшение качества ответов

Работа с локальными языковыми моделями требует внимания к производительности. Вот несколько советов по оптимизации:

Во-первых, настройте параметры генерации. Температура (temperature) контролирует креативность ответов: значения ближе к 0 дают более предсказуемые и точные ответы, значения ближе к 1 — более творческие, но иногда менее релевантные. Для кулинарных задач оптимально значение 0.6-0.8.

Во-вторых, используйте системные промпты для улучшения качества ответов. Добавьте в класс CulinaryAIAssistant метод для установки системного промпта:

python

def set_system_prompt(self, system_prompt: str):

    """Устанавливает системный промпт для модели"""

    self.system_prompt = system_prompt

И модифицируйте метод generate_response:

python

def generate_response(self, prompt: str, max_tokens: int = 500) -> str:

    """Генерирует ответ на основе промпта"""

    

    full_prompt = ""

    if hasattr(self, 'system_prompt'):

        full_prompt += f"System: {self.system_prompt}\n\n"

    full_prompt += f"User: {prompt}\nAssistant:"

    

    payload = {

        "model": self.model_name,

        "prompt": full_prompt,

        "stream": False,

        "options": {

            "temperature": 0.7,

            "num_predict": max_tokens,

            "top_p": 0.9,

            "top_k": 40

        }

    }

    

    # ... остальной код без изменений

В-третьих, реализуйте кэширование частых запросов. Создайте простой кэш на основе словаря:

python

import time

from functools import lru_cache

class ResponseCache:

    """Простой кэш для ответов ИИ"""

    

    def __init__(self, max_size=100, ttl=3600):

        self.cache = {}

        self.max_size = max_size

        self.ttl = ttl  # время жизни кэша в секундах

    

    def get(self, key: str) -> str:

        if key in self.cache:

            value, timestamp = self.cache[key]

            if time.time() - timestamp < self.ttl:

                return value

            else:

                del self.cache[key]

        return None

    

    def set(self, key: str, value: str):

        if len(self.cache) >= self.max_size:

            # Удаляем самый старый элемент

            oldest_key = min(self.cache, key=lambda k: self.cache[k][1])

            del self.cache[oldest_key]

        self.cache[key] = (value, time.time())

В-четвертых, добавьте обработку длинных сообщений. Telegram ограничивает длину сообщений 4096 символами. Разбивайте длинные ответы на части:

python

async def send_long_message(update: Update, text: str, max_length: int = 4000):

    """Отправляет длинное сообщение, разбивая его на части"""

    parts = [text[i:i+max_length] for i in range(0, len(text), max_length)]

    

    for i, part in enumerate(parts):

        if i == len(parts) - 1:

            await update.message.reply_text(part)

        else:

            await update.message.reply_text(part + "\n...(продолжение)")

            await asyncio.sleep(1)  # небольшая пауза между частями

Расширение функциональности: добавление базы знаний

Хотя языковые модели обладают обширными знаниями, добавление собственной базы данных улучшит точность ответов. Создайте файл knowledge_base.py:

python

self.data["substitutions"][original].append({

            "substitute": substitute,

            "ratio": ratio

        })

        self.save_data()

    

    def get_substitutions(self, ingredient: str) -> list:

        """Получает список замен для ингредиента"""

        return self.data["substitutions"].get(ingredient, [])

    

    def add_recipe(self, name: str, recipe: dict):

        """Добавляет рецепт в базу"""

        self.data["recipes"][name] = recipe

        self.save_data()

    

    def search_recipes(self, query: str) -> list:

        """Ищет рецепты по запросу"""

        results = []

        query_lower = query.lower()

        

        for name, recipe in self.data["recipes"].items():

            if query_lower in name.lower():

                results.append((name, recipe))

        

        return results

import json

import os

class CulinaryKnowledgeBase:

    """База знаний по кулинарии"""

    

    def __init__(self, data_file="culinary_data.json"):

        self.data_file = data_file

        self.data = self.load_data()

    

    def load_data(self):

        """Загружает данные из файла"""

        if os.path.exists(self.data_file):

            with open(self.data_file, 'r', encoding='utf-8') as f:

                return json.load(f)

        return {

            "substitutions": {},

            "recipes": {},

            "allergens": {}

        }

    

    def save_data(self):

        """Сохраняет данные в файл"""

        with open(self.data_file, 'w', encoding='utf-8') as f:

            json.dump(self.data, f, ensure_ascii=False, indent=2)

    

    def add_substitution(self, original: str, substitute: str, ratio: str = "1:1"):

        """Добавляет информацию о замене ингредиента"""

        if original not in self.data["substitutions"]:

            self.data["substitutions"][original] = []

        

Интегрируйте базу знаний в AI-ассистента, добавляя контекст к промптам:

python

def get_recipe_with_context(self, dish_name: str) -> str:

    """Получает рецепт с использованием базы знаний"""

    # Сначала проверяем базу знаний

    recipes = self.knowledge_base.search_recipes(dish_name)

    

    context = ""

    if recipes:

        name, recipe = recipes[0]

        context = f"Известный рецепт '{name}': {json.dumps(recipe, ensure_ascii=False)}\n\n"

    

    prompt = f"""

{context}

Ты опытный шеф-повар. Напиши подробный рецепт блюда "{dish_name}".

...

"""

    return self.generate_response(prompt, max_tokens=800)

Развертывание и мониторинг бота

Для постоянной работы бота рассмотрите возможность размещения его на сервере. Подойдет любой VPS с Linux, минимум 4 ГБ RAM и 2 ядра CPU. Используйте systemd для автоматического запуска:

Создайте файл /etc/systemd/system/cooking-bot.service:

ini

[Unit]

Description=Cooking AI Telegram Bot

After=network.target

[Service]

Type=simple

User=your_username

WorkingDirectory=/home/your_username/cooking-bot

ExecStart=/usr/bin/python3 /home/your_username/cooking-bot/bot.py

Restart=on-failure

RestartSec=10

[Install]

WantedBy=multi-user.target

Активируйте сервис:

bash

sudo systemctl enable cooking-bot

sudo systemctl start cooking-bot

Для мониторинга используйте логи и добавьте уведомления об ошибках. Можно интегрировать с системами мониторинга like Prometheus или просто настроить отправку уведомлений в Telegram при критических ошибках.

Заключение и дальнейшее развитие

Созданный вами Telegram-бот с локальным ИИ — это мощный инструмент для кулинарной помощи. Он обеспечивает приватность, работает без ограничений по количеству запросов и может быть постоянно улучшен.

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

Главное преимущество локального ИИ — полный контроль и независимость. Экспериментируйте с разными моделями, настраивайте промпты под свои нужды и создавайте уникальные функции. Ваш кулинарный помощник будет становиться умнее с каждым днем!