Сидоров Данил
RU EN DE
Telegram

ИИ-консультант по базе знаний: виджет и Telegram-бот

Отвечает клиентам по прайсу и FAQ, показывает источник ответа, честно говорит «не знаю» и передаёт вопрос менеджеру

AI / Чат-боты Стек: Python, FastAPI, PostgreSQL, pgvector, ONNX Runtime, transformers.js, aiogram, GigaChat ⚡ 10 из 10 вопросов FAQ с верным источником, 3 из 3 вне базы — «не знаю» Безопасный контур (NDA): боевая логика на тестовых данных

Живой интерактивный демо-стенд

Точная копия интерфейса и бизнес-логики проекта с демонстрационными данными. Все действия работают в реальном времени.

💡 Что протестировать в стенде:
  1. 1 Спросите про доставку или торт и раскройте источник под ответом
  2. 2 Задайте вопрос не по теме и включите «Как ищется ответ», чтобы увидеть, почему он отказался
  3. 3 Позовите менеджера и посмотрите, какое сообщение он получил бы в Telegram
kolosok.example/
Live Stand
Реализация под ключ

Нужна похожая система под ваши бизнес-процессы?

Разработаю архитектуру, отказоустойчивый бэкенд и быстрый интерфейс. Защита соглашением о неразглашении (NDA), чистый передаваемый код и прозрачные этапы.

  • Бесплатная оценка сроков и бюджета в течение дня
  • Стек: Python, FastAPI, PostgreSQL, pgvector, ONNX Runtime, transformers.js, aiogram, GigaChat
  • Гарантия и поддержка после запуска
Обсудить проект в Telegram Оставить заявку на сайте Отвечу лично, без навязчивых продаж

Задача

Компании хотят консультанта, который отвечает клиентам на сайте и в Telegram по их прайсу и частым вопросам. Он не должен выдумывать цены и условия, должен показывать, откуда взят ответ, а на вопрос вне базы честно звать менеджера. Данные клиентов должны оставаться у компании, а демо — открываться без регистрации и ничего не стоить.

Решение

Одна модель эмбеддингов, multilingual-e5-small в int8, работает и на сервере через onnxruntime, и в браузере через transformers.js, поэтому оба режима находят одни и те же фрагменты. Ответ — сам фрагмент или текст модели, написанный только по нему. Если лучший фрагмент не проходит порог по смыслу и по словам, консультант отказывается и предлагает менеджера. Заявка сначала сохраняется в базе, потом уходит в Telegram, поэтому сбой Telegram её не теряет.

Решённые задачи

  • Собрал гибридный поиск: локальная модель e5 в PostgreSQL с pgvector и совпадение слов с весом по редкости
  • Подобрал пороги «не знаю» на 21 вопросе: из FAQ, вне базы и пограничных
  • Подключил GigaChat и OpenAI-совместимые модели за одним интерфейсом, ответ пишется только по фрагментам
  • Сделал заявку менеджеру: имя, телефон, вопрос и вся переписка приходят в Telegram
  • Дал посетителю загрузить свой текст или PDF и спросить по нему, файл живёт только в сессии
  • Ограничил демо: 10 вопросов в сутки с посетителя, дневной бюджет токенов и очередь вызовов модели
  • Сделал виджет, который ставится на сайт одной строкой, и Telegram-бот на том же движке
  • Сделал режим браузера на transformers.js с той же моделью: поиск может идти прямо на устройстве посетителя
  • Сделал демо-режим: анкета менеджера проходит до конца, но заявка только показывается, имена и телефоны не хранятся

Результат

Приёмочный смоук на настоящей модели: 10 из 10 вопросов из FAQ находят свой фрагмент, 3 из 3 вопросов не по теме получают «не знаю». Проект поднимается командой docker compose up, а демо на этом сайте — тот же контейнер в демо-режиме: отвечает сразу, а заявку показывает вместо отправки.

Комментарий разработчика

Сидоров Данил
Сидоров Данил Разработчик проекта

Что было трудно

Сложнее всего было научить его отказываться. Одно сходство e5 не отделяло вопросы вне базы: «Почём медовик?» набирал 0.802, а «Сколько стоит ремонт iPhone 15?» — 0.812. Помогла вторая оценка, по словам с весом по редкости: «стоит» есть во многих фрагментах прайса и почти ничего не весит.

Что далось легко

Легко далась заявка менеджеру: короткая анкета с проверкой телефона и сообщение в Telegram со всей перепиской.

Технологии

PythonFastAPIPostgreSQLpgvectorONNX Runtimemultilingual-e5transformers.jsaiogramGigaChatDocker

Источники

Ссылки подтверждают цифры в кейсе

Расскажите о задаче

Telegram