Skip to content

Repository files navigation

🛒 Продуктовый помощник (Supermarket Assistant)

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

✒️ Описание

Приложения представляет собой проект на основе архитектуры MCP (Model Context Protocol), иллюстрирующий возможность использования больших языковых моделей (LLM) для обращения к внешним источникам данных. В качестве LLM здесь используются открытые популярные онлайн-модели с сайта Hugging Face (мы пробовали DeepSeek-R1-0528\Qwen3-Coder-30B-A3B-Instruct\Llama-3.1-70B-Instruct), а источником данных является SQL-БД магазина.

Supermarket Assistant GUI

Основной код приложения написан на Python, интерфейс - HTML\JavaScript. БД реализована на sqlite3 в виде нескольких таблиц: products, store_sections, locations, navigation. Сложная структура БД требует написания комплексных SQL-запросов и нам хотелось продемонстрировать, что LLM под силу с этим справиться - так как именно она и составляет запрос. Для этого ей требуются знания о строении БД, а также возможность обращения к ней. Мы реализовали это с помощью библиотеки FastMCP в инструментах get_db_schema и execute_sql. Так как большинство известных LLM допускают подключение инструментов ("tools"), то мы положились на возможности LLM в самостоятельном подборе инструментов. Маршрутизация запросов к\от LLM и БД была организована с помощью собственного MCP-клиента. Процесс обработки пользовательского запроса от его ввода в терминал до окончательного ответа может быть довольно сложным и включать многократные запросы инструментов со стороны LLM; переформулированию неудачных SQL-запросов; обработки пустых, ошибочных или малоинформативных ответов БД. С помощью инструкции, переданных в LLM все это делается в автоматическом режиме - то есть LLM сама выбирает свое поведение при обработке исходного запроса. Опыт использования показал, что приемлемый ответ может быть получен даже для усложненного или ошибочного запрос.

📲 Использование

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

🏹 Возможности

  • Поиск товаров по названию (с обработкой опечаток)
  • Информация о цене, наличии и местоположении
  • Навигация по магазину
  • Поддержка сложных запросов (несколько товаров)
  • Работает через протокол MCP
  • Не использует сторонние MCP-клиенты

🗜️ Ограничения

  • В качестве БД используется простейший вариант - база данных в формате SQLite. Реальная БД супермаркета может иметь другой формат, что потребует более сложной интеграции
  • В нынешней версии приложение требует регистрации и получение токена от Hugging Face 🤗 (в настоящий момент его получение в РФ проблематично). Бесплатное пользование моделью ограничено очень небольшим ежемесячным кредитом.
  • Онлайн модели с Hugging Face едва ли стоит использовать в реальном приложении, однако само подключение все равно будет онлайновое, так как установка своей LLM на каждый отдельный терминал не целесообразна
  • Не все LLM допускают подключение MCP-инструментов. Это стоит учесть если будете указывать модель самостоятельно.
  • Контекст модели ограничен временем между моментом ввода покупательского запроса о товаре и моментом вывода на терминал финального ответа LLM, то есть внесение уточняющей информации по товару со стороны покупателя невозможно

🏗️ Архитектура

Проект построен на MCP-архитектуре:

  • MCP Server — предоставляет инструменты для работы с БД
  • Host — управляет клиентом и LLM
  • Electron — интерфейс для терминала

📋 Требования

🗃️ Структура проекта

supermarket-assistant/
├── .env                   # Переменные окружения
├── requirements.txt       # Python-зависимости
├── create_db.py           # Создание базы данных
├── mcp_server.py          # MCP сервер (инструменты)
├── host.py                # Класс SupermarketHost
├── main.py                # FastAPI сервер
├── index.html             # Интерфейс Electron
├── main.js                # Electron main
├── package.json           # Node.js зависимости
├── docker-entrypoint.sh   # Скрипт запуска в Docker
├── Dockerfile             # Для сборки образа
├── .gitignore
└── .dockerignore

🔧 Установка зависимостей

1. Python-зависимости

pip install -r requirements.txt

2. Node.js-зависимости

npm install

3. База данных

При запуске приложение автоматически создает БД в случае ее отсутствия.

python create_db.py

4. Настройка токена

Получите токен к API Hugging Face. Создайте файл с переменными окружения .env в папке приложения и добавьте:

HF_TOKEN=**<ваш_токен_сюда>**

🚀 Локальный запуск

Скачайте или клонируйте репозиторий и перейдите в директорию приложения

git clone https://github.com/maresin/supermarket-assistant.git
cd supermarket-assistant

В терминале запустите основной файл бэкэнда

python main.py

Откройте другой терминал и запустите приложение Node.js

npm start

🧪 Тестирование

При локальном запуске из терминала приложение можно запустить в тестовом режиме. При этом приложение попытается обработать несколько заранее подготовленных пользовательских запросов по товарам.

# Запуск в тестовом режиме
python main.py --test

🐳 Сборка в Docker

Для запуска приложения с помощью Docker под Линукс сначала нужно получить права доступа, иначе при создании образа мы получим ошибку. Выполните эти команды по порядку:

# 1. Добавляем текущего пользователя в группу docker
sudo usermod -aG docker $USER

# 2. Применяем изменения (или просто перелогиньтесь)
newgrp docker

# 3. Проверяем, что теперь работает
docker ps

После этого ваша команда docker build должна заработать без sudo.

Сборка образа
Для сборки образа нужно перейти в папку с приложением или указать полный путь к нему. В папке с приложением должен находится скрипт для сборки Dockerfile и скрипт для запуска приложения - docker-entrypoint.sh.

# Сборка образа из папки с приложением
docker build -t supermarket-assistant .

Запуск контейнера
Приложение при стартует автоматически в полноэкранном режиме

# Запуск (Linux с X11)
xhost +local:docker && \
docker run --rm -it \
    -e DISPLAY=$DISPLAY \
    -v /tmp/.X11-unix:/tmp/.X11-unix:rw \
    --network=host \
    --name assistant \
    supermarket-assistant

📚 Источники

🎓 Лицензия

MIT License

About

AI-помощник для покупателей в продовольственном магазине на основе архитектуры MCP (Model Context Protocol).

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages