ОПИСАНИЕ АРХИТЕКТУРЫ
ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ «АССИСТЕНТ ПРО»
Правообладатель: ИП Белоусов Дмитрий Владимирович (ИНН 665206580503)
Наименование ПО: Ассистент ПРО (RAG-система интеллектуального поиска и генерации ответов)
Дата документа: 28 апреля 2026 г.
Настоящий документ содержит описание архитектуры программного обеспечения «Ассистент ПРО» и подготовлен в соответствии с требованиями постановления Правительства Российской Федерации от 16 ноября 2015 г. № 1236 (в действующей редакции) для включения сведений о ПО в Единый реестр российских программ для электронных вычислительных машин и баз данных Министерства цифрового развития, связи и массовых коммуникаций Российской Федерации.

1. Общие сведения о программном обеспечении
1.1. Наименование
Полное наименование: «Ассистент ПРО» — программное обеспечение в сфере искусственного интеллекта, реализующее технологию RAG (Retrieval-Augmented Generation, поиск с дополненной генерацией) на основе больших языковых моделей.
Условное обозначение в проектной документации, конфигурационных файлах и репозиториях исходного кода: sitellm_vertebro.
1.2. Назначение
Программное обеспечение предназначено для построения интеллектуальных корпоративных ассистентов (чат-ботов и голосовых аватаров), которые автоматически обрабатывают запросы пользователей в свободной форме на русском языке, извлекают релевантную информацию из корпоративной базы знаний и формируют осмысленные ответы на естественном языке с указанием источников.
Целевые отрасли применения: техническая поддержка, продажи, корпоративное обучение (e-learning), HR-сервисы, обработка обращений граждан в государственных органах и образовательных учреждениях, работа с обширными нормативно-методическими базами знаний.
1.3. Объём программного обеспечения
Совокупный объём кодовой базы (расчёт на момент формирования документа):

Тип файлов

Количество строк

Доля, %

Python (*.py)

≈ 59 522

66,6

JavaScript / TypeScript (*.js, *.ts)

≈ 20 372

22,8

HTML (*.html)

≈ 4 885

5,5

CSS (*.css)

≈ 4 630

5,2

YAML / TOML / JSON (конфигурации)

≈ 500

0,6

Bash / PowerShell скрипты

≈ 1 000

1,1

ИТОГО

≈ 89 409 строк, 161 файл

100

Кодовая база организована как монорепозиторий и логически разделена на 12 Python-модулей верхнего уровня, два веб-интерфейса (административная панель и встраиваемый чат-виджет), три клиента мессенджеров (Telegram, ВКонтакте, MAX) и набор интеграций с внешними системами.

