Разработка омниканального AI-чат-бота (все мессенджеры + сайт)
Омниканальный бот — единое ядро AI с адаптерами для каждого канала. Клиент начинает диалог в Telegram, продолжает на сайте — история и контекст сохранены. Один раз обученная модель, одна база знаний, одна аналитика.
Архитектура омниканальной системы
[Telegram] [WhatsApp] [VK] [Viber] [Web Widget] [Instagram]
↓ ↓ ↓ ↓ ↓ ↓
[Channel Adapters — нормализация форматов сообщений]
↓
[Unified Message Router]
↓
[Core AI Engine]
├── Intent Recognition
├── Context Manager (Redis: user_id → conversation_state)
├── RAG / Knowledge Base
├── Tool Executor (CRM, ERP, DB)
└── Response Generator
↓
[Channel Adapters — форматирование под канал]
↓
[Telegram] [WhatsApp] [VK] ...
Нормализация сообщений
Разные каналы имеют разные форматы. Unified Message Format:
class UnifiedMessage:
channel: str # "telegram", "whatsapp", "vk", "web"
user_id: str # глобальный ID (channel:original_id)
text: str | None
media: list[MediaItem] | None
timestamp: datetime
metadata: dict # channel-specific данные
Адаптер каждого канала конвертирует входящее в UnifiedMessage и ответ обратно в channel-native формат.
Унификация идентификаторов пользователей
Пользователь в Telegram (@username) и в WhatsApp (+7...) — это один человек? Без явной связки — нет. Стратегии объединения профилей:
- Авторизация через единый аккаунт (сайт) → линкование мессенджеров
- Запрос номера телефона через Telegram (API) → матчинг с WhatsApp
- Email-верификация → единый профиль
Управление контекстом диалога
Redis хранит состояние диалога с TTL = 24 часа:
import redis
import json
class ConversationContextManager:
def __init__(self):
self.redis = redis.Redis(decode_responses=True)
def get_context(self, user_id: str) -> dict:
data = self.redis.get(f"ctx:{user_id}")
return json.loads(data) if data else {"history": [], "profile": {}}
def update_context(self, user_id: str, update: dict):
ctx = self.get_context(user_id)
ctx.update(update)
ctx["history"] = ctx["history"][-20:] # последние 20 сообщений
self.redis.setex(f"ctx:{user_id}", 86400, json.dumps(ctx))
Форматирование под канал
Одно «внутреннее» сообщение бота → разные представления:
| Элемент | Telegram | VK | Web | |
|---|---|---|---|---|
| Жирный текст | **текст** |
*текст* |
<b>текст</b> |
Markdown |
| Кнопки | InlineKeyboard | Quick Replies | Keyboard | Custom UI |
| Изображение | photo | image | photo | img tag |
| Список | Текст с • | Текст с - | Текст | <ul> |
Ответ форматируется адаптером уже после генерации AI.
Единая аналитика
Омниканальная платформа даёт сквозную аналитику:
- Канальный mix: откуда приходят пользователи
- Cross-channel journey: Telegram → сайт → конверсия
- Containment rate по каналам: где бот справляется лучше
- Перетекание между каналами: пользователь переключился — почему?
Стек: ClickHouse для событийной аналитики, Grafana для real-time дашбордов, Superset для бизнес-отчётов.
Масштабирование
Омниканальный бот под нагрузку:
- Горизонтальное масштабирование Core AI Engine (stateless + Redis)
- Message Queue (Kafka / RabbitMQ) между адаптерами и ядром — для пиковой нагрузки
- Rate limiting по каналу и пользователю
- Graceful degradation: при недоступности AI → шаблонные ответы + escalation
Governance и контент-политика
Единая политика допустимого контента применяется ко всем каналам. Один prompt injection guard, одна система мониторинга токсичности. Изменение системного промпта — в одном месте, разворачивается на все каналы.
Сроки реализации
Месяц 1–2: Core AI Engine, первый канал (Telegram), базовый context management
Месяц 3: Добавление 2–3 каналов (WhatsApp, VK, Web), unified analytics
Месяц 4–5: Интеграции с CRM/системами, agent handoff, advanced персонализация
Месяц 6: Нагрузочное тестирование, мониторинг, промышленный запуск







