Исходный код ИИ-ассистента на Node.JS. Часть 2
В прошлой статье мы с вами установили всё то, что нам пригодится при разработке ИИ-ассистента, который сможет отвечать на ваши вопросы или вопросы пользователей. В этой статье - код...
Предисловие
Пет-проект, который было решено свернуть, а результаты работы в виде абсолютно рабочего решения опубликовать под MIT лицензией. Скачать архив проекта можно по этой ссылке (Яндекс.Диск).
Используемые технологии:
- NodeJS;
- VueJS;
- Vuetify;
- RabbitMQ;
- ElasticSearch;
- MySQL 8;
- Transformers.js;
- Puppeteer;
- Socket.IO;
- ONNX Runtime;
Хотите запустить коммерческий проект в срок и бюджет? Топовая команда по разработке и 40+ человек на аутстафе у вас под рукой. Дайте знать.
Структура
Проект состоит из 3 модулей:
- Backend;
- Frontend;
- Виджет;
Зависимости на frontend:
Зависимости на backend:
Зависимости виджета:
Frontend
Frontend представляет собой SPA-приложение (Single Page Application), которое посредством HTTP-запросов получает данные с сервера. Вся real-time коммуникация и обмен данными происходят по WebSocket, например, работа чата и смена статусов ИИ-ассистента.
Инициация SPA-приложения осуществляется в файле main.js:
Ключевая строка в этом файле:
После вызова метода init() происходит проверка авторизации пользователя, установка websocket-соединения с сервером и прослушивание / обработка событий.
Код авторизации при установке соединения:
Если авторизация прошла успешно, то данные пользователя в локальном Pinia-хранилище обновляются и отображаются на странице:
Затем vue-router определяет загружаемые компоненты согласно описаным маршрутам:
... и затем уже каждый загружаемый компонент делает запрос к REST API для получения актуальных данных - списков ассистентов, проиндексированных страниц и пр.
Весь frontend и виджет упаковывается в минимальное количество файлов и сжимается. В итоге получается следующая структура директории после сборки:
Сгенерированный виджет затем в виде кода вставляется на произвольный сайт в head-тег.
Backend
Все запросы, приходящие на backend могут быть двух типов - пассивные (я их так называю, это обычные REST API запросы) и активные (запросы по websocket).
index.js на стороне nodejs. выглядит следующим образом:
Нас больше интересуют действия и события, которые бегают по websocket:
И ещё точнее, вот эти действия:
... которые взаимодействуют с "модулем" ИИ.
Заглянем глубже в ключевой метод - SendMessages.js. Контроллер состоит из 3 методов - подготовки, валидации и обработки данных.
Метод валидации достаточно прост:
Метод обработки прост и понятен:
Все сообщения пользователя оказываются в очереди на обработку, а метод, который отвечает за обработку (consumer события) навешивается в файле bootstrap.js при загрузке приложения:
Переходим в AIManager.response метод и смотрим на исходный код:
В этом блоке выполняется одно из основных действий - поиск релевантной информации в базе знаний, динамическое формирование промпта для ChatGPT на основе настроек из личного кабинета, а так же корректная подача всей истории переписки с пользователем для сохранения контекста диалога.
Как факультативное задание для вас - изучить исходный код и разобраться с тем, как работает добавление информации в базу знаний, как простраиваются и сохраняются эмбеддинги и как осуществляется обработка пользовательского запроса. 🙌
Надеюсь, что junior-пет-проект послужит кому-то хорошим стартом.
У меня команда, предлагаем услуги аутсорса и аутстаффа в сфере IT - 40+ опытных разработчиков, тестировщиков, аналитиков, готовых помочь с реализацией проекта любой сложности.
Работаем удаленно над небольшими задачами, и в комплексе внедряем крупные системы.
Если вам нужны профессионалы в сфере веб, мобильной разработки, тестирования ПО, BIG DATA и пр. - обращайтесь.
Ваш, Разработчик в бизнесе 👨🏻💻