Изоляция данных между арендаторами
Каждый арендатор получает строгий ключ партиционирования ClientId, применяемый на каждом уровне хранения. Реляционные таблицы и наши коллекции векторного поиска привязаны к ClientId с фильтрами уровня строк и уровня коллекций, применяемыми на уровне запросов. Паттерн репозитория отклоняет любой запрос без ClientId на этапе компиляции через правило статического анализатора. Проекты отслеживания ошибок, журналы аудита и blob-контейнеры - все сохраняют ту же дисциплину партиционирования. Межарендаторские данные - структурная невозможность, а не проверка во время выполнения.
Конвейер извлечения RAG
Приём → фрагментация → векторизация → upsert: документы (PDF, DOCX, извлечённый HTML, пары вопрос-ответ FAQ) разбиваются на фрагменты по 200-500 токенов с перекрытием в 50 токенов. Фрагменты векторизуются через нашу модель эмбеддингов (векторы размерности 1536) и записываются в наш индекс векторного поиска с метаданными (ClientId, sourceUrl, chunkIndex). Путь запроса: вопрос векторизуется, выполняется поиск top-K по косинусному сходству с фильтрацией по ClientId, порог ScoreThreshold по умолчанию 0.5. Извлечённые фрагменты передаются в LLM со структурированными метаданными цитирования, так что ответ содержит Snippet для каждого источника. Сверка выполняется еженощно как фоновая служба Worker (BackgroundService).
Абстракция LLM-провайдера
Все вызовы LLM идут через ILlmProvider - тонкую абстракцию над несколькими провайдерами языковых моделей (основной провайдер и альтернатива уровня Enterprise для резервирования). Выбор провайдера для каждого арендатора задаётся конфигурацией; при превышении лимита запросов или ошибке 5xx трафик автоматически переключается на резервный маршрут. Использование токенов и стоимость сообщаются по каждому вызову в теле ответа - арендаторы могут отслеживать расходы в реальном времени. Смена провайдера не требует миграции на стороне клиента - абстракция изолирует прикладной код.
Паттерн адаптера каналов
Каждый канал (веб-виджет, Telegram, WhatsApp Business, Instagram DM, электронная почта) реализует IChannelAdapter - общий контракт, транслирующий нативные для канала конверты сообщений в единую доменную модель Conversation. Паттерн адаптера позволяет основному конвейеру запросов работать независимо от канала; форматирование под конкретный канал (inline-клавиатуры Telegram, шаблонные сообщения WhatsApp) находится внутри адаптера. Добавление канала не затрагивает конвейер запросов.
Конвейер потоковых ответов
Потоковая передача на основе SSE через эндпоинт /v1/query/ask-stream. Первое событие - sources-early - отправляет метаданные цитирования до начала потоковой передачи ответа LLM (виджеты рендерят всплывающие карточки «по данным», пока ответ ещё стримится). Последующие события - фрагменты токенов; финальное событие - done с агрегированными метаданными (всего токенов, общая стоимость, ID журнала разговора). Сокращает воспринимаемую задержку примерно на 70% по сравнению с синхронным ответом.
Поток данных субпроцессоров
Запрос клиента → входящий трафик по TLS → наш слой API → вызов векторизации к нашему провайдеру модели (США, SCC 2021/914) → векторный поиск в нашем поисковом движке → вызов LLM к нашему провайдеру языковой модели с извлечёнными фрагментами → ответ обратно через слой API → SSE обратно к виджету. Провайдер мониторинга ошибок получает очищенные конверты ошибок (PII вычищается до отправки). Провайдер транзакционной почты обрабатывает транзакционную электронную почту (США, SCC 2021/914). Провайдер CDN и защиты периметра обеспечивает WAF и CDN глобально на границе сети. Субпроцессоры по категориям - на /ru/sub-processors/; полный список с названиями поставщиков предоставляется по запросу - под NDA или в составе нашего соглашения об обработке данных (DPA).
Топология развёртывания
Полностью управляемая облачная платформа запускает публичный API, маркетинговый сайт, платформу администрирования и вертикальные хабы как отдельно масштабируемые службы. Управляемая реляционная база данных держит реляционное хранилище с ежедневным резервным копированием и восстановлением на момент времени в пределах 24 часов. Наш движок векторного поиска работает с коллекциями для каждого арендатора. Управляемый кэш в памяти обслуживает сессии и корзину токенов для ограничения запросов. Объектное хранилище держит blob-объекты документов. Провайдер CDN и защиты периметра стоит впереди для WAF / защиты от DDoS / CDN. Рабочие процессы CI запускают продакшн-развёртывания при слиянии в релизную ветку.
Готовность к аварийному восстановлению
RTO 4 часа, RPO 1 час. Ежедневные резервные копии управляемой базы данных с хранением 35 дней; восстановление на момент времени в пределах последних 24 часов. Наш движок векторного поиска снимается в снапшоты еженощно в объектное хранилище. Многорегиональное переключение при отказе для высокой доступности. Регламент аварийного восстановления тестируется ежеквартально с имитацией отказа региона. Страница статуса на status.slatech.ai показывает аптайм в реальном времени + журнал инцидентов за последние 90 дней.
Конвейер оценки
Ответы, построенные на найденном содержании, оцениваются вторым вызовом модели. LLM-as-Judge оценивает фактологичность, галлюцинации и уверенность по каждому ответу. Агрегированные оценки по каждой вертикали выводятся на публичное табло на /ru/eval/. Регрессии оценки на ≥3 пункта запускают оповещение о ручной сортировке. Сам оценочный набор - открытый и доступен для скачивания как воспроизводимый шаблон - покупатели могут запустить его против своего арендатора SLAtech.
Стек наблюдаемости
Мониторинг ошибок на каждом бэкенд-сервисе с очисткой PII до отправки. Мониторинг синтетических транзакций с периодичностью 5 минут. Инструментированные OpenTelemetry участки трассировки для таймингов конвейера запросов. Журнал аудита для каждого арендатора, экспортируемый на тарифе Enterprise. status.slatech.ai опрашивает 12 боевых компонентов и показывает, отвечает ли каждый из них.