2. Архитектурная модель
2.1. Общая концепция
ПО «Ассистент ПРО» построено на микросервисной модели, развёртываемой как единое приложение средствами Docker Compose. Каждый компонент изолирован в отдельном контейнере, имеет собственный интерфейс взаимодействия и может масштабироваться независимо. Внутренние коммуникации осуществляются через приватную сеть Docker bridge, внешние — только через явно проброшенные порты.
В основе работы лежит конвейер RAG: запрос пользователя → векторизация → гибридный поиск по корпоративной базе знаний → формирование расширенного промпта → генерация ответа большой языковой моделью → стриминг ответа клиенту в режиме Server-Sent Events.
2.2. Компонентная схема
Система состоит из следующих логических слоёв:
  • Слой представления (Presentation): SPA-админка (раздел /admin), встраиваемый чат-виджет (/widget), клиенты мессенджеров (Telegram, VK, MAX).
  • Слой публичных API (Public API): FastAPI-приложение, маршруты публичного доступа (/api/v1/llm, /api/v1/chat, /api/v1/voice, /api/v1/reading, /api/v1/feedback).
  • Слой административных API (Admin API): защищённые маршруты /api/v1/admin/* с аутентификацией на уровне ASGI-middleware.
  • Ядро интеллектуальной обработки (Core): модули поиска (packages/retrieval), генерации (packages/backend), обработки знаний (packages/knowledge).
  • Слой данных (Data): MongoDB (документы, метаданные, диалоги, GridFS-хранилище файлов), Qdrant (векторное хранилище), Redis (кэш, брокер задач).
  • Слой фоновых задач (Async): Celery worker и Celery beat — индексация, обновление эмбеддингов, обновление поисковых индексов, периодические резервные копии.
  • Слой инференса моделей: Ollama Runtime (локальные GGUF-модели) и/или внешний LLM-микросервис (model-service) с REST-интерфейсом, обёртка backend.llm_client для унифицированного доступа.
  • Слой коннекторов (MCP): протоколы Model Context Protocol для интеграций с Bitrix24, корпоративной электронной почтой (IMAP/SMTP) и иными корпоративными системами.
2.3. Топология рантайма
Стандартная схема Docker Compose разворачивает следующие сервисы:

Сервис

Образ

Назначение

Порт (по умолчанию, host)

app

sitellm/backend:1

FastAPI-приложение, админ-панель, виджет

18080 → 8000

mongo

mongo:8.0

Документная СУБД, GridFS

27038 → 27017

redis

redis:7-alpine

Кэш, брокер Celery

16380 → 6379

qdrant

qdrant/qdrant:latest

Векторное хранилище

26333/26334 → 6333/6334

celery_worker

sitellm/backend:1

Фоновые задачи (индексация, эмбеддинги, бэкап)

celery_beat

sitellm/backend:1

Планировщик периодических задач

ollama

ollama/ollama:latest

Локальный рантайм LLM (GGUF), опц. профиль local-ollama

11434

telegram-bot

sitellm/telegram:1

Клиент Bot API

knowledge_service (опц.)

sitellm/backend:1

Микросервис обогащения базы знаний

Все запросы между сервисами выполняются по приватной сети Docker (driver: bridge). Внешний трафик принимается только сервисом app. Опционально перед app устанавливается обратный прокси Caddy/nginx с TLS-терминированием — соответствующая конфигурация автоматически создаётся скриптом scripts/bootstrap.sh при указании домена.

3. Использованные языки программирования
3.1. Python
  • Версия: Python 3.10–3.12 (требование pyproject.toml: requires-python = ">=3.10,<3.13").
  • Применение: backend FastAPI, обработка документов и векторизация, интеграция с LLM, фоновые задачи Celery, клиенты мессенджеров.
  • Доля в кодовой базе: ≈ 66,6 %.
3.2. JavaScript / TypeScript
  • Стандарт: ES6+, использование классов, модулей ESM, async/await.
  • Применение: SPA-админка (vanilla JS, без фреймворков), встраиваемый чат-виджет.
  • Доля в кодовой базе: ≈ 22,8 %.
3.3. HTML / CSS
  • Применение: разметка веб-интерфейсов, стилизация (без UI-фреймворков, кастомные стили).
  • Доля в кодовой базе: ≈ 10,7 %.
3.4. Языки разметки и конфигурации
  • YAML — конфигурации Docker Compose (compose.yaml, compose.gpu.yaml, compose.override.yaml).
  • TOML — конфигурация проекта (pyproject.toml).
  • JSON — метаданные пакетов, конфигурации виджета, versions.json (хеши клиентов).
  • Bash и PowerShell — скрипты автоматизации развертывания (scripts/bootstrap.sh, deploy_project.sh, deploy_project.ps1).

4. Системы управления базами данных
4.1. MongoDB
  • Версия: MongoDB 8.0 (Community Edition, лицензия SSPL).
  • Назначение: документная база для хранения метаданных проектов, документов базы знаний, истории диалогов, очередей операторских обращений, статистики, бэкап-настроек, а также бинарных файлов через GridFS.
  • Драйверы: pymongo ≥ 4.13.2 (синхронный), motor ≥ 3.7.1 (асинхронный).
Основные коллекции:

Коллекция

Назначение

projects

Конфигурация мульти-арендных проектов: токены ботов, промпты, доступы

documents

Метаданные загруженных документов и web-страниц

fs.files / fs.chunks

GridFS-бакет с бинарными файлами (PDF, DOCX, XLSX, изображения)

conversations / sessions

История диалогов, сессии пользователей виджета и ботов

qa_pairs

Ручные пары «вопрос — ответ» для повышения точности

unanswered

Запросы, на которые система не дала ответа, для последующего анализа

reading_pages

Сегментированный контент режима «чтение»

backup_settings

Параметры расписания и истории резервного копирования

operator_requests

Очередь обращений, переадресованных оператору

feedback

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

4.2. Qdrant
  • Версия: Qdrant latest (рекомендуется фиксация конкретной версии в продуктиве).
  • Назначение: хранение векторных эмбеддингов (плотных представлений) текстовых фрагментов и поддержка векторного, BM25 и гибридного поиска.
  • Транспорт: HTTP (порт 6333) и gRPC (порт 6334).
  • Параметры коллекций: метрика расстояния — COSINE; payload-индексы по полям project, source, document_id; шардирование — на одном узле, на кластере выделяется отдельный коллекционный раздел на проект.
  • Размерность векторов: определяется моделью эмбеддингов (для deepvk/USER-bge-m3 — 1024).
4.3. Redis
  • Версия: Redis 7-alpine (для разработки), допускается bitnami/redis (production).
  • Назначение: кэш результатов поиска (TTL 86400 с), брокер сообщений Celery, хранилище состояний краулера, технических сессий, метрик rate-limiting.
  • Аутентификация: пароль через переменную REDIS_PASSWORD, протокол ACL включается в production-конфигурации.
5. Используемые фреймворки и библиотеки
5.1. Backend-фреймворки и сервисы

Библиотека

Версия (≥)

Назначение

Лицензия

FastAPI

0.115.14

ASGI-фреймворк REST API

MIT

Uvicorn[standard]

0.35.0

ASGI-сервер с поддержкой WebSocket/SSE

BSD-3-Clause

Pydantic / pydantic-settings

2.2.1

Валидация и управление конфигурацией

MIT

Celery

5.5.3

Брокеризованные фоновые задачи и планировщик Beat

BSD-3-Clause

LangChain / langchain-community

0.3.26

Оркестрация RAG-цепочек, лоадеры

MIT

langchain-redis

0.2.3

Хранилище и кэш через Redis

MIT

LangChain-HuggingFace (опц.)

0.1.0

Подключение моделей HuggingFace

MIT

aiogram

3.5.0

Клиент Telegram Bot API (асинхронный)

MIT

aiohttp / requests / httpx

HTTP-клиенты (асинхронный, синхронный, тестовый)

Apache 2.0 / Apache 2.0 / BSD-3-Clause

structlog

24.1.0

Структурированное логирование

Apache 2.0 / MIT

prometheus-client

0.20.0

Экспонирование метрик /metrics

Apache 2.0

orjson

3.10.18

Высокопроизводительная JSON-сериализация

Apache 2.0 / MIT

python-multipart

0.0.9

Парсинг multipart-загрузок

Apache 2.0

python-dotenv

1.0.1

Загрузка переменных окружения

BSD-3-Clause

MCP

1.0.0

Реализация протокола Model Context Protocol

MIT

5.2. Библиотеки обработки документов

Библиотека

Назначение

pypdf ≥ 5.7.0

Извлечение текста из PDF

docx2txt ≥ 0.9

Извлечение текста из DOCX

openpyxl ≥ 3.1.5

Чтение/запись XLSX

beautifulsoup4 ≥ 4.12

Парсинг HTML/XML

lxml ≥ 5.2.0

Быстрый парсер XML/HTML

Pillow ≥ 10.0

Обработка изображений (предобработка перед OCR)

nltk ≥ 3.8.1

Токенизация и сегментация естественного языка

5.3. Библиотеки ИИ-стека

Компонент

Технология

Применение

Векторизатор (embedder)

sentence-transformers (опц.) / встроенный клиент эмбеддингов

Преобразование текста в плотные векторы 1024-d

Векторное хранилище

qdrant-client ≥ 1.9.0

Поиск по плотным векторам, BM25, RRF

Локальный инференс LLM

Ollama Runtime (REST API)

Запуск GGUF-моделей (YandexGPT-5-Lite, Llama, Mistral, Qwen, Phi)

Внешние LLM API

backend.llm_client (универсальный адаптер)

OpenAI-совместимые HTTP API, YaLLM, корпоративные шлюзы

Кластер LLM-узлов

backend.ollama_cluster

Балансировка между несколькими экземплярами Ollama

5.4. Frontend-стек
  • Vanilla JavaScript (ES6+) — без UI-фреймворков; модульная архитектура SPA.
  • vitest ≥ 1.6.0 — фреймворк модульного тестирования (dev-зависимость).
  • @testing-library/dom, @testing-library/user-event, jsdom — тестирование DOM и пользовательских сценариев.


6. Модели машинного обучения и ИИ
6.1. Модели эмбеддингов
Основная модель эмбеддингов:
  • Идентификатор: deepvk/USER-bge-m3 (репозиторий Hugging Face Hub).
  • Тип: Sentence Transformer (BGE-M3-семейство), оптимизирован для русского языка.
  • Размерность векторов: 1024.
  • Поддержка длинного контекста: до 8192 токенов.
  • Лицензия: Apache 2.0 (модель), MIT (библиотека).
  • Развёртывание: возможна локальная загрузка модели в контейнер; кэш моделей монтируется как volume ./data/hf:/root/.cache/huggingface.
Альтернативные модели (поддерживаются конфигурацией): intfloat/multilingual-e5-large, sentence-transformers/paraphrase-multilingual-mpnet-base-v2, любая модель Sentence Transformers с совместимой размерностью.
6.2. Большие языковые модели (LLM)
Модель по умолчанию: Vikhrmodels/Vikhr-YandexGPT-5-Lite-8B-it (8 млрд параметров, инструктивная версия, GGUF-формат, размер ≈ 4,5 ГБ).
Дополнительно поддерживаются (через Ollama Runtime или совместимый API):

Модель

Параметров

Размер

Лицензия

yandex/YandexGPT-5-Lite-8B-instruct-GGUF

8B

≈ 4,5 ГБ

YandexGPT License (оценить применимость)

mistral:7b-instruct

7B

≈ 4,1 ГБ

Apache 2.0

llama3.1:8b-instruct

8B

≈ 4,9 ГБ

Meta Llama 3.1 Community License

qwen2.5:14b-instruct

14B

≈ 8,6 ГБ

Qwen License (Tongyi)

phi3:mini-instruct

3.8B

≈ 2,7 ГБ

MIT

gemma2:9b-instruct

9B

≈ 5,4 ГБ

Gemma Terms of Use

Перед коммерческим использованием каждой модели правообладатель проверяет совместимость её лицензии с внутренними политиками заказчика и требованиями российского законодательства. Все указанные модели запускаются локально на сервере заказчика (on-premise) либо в собственной инфраструктуре правообладателя на территории Российской Федерации; передача данных пользователей иностранным провайдерам в стандартной поставке отключена.
6.3. Модели поиска и переранжирования
  • Гибридный поиск: формула Reciprocal Rank Fusion (RRF) с константой k = 60. Результаты dense-поиска (косинусное расстояние, top-50) и BM25-поиска (top-50) объединяются в единый ранжированный список (top-10 по итогу).
  • Опциональный реранкер на базе cross-encoder (ms-marco-MiniLM-L-12-v2 или его русскоязычный аналог) — переоценка top-N результатов с учётом полного текста запроса и фрагмента.

7. Конвейер RAG (Retrieval-Augmented Generation)
7.1. Этап 1. Сбор и приём знаний
  1. Загрузка документов через административную панель (форматы PDF, DOCX, DOC, TXT, XLSX, XLS, HTML, JSON, CSV, XML).
  2. Автоматический обход сайта (web-краулер) с учётом robots.txt, поддержкой JavaScript-рендеринга через опциональный Playwright и дедупликацией URL.
  3. Импорт пар «вопрос — ответ» (Q&A) — ручной ввод, импорт CSV.
  4. Получение писем по IMAP и обращений из Bitrix24 — сообщения автоматически могут пополнять базу знаний (если включено правилами проекта).
7.2. Этап 2. Извлечение и нормализация текста
Каждый документ обрабатывается соответствующим лоадером: pypdf для PDF, docx2txt для DOCX, openpyxl для XLSX, BeautifulSoup для HTML. Текст очищается от служебной разметки, нормализуется кодировка (нормализация в NFC/NFKC), удаляются повторяющиеся элементы (шапки, навигация). Результат — очищенный плоский текст и сохранённый исходный файл в GridFS.
7.3. Этап 3. Сегментация и эмбеддинг
Очищенный текст сегментируется на смысловые фрагменты заданной длины (по умолчанию — параграфы или окна по 800 символов с перекрытием 200). Каждый фрагмент пропускается через модель эмбеддингов (deepvk/USER-bge-m3) и преобразуется в вектор размерности 1024. Векторы сохраняются в Qdrant вместе с payload-полями (project, source, document_id, fragment_index, text-фрагмент-сниппет).
7.4. Этап 4. Гибридный поиск (Retrieval)
При поступлении запроса пользователя:
  1. Запрос векторизуется тем же эмбеддером.
  2. В Qdrant параллельно выполняется dense-поиск (top-50) по косинусной близости и BM25-поиск (top-50) по полнотекстовому индексу.
  3. Результаты объединяются по формуле RRF: score(d) = Σ 1/(k + rank_i(d)) для каждого источника-метода (k = 60).
  4. Опционально: top-20 кандидатов передаются в cross-encoder реранкер для уточнения релевантности.
  5. Финальный список (top-10) передаётся в этап генерации.
Результаты поиска кэшируются в Redis по ключу sha1(project + query) с TTL 24 часа, что снижает нагрузку при повторяющихся запросах.
7.5. Этап 5. Формирование промпта и генерация
Из найденных фрагментов формируется контекст (по умолчанию — 3 наиболее релевантных, ≈ 300 символов каждый), который вместе с исходным вопросом и системным шаблоном проекта подаётся в выбранную LLM (Ollama, model-service или внешний шлюз). Системный шаблон проекта задаётся администратором в разделе Projects и определяет тон, стиль, обязательные инструкции (например, отвечать только по корпоративным данным, цитировать источники, отказывать в случае отсутствия информации).
7.6. Этап 6. Стриминг ответа
Ответ возвращается пользователю в режиме потоковой передачи Server-Sent Events (SSE) через эндпойнт GET /api/v1/chat. Это обеспечивает мгновенную обратную связь и совместимо с веб-виджетами и нативными ботами. По завершении генерации к ответу прикрепляется список источников (Citation) с прямыми ссылками на исходные документы либо страницы сайта.
7.7. Этап 7. Постобработка и обратная связь
  • Безопасностный фильтр (safety/filter.py) проверяет ответ на наличие чувствительных паттернов (прежде всего — нежелательные медицинские рекомендации, сомнительные дозировки) и при необходимости подменяет ответ на безопасный шаблон.
  • Пользователь может оценить ответ (👍/👎) через эндпойнт POST /api/v1/feedback; оценки агрегируются для последующего улучшения базы знаний и промптов.
  • Запросы, на которые система не нашла релевантного ответа, фиксируются в коллекции unanswered и доступны администратору для дополнения базы знаний.

8. Подсистемы и сервисы
8.1. Подсистема обработки документов
Реализована в packages/knowledge. Включает: лоадеры по форматам, очиститель текста, генератор кратких описаний (на базе LLM), Celery-задачи фоновой переиндексации, сервис автоматического обогащения метаданных (knowledge_service).
8.2. Подсистема веб-краулинга
Реализована в packages/crawler. Поддерживает: ограничение глубины и количества страниц, белый/чёрный список путей, дедупликацию по нормализованному URL и хешу содержимого, инкрементальный обход (crawl-since), отчёты о прогрессе через Redis. Управляется через эндпойнты /api/v1/crawler/run, /status, /reset, /stop, /deduplicate.
8.3. Подсистема диалогов
Реализована в apps/api/main.py (модуль llm) и в виджете /widget. Поддерживает: сессии (session_id в query), хранение контекста диалога в Redis с TTL, передачу истории сообщений в промпт LLM (последние N сообщений, настраивается параметром проекта), переадресацию оператору (Operator Mode).
8.4. Подсистема голосового ввода и обучения голоса
Реализована в apps/api/main.py (модуль voice) и в Celery-задачах apps/worker. Позволяет загружать голосовые образцы (POST /api/v1/voice/samples), запускать обучение голосовой модели (POST /api/v1/voice/train), отслеживать статус задач (/voice/status, /voice/jobs).
8.5. Подсистема резервного копирования
Реализована в packages/utils/backup. Использует mongodump для создания архивов MongoDB, поддерживает локальное хранение и выгрузку на Яндекс.Диск (через REST API). Расписание управляется Celery beat (по умолчанию проверка каждые 300 с, фактическое создание архива — по cron-расписанию, заданному в backup_settings). Эндпойнты: GET /backup/status, POST /backup/run, POST /backup/restore, POST /backup/settings.
8.6. Подсистема наблюдаемости
  • Структурированное логирование structlog в формате JSON с уровнями DEBUG/INFO/WARNING/ERROR.
  • Метрики Prometheus: request_count (Counter, метки method, path), error_count (Counter, метка path), latency_ms (Histogram). Экспозиция — /metrics.
  • Healthchecks: GET /healthz, GET /health (быстрые), внутренние проверки lifespan для MongoDB/Redis/Qdrant/Ollama.
  • Журнал последних событий доступен администратору через GET /api/v1/admin/logs; статистика запросов — через /api/v1/admin/stats/requests с экспортом CSV.
8.7. Подсистема интеграций

Канал

Протокол

Модуль

Telegram

Bot API (HTTPS, long-polling/webhook)

tg_bot/

ВКонтакте

VK API + Long Poll

vk_bot/

MAX

Web API

max_bot/

Bitrix24

REST webhooks (двусторонний)

integrations/bitrix.py + connectors/bitrix24

Электронная почта

IMAP (входящие) + SMTP (исходящие)

integrations/mail.py + connectors/email

Web-виджет

HTTPS + SSE (text/event-stream)

widget/

MCP-серверы

Model Context Protocol (JSON-RPC over stdio/HTTP)

connectors/


9. Аутентификация и разграничение доступа
9.1. Модель доступа
Реализована парольная аутентификация на основе HTTP Basic + сессий. Все маршруты /admin (UI) и /api/v1/admin/* (API) защищены ASGI-middleware BasicAuthMiddleware (apps/admin/main.py). Открытые маршруты (/api/v1/chat, /api/v1/llm, /api/v1/feedback, /widget, /metrics при ограничении сетью) аутентификации не требуют — это публичные точки входа для конечных пользователей.
9.2. Уровни доступа

Роль

Тип учётной записи

Полномочия

Суперадминистратор

Глобальный — задаётся через ADMIN_USERNAME / ADMIN_PASSWORD в .env

Все разделы, все проекты, управление учётными записями, конфигурация LLM-кластера и системные настройки

Администратор проекта

Локальная учётная запись (Project.admin_password_hash, SHA-256)

Все разделы в рамках одного проекта

Редактор базы знаний

На базе административной учётной записи проекта с ограничением разрешений

Загрузка/редактирование документов, Q&A, запуск краулера

Оператор

Учётная запись оператора (operator_users)

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

Конечный пользователь

Анонимный сеанс / идентификатор мессенджера

Доступ только к публичному API (виджет, бот)

9.3. Хранение паролей
Пароли локальных учётных записей хранятся в коллекции projects (поле admin_password_hash) в виде хеша SHA-256 (в дальнейшем планируется миграция на bcrypt/argon2). Сравнение выполняется HMAC-безопасным методом (hmac.compare_digest), что исключает утечку информации через тайминговые атаки.
9.4. Сессии и завершение работы
Сессия администратора создаётся после успешной аутентификации и действительна до явного выхода (POST /api/v1/admin/logout) или истечения таймаута. Бэкап-токены, токены ботов и API-ключи хранятся в зашифрованном виде на уровне приложения; передача учётных данных между компонентами — через переменные окружения и приватную сеть Docker.

10. Безопасность и защита от прикладных рисков
10.1. Валидация входных данных
Все REST-эндпойнты используют Pydantic-модели для валидации входных параметров; неподходящие запросы отбрасываются с возвратом HTTP 422 (Unprocessable Entity). Загружаемые файлы проверяются по MIME-типу и размеру (лимит — 50 МБ по умолчанию, настраивается).
10.2. Фильтр промпт-инъекций и небезопасных ответов
Модуль safety/filter.py выполняет эвристическую проверку запросов и ответов: список запрещённых ключевых слов (включая медицинские рекомендации с указанием конкретных дозировок и наименований препаратов), регулярные выражения на типовые шаблоны попыток обхода системного промпта. При срабатывании фильтра ответ заменяется на безопасный шаблон, инцидент фиксируется в логах.
10.3. Транспортная безопасность
  • Поддержка TLS 1.2/1.3 средствами Uvicorn (переменные APP_ENABLE_TLS, APP_SSL_CERT, APP_SSL_KEY).
  • Альтернатива — обратный прокси Caddy с автоматическим выпуском сертификатов Let's Encrypt (настраивается scripts/bootstrap.sh при указании домена).
  • Внутренний трафик — в приватной сети Docker bridge; внешний — только через явно проброшенные порты.
10.4. CORS
Конфигурация Cross-Origin Resource Sharing управляется переменной CORS_ORIGINS (.env). По умолчанию разрешены все источники (для удобства разработки), в production-конфигурациях обязательно ограничивается перечнем доменов заказчика.
10.5. Аудит и журналирование
  • Все аутентификационные события (успех/неудача), действия с конфигурацией, операции загрузки/удаления документов, запуска краулера и резервного копирования логируются с указанием subject (учётная запись), action, object, timestamp, ip-адрес.
  • Журналы доступны через GET /api/v1/admin/logs и могут экспортироваться во внешние SIEM-системы по syslog/JSON.
10.6. Соответствие требованиям персональных данных
ПО разворачивается на инфраструктуре заказчика и не отправляет данные пользователей за пределы периметра без явного согласия. При использовании внешних LLM-API администратор обязан убедиться в наличии локализованного шлюза (например, размещённого в РФ) и заключённых соглашениях об обработке данных. По умолчанию рекомендуется конфигурация on-premise на отечественной инфраструктуре.

11. Развёртывание, контейнеризация и инфраструктура
11.1. Контейнеризация
Используется Docker Compose v2.20+. Каждый компонент (FastAPI-приложение, Celery worker, Celery beat, Telegram-bot) собирается из общего Dockerfile с использованием многоэтапной сборки (multi-stage build):
  • Этап build: образ python:3.10-slim, установка системных пакетов (build-essential, git, cmake, ninja-build, pkg-config, libopenblas-dev, python3-dev), разрешение зависимостей менеджером uv, копирование исходного кода, прекомпиляция в байт-код (python -m compileall).
  • Этап runtime: минимальный набор пакетов (libopenblas0-pthread, curl, ca-certificates, MongoDB Database Tools), копирование готового байт-кода и виртуального окружения из этапа build.
  • Кэши APT, UV и Hugging Face используются для ускорения повторных сборок.
11.2. Системные требования

Параметр

Минимум

Рекомендуется

CPU

4 ядра, AVX2

8+ ядер

RAM

16 ГБ

32+ ГБ (при использовании моделей > 8B)

Диск

20 ГБ

100+ ГБ SSD

GPU (опц.)

NVIDIA с поддержкой CUDA 11.8+ (для ускорения эмбеддингов и LLM)

ОС

Linux (Ubuntu 22.04+)

Linux (Ubuntu 22.04 LTS / Astra Linux 1.7 / RED OS 7.3+)

Docker Engine

24.0

26.x

Docker Compose

2.20

2.27+

11.3. Лимиты ресурсов на контейнеры

Сервис

Память (limit)

Память (reservation)

app (FastAPI)

8 ГБ

2 ГБ

celery_worker

4 ГБ

1 ГБ

celery_beat

512 МБ

256 МБ

telegram-bot

1 ГБ

256 МБ

mongo

по умолчанию хост-системы

qdrant

по умолчанию хост-системы

ollama

зависит от модели

11.4. Скрипты автоматизации
  • scripts/bootstrap.sh — установка Docker Engine, Docker Compose, настройка systemd-сервиса, опциональный Caddy-прокси, генерация .env, первичный запуск.
  • deploy_project.sh — обновление существующего развертывания (git pull → docker compose build → docker compose up).
  • deploy_project.ps1 — аналог для Windows-сред.
  • scripts/healthcheck.sh — внешний скрипт мониторинга, проверяет TLS и доступность API.
  • scripts/benchmark.py — нагрузочный бенчмарк p50/p95-латентности.
11.5. Масштабируемость
  • Горизонтальное масштабирование сервиса app — путём запуска нескольких экземпляров за обратным прокси (Caddy/nginx).
  • Несколько Celery worker — добавляются простой репликой контейнера.
  • Кластеризация Ollama — поддержана в backend/ollama_cluster.py: автоматическая балансировка между несколькими нодами, мониторинг здоровья, fail-over.
  • Шардирование Qdrant — выполняется на уровне коллекций (по проектам).


12. Отнесение ПО к программному обеспечению в сфере искусственного интеллекта
12.1. Применённые методы и алгоритмы ИИ
В составе ПО реализованы следующие технологии искусственного интеллекта:
  • Глубокое обучение — нейросетевые модели на архитектуре Transformer применяются для построения векторных представлений текстов (модель deepvk/USER-bge-m3) и для генерации ответов (модели Vikhr-YandexGPT, Llama 3.1, Mistral, Qwen и иные совместимые большие языковые модели).
  • Обработка естественного языка (NLP) — токенизация, нормализация, сегментация текстов, ответ на вопросы (Question Answering) на естественном языке.
  • Информационный поиск с применением машинного обучения — гибридный поиск, объединяющий нейросетевой dense-поиск и алгоритмический BM25 через формулу RRF; опциональное переранжирование cross-encoder.
  • Генеративные модели — Retrieval-Augmented Generation: генерация осмысленного, контекстно-зависимого текста на основе извлечённых фрагментов знаний.
  • Распознавание речи (Speech Recognition) — опциональная функциональность, реализуемая через интеграцию с внешними или встроенными моделями ASR (Whisper-совместимыми).
12.2. Соответствие классификатору Минцифры
ПО соответствует следующим разделам Классификатора программ для электронных вычислительных машин и баз данных, утверждённого Приказом Минкомсвязи / Минцифры РФ от 22.09.2020 № 486 (в действующей редакции):

Код

Наименование

Связь с функциональностью «Ассистент ПРО»

04.06

Средства разработки программного обеспечения на нейротехнологиях и искусственном интеллекте (NLP, обработка речи, компьютерное зрение)

Базовая платформа для построения интеллектуальных ассистентов на основе NLP

05.09

Диалоговые роботы (чат-боты, голосовые ассистенты)

Готовое решение для диалогового взаимодействия в каналах Telegram, ВКонтакте, MAX, веб-виджет

07.xx

Лингвистическое программное обеспечение

Эмбеддинги, токенизация, обработка русского языка

11.04

Интеллектуальный анализ данных

Семантическая индексация и анализ корпоративных корпусов знаний

12.3. Обоснование статуса проекта в сфере ИИ
Программное обеспечение реализует полноценный цикл ИИ-обработки: от сбора данных и обучаемой векторизации текстов до генерации ответов с помощью больших языковых моделей. Качество работы измеряется типичными для систем искусственного интеллекта метриками: recall@k, точность ответа (по экспертной оценке и оценкам пользователей), доля «галлюцинаций» (нерелевантных или вымышленных утверждений), средняя длина и связность ответов. Все эти признаки соответствуют критериям отнесения ПО к категории искусственного интеллекта в понимании ПП РФ № 1236 и приказов Минцифры.

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

Компонент

Лицензия

Совместимость с проприетарным распространением

FastAPI / Uvicorn / Pydantic

MIT / BSD-3-Clause / MIT

Совместимы

LangChain / langchain-community

MIT

Совместимы

Sentence Transformers

Apache 2.0

Совместимы

Qdrant

Apache 2.0

Совместимы

Redis

BSD 3-Clause (≤ 7.2) / RSALv2 (≥ 7.4)

Для коммерческого использования рекомендуется зафиксировать версию ≤ 7.2 либо использовать форк Valkey

MongoDB Community

SSPL

Совместима при условии распространения как сервис заказчика; в проприетарной поставке учитывать ограничения SSPL

Ollama

MIT

Совместима

Celery

BSD-3-Clause

Совместима

aiogram

MIT

Совместима

pypdf / docx2txt / openpyxl

BSD-3-Clause / MIT / MIT

Совместимы

Все используемые библиотеки и модели — это компоненты, исходные тексты которых опубликованы в общедоступных репозиториях; их применение не создаёт зависимости от иностранных правообладателей в части эксплуатации (отсутствует обязательное обращение к зарубежным сервисам).

14. Тестирование и обеспечение качества
14.1. Уровни тестирования

Уровень

Инструмент

Покрытие

Модульное (backend)

pytest ≥ 8.4.1

≈ 48 файлов тестов, > 100 тест-кейсов

Интеграционное (backend)

pytest + httpx

ASGI-клиент, проверка эндпойнтов

Модульное (frontend)

vitest ≥ 1.6.0

Тесты SPA-админки и виджета

Нагрузочное

scripts/benchmark.py

p50/p95-латентность; гейт CI: p95 < 4000 мс

Линтинг

Ruff ≥ 0.12.1

Все Python-файлы

14.2. CI/CD
Используются GitHub Actions (.github/workflows/ci.yml) и GitLab CI (на серверах правообладателя — office1.mmvs.ru:8929). Pipeline включает: установку зависимостей через uv, запуск Ruff, запуск pytest -q, бенчмарк с регрессионным гейтом по p95-латентности.

15. Каталог исходного кода
Дерево проекта верхнего уровня (фрагмент):
sitellm_vertebro/
├── apps/
│   ├── admin/            # FastAPI-приложение, админ-панель (~6,4 тыс. строк)
│   │   ├── main.py
│   │   └── index.html
│   ├── api/              # Публичные роутеры (~2,7 тыс. строк)
│   │   └── main.py
│   └── worker/           # Celery worker
│       └── main.py
├── packages/
│   ├── backend/          # settings, llm_client, ollama, ollama_cluster, prompt, cache, model_service
│   ├── core/             # mongo, models, settings, status, vectors, build, textnorm
│   ├── crawler/          # run_crawl.py + Celery-задачи
│   ├── retrieval/        # hybrid search, rerank, embedder
│   ├── knowledge/        # извлечение текста, summary, авто-описание
│   ├── knowledge_service/# фоновый сервис обогащения эмбеддингов
│   ├── utils/            # observability (logging, metrics), backup
│   └── common/           # shared schemas + services
├── connectors/           # MCP-серверы (bitrix24, email)
├── integrations/         # bitrix.py, mail.py (legacy слой)
├── tg_bot/, vk_bot/, max_bot/   # клиенты мессенджеров
├── widget/               # встраиваемый чат-виджет
├── safety/               # фильтр запрещённых паттернов
├── scripts/              # bootstrap, deploy, healthcheck, benchmarks
├── tests/                # pytest, ≈ 48 файлов
├── docs/                 # Sphinx + Markdown (architecture, workflows)
├── compose.yaml          # основная конфигурация Docker Compose
├── Dockerfile            # multi-stage сборка backend
├── pyproject.toml        # манифест Python-проекта
└── uv.lock               # детерминированные версии зависимостей
Документ содержит сведения, достаточные для проведения экспертной проверки в порядке, установленном Постановлением Правительства Российской Федерации от 16 ноября 2015 г. № 1236 «Об установлении запрета на допуск программного обеспечения, происходящего из иностранных государств, для целей осуществления закупок для обеспечения государственных и муниципальных нужд» (в действующей редакции).

Made on
Tilda