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». Долго, дорого, а через год обнаруживается, что значительная часть кода — это «клей» для переезда между моделями, который никто не хочет поддерживать.
Taris — это третий путь: продуктизованная база (диспетчер моделей, гибридный RAG, мультитенантный Postgres, адаптеры каналов), которую мы внедряем под клиента и оставляем клиенту. Это не SaaS и не «соберём с нуля», а полуготовый продукт с понятным путём адаптации.
2. Кого это касается
- SMB-команды на 10–500 человек, у которых уже накоплены документы, регламенты, истории клиентов, но нет специалистов по AI.
- Регулируемые ниши (здравоохранение, охрана труда, юр-консалтинг), где фраза «данные ушли в OpenAI» может означать штраф.
- Стартапы, которым нужна одна общая база ассистентов для нескольких внутренних use-case-ов.
3. Распространённый неправильный подход
Что мы часто видим в «пилотах», начатых до нашего прихода:
- Подключили один 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 / OpenRouter]
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, OpenRouter, Ollama, llama.cpp. Маршрутизация задаётся в YAML:
default: openrouter:openai/gpt-4o-mini
routes:
- match: { task: rerank }
use: ollama:bge-reranker-base
- 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, по умолчанию
text-embedding-3-small, для on-prembge-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 / 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-аудит процессов. Если хотите попробовать Taris, есть AI-пилот на 4–8 недель с фиксированным объёмом работ. Объём и стоимость согласуем после вводного звонка (см. пакеты).
Если хотите сначала почитать, посмотрите 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
- Внутренняя KB SINTARIS: Taris, Worksafety Superassistant, OpenClaw architecture, Architecture patterns § 1, § 4.
Sintaris делает AI-аудиты процессов, AI-пилоты и внедрения Taris для SMB в EU. Вводный звонок на 30 минут бесплатный.