Taris: AI-ассистент, где данные остаются у клиента
Taris: AI-ассистент, где данные остаются у клиента
TL;DR. Taris — это AI-ассистент, у которого данные клиента не уходят к вендору. Базовая позиция: модель — это плагин за стабильным интерфейсом, а не центр архитектуры. Внутри — vendor-neutral диспетчер LLM, гибридный RAG (BM25 + dense + RRF + cross-encoder rerank), мультитенантный Postgres с pgvector, опционально локальные модели через Ollama. Эта статья — про то, как Taris устроен, почему он так устроен, и где это даёт выигрыш для SMB в EU и СНГ.
1. Конфликт: «возьмём GPT-4 — и забудем»
Когда руководитель малого бизнеса спрашивает «какой AI-ассистент нам поставить», ему обычно отвечают одной из двух крайностей:
- «Берите ChatGPT / Copilot Studio / Microsoft 365 — там уже всё». Удобно, но: данные уходят к вендору, кастомизация ограничена, цена непрозрачно растёт, переход на другую платформу — это переезд.
- «Соберём вам с нуля на LangChain». Долго, дорого, через год обнаруживается, что 60% кода — это переезд между моделями, который никто не любит.
Taris — это третий путь: продуктизованная база (диспетчер моделей, гибридный RAG, мультитенантный Postgres, адаптеры каналов), которую мы внедряем под клиента и оставляем клиенту. Не SaaS. Не «соберём с нуля». Полу-продукт, который понятно адаптировать.
2. Кому это касается
- SMB-командам 10–500 человек, у которых уже накоплены документы, регламенты, истории клиентов — но нет специалистов по AI.
- Регулируемым нишам (здравоохранение, охрана труда, юр-консалтинг) — там, где «данные уходят в OpenAI» = «штраф».
- Компаниям из СНГ с EU-присутствием: им нужно одно решение для двух юрисдикций.
- Стартапам, которым нужна одна общая база ассистентов для нескольких внутренних use-case-ов.
3. Распространённый неправильный подход
Что мы видим в 70% «пилотов», начатых до нас:
- Подключили один API. Когда вендор поднял цены — никто не готов мигрировать.
- Скармливают всё в один большой prompt. Lost-in-the-middle бьёт (см. Liu et al., 2023) — модель «забывает» середину.
- Сделали RAG только на embeddings — точные коды и идентификаторы не находятся.
- Нет eval-сета. Невозможно сказать, лучше ли стало после очередного «улучшения промпта».
- Документы клиента лежат в чьём-то облаке без DPA. Юридический ревью отложен.
4. Инженерный подход: что внутри Taris
Архитектура — четыре независимых слоя:
flowchart LR
subgraph Channels[Каналы]
TG[Telegram Bot]
WEB[Web UI / PWA]
VOICE[Голос]
API[REST API]
end
subgraph Core[Ядро]
GW[FastAPI Gateway]
ORCH[Оркестратор агентов]
DISP[LLM Dispatcher]
KB[KB Service]
AUTH[Auth + RBAC]
end
subgraph Storage[Хранилище]
PG[(Postgres + pgvector)]
OBJ[(MinIO / S3)]
LOG[(Audit log)]
end
subgraph Models[Модели]
LOCAL[Ollama / llama.cpp]
CLOUD[OpenAI / Anthropic / Gemini / YandexGPT]
end
TG --> GW
WEB --> GW
VOICE --> GW
API --> GW
GW --> AUTH --> ORCH
ORCH --> KB --> PG
ORCH --> DISP
DISP --> LOCAL
DISP --> CLOUD
ORCH --> LOG
Каждый слой заменяем. Это — ключевая точка. Каналы — это адаптеры. Модель — это плагин. Хранилище — это бэкенд. Оркестратор — это единственное место, где живёт бизнес-логика. Если завтра OpenAI поднимет цены втрое, Taris-инсталляция переключается одним конфиг-файлом.
4.1. LLM Dispatcher
class LLMProvider(Protocol):
async def complete(
self,
messages: list[ChatMessage],
*,
max_tokens: int,
temperature: float,
tools: list[Tool] | None = None,
) -> ChatCompletion: ...
Семь конкретных провайдеров: OpenAI, Anthropic, Gemini, YandexGPT, OpenRouter, Ollama, llama.cpp. Маршрутизация — через YAML:
default: openrouter:openai/gpt-4o-mini
routes:
- match: { task: rerank }
use: ollama:bge-reranker-base
- match: { task: summary, locale: ru }
use: yandexgpt:latest
- match: { sensitive: true }
use: ollama:llama3.1:8b
fallback:
- openrouter:anthropic/claude-3-5-sonnet
- ollama:llama3.1:8b
4.2. Гибридный RAG с RRF
Извлечение — в три проходных стадии:
- Lexical (BM25) — Postgres FTS с language-aware analyzer для RU/EN/DE/SL.
- Dense — pgvector cosine, default
text-embedding-3-small, для on-prem —bge-m3. - Metadata boost — точное совпадение по тегам (
product,section,last_updated).
Слияние — Reciprocal Rank Fusion:
$$ \text{score}(d) = \sum_{i \in \text{retrievers}} \frac{1}{k + \text{rank}_i(d)}, \quad k = 60 $$
Затем cross-encoder rerank (bge-reranker-base) до top-5. Эмпирический выигрыш на нашем внутреннем golden-сете охраны труда: recall@5 0.71 → 0.88 (RRF vs pure dense), grounding-rate +0.07 после rerank. Это не «слегка лучше», это разница между «можно использовать» и «вернуть деньги клиенту».
4.3. Мультитенантный Postgres с RLS
CREATE POLICY tenant_isolation ON chunks
USING (tenant_id = current_setting('app.tenant_id')::int);
Каждое соединение перед запросом делает SET app.tenant_id = $1. Невозможно случайно прочитать данные другого клиента: на это ругается сама БД.
5. Диаграмма + таблица: какие компоненты заменяемы
| Слой | По умолчанию | Альтернатива | Стоимость переключения |
|---|---|---|---|
| Embedding | text-embedding-3-small |
bge-m3 |
конфиг + переиндексация |
| Reranker | bge-reranker-base |
mxbai-rerank |
конфиг |
| Vector store | pgvector | Qdrant | docker-compose + миграция |
| LLM | gpt-4o-mini |
claude-3-5-sonnet, llama3.1:8b |
конфиг |
| Канал | Telegram | Web / VK / Slack / WhatsApp | адаптер ~200 строк |
| Хранилище файлов | MinIO | S3 / Nextcloud | конфиг |
| Деплой | Docker Compose | Kubernetes / Nomad | манифесты |
6. Sintaris mini-case
Продукт Worksafety Superassistant — пример Taris в реальном деплое. Задача:
- Внутренний ассистент по регламентам безопасности (~3000 PDF-страниц).
- Чат-бот в Telegram для работников производства (RU + DE).
- Полный on-prem (требование DPO).
Техническая реализация (см. Worksafety Superassistant KB и OpenClaw architecture KB):
- Taris в конфигурации OpenClaw, два сервера: основной (Ubuntu 24.04, 64GB RAM, RTX 4090) + бэкап.
- Embedding:
bge-m3, генерация:llama3.1:8b-instruct(для RU/DE — достаточно), fallbackqwen2.5:14b. - Telegram-bot развёрнут с локальным NAT — никакого облака.
- Golden-сет: 120 вопросов с эталонными цитированиями.
Метрики через 90 дней:
- Recall@5: 0.86 на golden-сете.
- Citation accuracy: 92%.
- Median latency: 1.9 сек.
- Стоимость LLM: 0 EUR (всё локально).
- Стоимость инфры: ~120 EUR/мес на электричество + амортизацию.
Подробности — Worksafety § 6 RAG pipeline и OpenClaw § 8 AI dispatch.
7. Чек-лист (15 пунктов) при выборе AI-ассистента для SMB
- Vendor lock-in проверен: можете ли вы за неделю сменить LLM-провайдера?
- Данные клиента — где физически хранятся документы?
- Эмбеддинги — где хранятся? (часто забывают: они тоже PII-производные)
- DPA подписан с каждым LLM-провайдером, который вы используете.
- Eval-сет — есть ли он, и сколько в нём вопросов?
- Цитирование — генерирует ли система ссылки на источники?
- Грундинг-rate — измерен ли он? (если нет — значит, никто не знает, врёт модель или нет)
- Тестируется ли регрессия retrieval после каждого изменения промпта?
- Multi-tenant безопасность — RLS на уровне БД, не "договариваемся в коде"?
- Локальные модели доступны — есть ли план B, если облако упало?
- Цена за токен — мониторится ли в реальном времени?
- DSAR + erasure — реализованы ли как код, а не как ручная процедура?
- Audit log — есть, иммутабельный, нужного срока хранения?
- Каналы — добавление нового канала это <500 строк или переписывание ядра?
- Документация — на каком языке, для кого, как часто обновляется?
8. Риски
- Соблазн frontier-моделей. Команда привыкает к Sonnet-у, потом клиент требует on-prem — приходится переучивать систему на 8B. Решение: с первого дня тестировать на 8B, использовать frontier только там, где доказали выигрыш.
- Сложность диспетчера. Чем больше провайдеров поддерживаешь, тем больше edge-case-ов. У нас правило: новый провайдер появляется только после клиента, который его требует.
- Эмбеддинги ≠ переносимы. При смене embedding-модели нужно переиндексировать. Закладывайте время.
- Multilingual quality.
bge-m3хорош в EU и RU, но в DE/SL качество ниже, чем в EN. Проверяйте на своём golden-сете.
9. Что делать дальше
Если у вас уже есть AI-ассистент и его пора менять — мы делаем AI-Audit за €900–4500. Если хотите попробовать Taris — есть AI-Pilot на 4–8 недель за €3000–12000 с фиксированным scope. Скидка −25% для словенских компаний с 1 по 30 июня 2026 — см. пакеты.
Если хотите сначала почитать — посмотрите KB-главы Taris (полное описание) и OpenClaw (on-prem топология).
10. Источники
- Lewis, P. et al. (2020). Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks. arXiv:2005.11401.
- Karpukhin, V. et al. (2020). Dense Passage Retrieval for Open-Domain Question Answering. arXiv:2004.04906.
- Cormack, G., Clarke, C., Buettcher, S. (2009). Reciprocal Rank Fusion outperforms Condorcet and individual rank learning methods. SIGIR '09.
- Liu, N. F. et al. (2023). Lost in the Middle: How Language Models Use Long Contexts. arXiv:2307.03172.
- BAAI (2024). BGE-M3: One-stop multi-lingual, multi-functionality, multi-granularity text embeddings.
- pgvector — https://github.com/pgvector/pgvector
- Ollama — https://ollama.com
- Stack Overflow Developer Survey 2025.
- Внутренняя KB SINTARIS: Taris, Worksafety Superassistant, OpenClaw architecture, Architecture patterns § 1, § 4.
Sintaris делает AI-аудиты процессов, AI-пилоты и внедрения Taris для SMB в EU и СНГ. Дискавери-звонок — бесплатно, 30 минут.