техника
Как устроен агент внутри
Что придётся описать руками, что произойдёт само и что сломается, если пропустить шаг.
Telegram Business как канал
Агент подключается к вашему существующему аккаунту поддержки и не заводит нового бота. Клиенты пишут туда же, куда писали всегда, история остаётся на месте, ответ уходит от вашего аккаунта. Всё подключение это одно разрешение в настройках Telegram Business, после которого у агента появляется связка с вашим чатом владельца. Туда и будут падать карточки суфлёра.
Знать об этом стоит заранее, потому что карточки придут туда же, где вы читаете переписку. Панель у продукта есть, она нужна для настроек и разбора, а ежедневная работа всё равно идёт в Телеге.
Коннектор описан манифестом
Чтобы подключить нового клиента, движок трогать не нужно, всё описывается данными. Вы перечисляете набор ручек, у каждой помечено, чтение это или действие, и сказано, какие поля она принимает. Позвать ручку, которой в описании нет, агент не может, и дело тут не в проверке поверх запроса. Такой возможности у него просто нет.
Отказ приходит до похода в сеть. Если у вашего моста действия нет, политика откажет сразу и не станет отправлять запрос и ждать таймаута. Иначе клиент платил бы секундами ожидания за поход, исход которого известен заранее.
Снапшот описан ролями
Внутри движка нет ни слова про VPN, гигабайты, курсы или размеры кроссовок. Там живут роли. Величина с итогом и остатком, помеха, которая чинится действием, следы использования, свежесть данных. Ваш словарь статусов приезжает данными из анкеты подключения, и писать под вас код никому не приходится.
Практическое следствие простое. Не заполнили словарь, и агент честно теряет соответствующие наблюдения, но не гадает. Зато движку не нужно знать ваш бизнес поимённо, и подключение следующего клиента не превращается в правку кода в четырёх местах.
База знаний ищет двумя способами
Поиск гибридный. Векторный по смыслу плюс полнотекстовый по словам. Порознь у каждого свой устойчивый класс промахов. Вектор мажет на кодах ошибок и точных названиях тарифов, полнотекст на пересказе вроде «интернет тупит». Вместе они закрывают промахи друг друга.
Результаты сливаются по занятым местам, а не по оценкам, потому что косинусная близость и полнотекстовый ранг живут в несравнимых шкалах. Любые веса поверх них пришлось бы подбирать заново после каждого пополнения базы.
Пополняется база на лету. Присылаете гайд файлом или ссылкой, он режется на карточки по структуре документа и встаёт черновиками. В выдачу поиска карточка идёт только после вашей публикации, потому что присланный файл уходит в промпт и оттуда в ответ клиенту, и решать, что туда попадёт, должен человек.
Две модели, каждая под свои задачи
Классификация и обычные ответы идут на дешёвой модели, действия, скриншоты, конфликты и второй заход на сильной. На одно обращение приходится не больше двух дорогих вызовов и жёсткий потолок токенов сверху. Это часть устройства, подкрутить её настройкой нельзя.
Когда источник не отвечает
Здесь всё решено заранее. Ваш API молчит, агент честно говорит клиенту, что смотрит, пробует ещё раз, а потом отдаёт обращение вам с пометкой, каких данных не хватило. Автопилот в этот момент запрещён, даже если рубильник типа включён. Отвечать без данных он не станет.
Вы ответили раньше агента, черновик отменяется. Клиент сменил тему по обращению, которое уже ведёт человек, и под новую тему заводится отдельное обращение, а старое остаётся на месте.
Массовость считается по потоку обращений
Волну фильтрации или деградацию пути ваш серверный мониторинг не видит вовсе, серверы здоровы и панель зелёная. Для такого класса аварий поток обращений остаётся единственным доступным сенсором.
Детектор сравнивает число обращений одного типа с обычным для этого часа, требует и относительного превышения, и абсолютного пола, и держит режим ещё некоторое время после последнего обращения. Без последнего он мигал бы. Одному совет, следующему «случай не единичный», первый вернулся, снова совет. А люди сравнивают ответы в одном чате.
Стек и эксплуатация
Python 3.12, aiogram 3, PostgreSQL 16 с pgvector, SQLAlchemy 2 в асинхронном режиме, миграции Alembic, Docker. Панель владельца и бот живут одним процессом, своего рантайма у панели нет, поэтому смена токена коннектора доходит до агента той же секундой и не ждёт, пока протухнет кэш.