⚡ TL;DR
# 1. Создайте файл окружения с вашим API‑ключом Mistral:
echo "MISTRAL_API_KEY=<your_key>" > .env
# 2. Сборка и запуск сервисов:
docker compose build --pull # сперва один раз
docker compose up -d # затем можно перезапускать без сборки
# 3. Проверка статуса (health‑check):
# Parser : http://localhost:7000/docs
# Gateway : http://localhost:7100/docs
# Classifier : http://localhost:7200/docs
# Llama server : http://localhost:8080/health- Ubuntu 22.04 LTS
- Docker Engine & Docker Compose v2
- Git
- CUDA‑capable GPU (для локального Llama)
- Mistral API key (free tier supported)
- Клонируйте репозиторий и перейдите в каталог проекта:
git clone <repo-url>
cd mlops\_project\_a.lebedev
- Создайте файл окружения:
echo "MISTRAL_API_KEY=your_key_here" > .env- Сборка образов Docker:
docker compose build --pull
- Запуск сервисов в фоне:
docker compose up -d- Parser (HTML→Markdown):
curl -X POST [http://localhost:7000/parse](http://localhost:7000/parse) 
-H "Content-Type: application/json" 
-d '{"url":"[https://example.com"}](https://example.com%22})'
Возвращает JSON с полем text_md.
- LLM Gateway (Markdown→LLM):
curl -X POST http://localhost:7100/chat \
-H "Content-Type: application/json" \
-d '{"messages":[{"role":"user","content":"<text_md>"}]}'- Classifier (Text→Category):
curl -X POST [http://localhost:7200/predict](http://localhost:7200/predict) 
-H "Content-Type: application/json" 
-d '{"text":"<snippet>","top\_k":3}'c
- Local Llama (for direct access):
curl http://localhost:8080/healthНа данный момент отдельного эндпоинта, который принимал бы URL и возвращал категорию «в один вызов», нет. Вместо этого используется двухшаговый сценарий:
-
Извлечение текста
curl -s -X POST http://localhost:7000/parse \ -H "Content-Type: application/json" \ -d '{"url":"<URL>"}' \ | jq -r '.text_md' > page.md -
Классификация
curl -s -X POST http://localhost:7200/predict \ -H "Content-Type: application/json" \ -d "{\"text\":\"$(head -c 500 page.md)\",\"top_k\":1}" \ | jq -r '.prediction // .predictions[0]'
где <URL> — адрес страницы.
.
├── README.md
├── classifier_service
│ ├── main.py
│ ├── ru_ecomm_tree_category.json
│ └── ru_ecomm_tree_category.json.dvc
├── docker
│ ├── Dockerfile.classifier
│ ├── Dockerfile.gateway
│ ├── Dockerfile.llama_cpp
│ └── Dockerfile.parser
├── docker-compose.yml
├── llm_gateway
│ ├── main.py
│ └── requirements.txt
├── models
│ ├── QVikhr-3-1.7B-Instruction-noreasoning.Q4_K_M.gguf
│ └── QVikhr-3-1.7B-Instruction-noreasoning.Q4_K_M.gguf.dvc
├── parser_service
│ ├── main.py
└── requirements.txt
├── res.log
├── tests
│ ├── run_integration_test.sh
│ └── smoke_tests.py
└── utils
└── preprocess.py