Введение: зачем нужен свой кулинарный бот с локальным ИИ
Современные технологии искусственного интеллекта открывают удивительные возможности для повседневной жизни. Одним из самых интересных применений ИИ стала помощь в кулинарии — от подбора рецептов до замены ингредиентов и создания персонализированных меню. Однако большинство существующих решений работают через облачные сервисы, что вызывает вопросы о конфиденциальности данных, скорости работы и стоимости использования.
Локальный ИИ, работающий на вашем собственном компьютере или сервере, решает эти проблемы. Вы получаете полный контроль над своими данными, не зависите от интернет-соединения при обработке запросов и можете настроить систему под свои конкретные потребности. В этой статье мы подробно разберем, как создать 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-бот с локальным ИИ — это мощный инструмент для кулинарной помощи. Он обеспечивает приватность, работает без ограничений по количеству запросов и может быть постоянно улучшен.
Возможности для развития включают: добавление распознавания изображений блюд через компьютерное зрение, интеграцию с сервисами доставки продуктов, создание голосового интерфейса, поддержку множественных языков и персонализацию на основе истории взаимодействий.
Главное преимущество локального ИИ — полный контроль и независимость. Экспериментируйте с разными моделями, настраивайте промпты под свои нужды и создавайте уникальные функции. Ваш кулинарный помощник будет становиться умнее с каждым днем!