Локальный ИИ-ассистент прямо в мессенджере HalChat: без серверов, без рисков, только приватность и RAG.
Введение
Я занимаюсь разработкой собственного мессенджера HalChat и недавно я запустил систему локальных ИИ, с которыми можно общаться прямо в браузере через обычный чат.
И мне потребовался ИИ помощник, который бы вводил в курс дела внутри экосистемы и помогал пользователям обосноваться. Назвал я его — Halwashka AI.
Почему бы не использовать готовые решения?
Во первых, это приватность, главный принцип HalChat — это сохранность ваших данных, значит ваши сообщения не должны расшифровываться, и передаваться ИИ.
Во вторых, хотелось бы продемонстрировать пользователям сами локальные ИИ, чтобы могли начать пользоваться и другими локальными ИИ, выбрав их на HalNetMarket.
Проблема
Сейчас существует огромное количество разных ИИ моделей, но все они обучены на многосторонних данных. Переобучать их не имеет смысла, из-за огромных погрешностей и возможность повредить модель, нужный результат таким образом очень сложно получить. Один из главных вариантов решения, я выбрал:
RAG (Retrieval-Augmented Generation) — это метод, который объединяет два этапа:
Retrieval (поиск): ИИ ищет релевантные данные из внешней базы (например, документы, файлы, базы знаний).
Generation (генерация): ИИ использует найденные данные для формирования ответа, не обучаясь на них.
Архитектура

Принцип работы
Этап 0:
Пользователь заходит в чат. Плагин загружается и загружает ИИ модель (скачивает, либо из кэша). Сообщение от бота показывает процент загрузки. Когда модель загрузится он изменит сообщение на модель загружена.
Этап 1:
Пользователь отправляет сообщение "Привет! Что такое HalChat?". Оно передаётся к HalSM плагину. После, плагин передаёт запрос с промптом и списком файлов для RAG и др. параметрами в LocalLLMHalSM.js
Этап 2:
LocalLLMHalSM.js преобразовывает HalSM переменные в javascript (temp, top_k, system_prompt и т.д.).
Загружает RAG хранилище по предоставленным ссылкам, запускает маленькую модель для поиска топ-3 подходящих контекста (находит что такое HalChat или похожие на то что написал пользователь). Превращает в пользовательское сообщение, как контекст.
Этап 3:
LocalLLMHalSM.js создаёт потоковый чат с LLM моделью с историей сообщений и указанными параметрами. На каждый загруженный токен срабатывает эвент и плагин обновляет локально сообщение.
Этап 4:
ИИ закончил и срабатывает итоговое событие и плагин обновляет сообщения на сервере.
Практическое применение
Общение с ИИ помощником и проводником по экосистеме HalNet.
Базовая техподдержка и возможность вызвать ручную техподдержку.
Недостатки
Самый главный минус — это производительность, пока что на данный момент генерация одного ответа занимает от 2-х до 4-х минут, и это почти не зависит от мощности вашего устройства, ведь он уходит в один поток.
Мало знаний — это маленькая модель, так что она не может позволить себе поддерживать полноценный информативный диалог и давать советы, вне знаний RAG хранилища.
Перспективы
Улучшение производительности, за счёт многопоточности и перехода на Web-LLM.
Интеграция в экосистему, и автоматизация чатов, и анализ чатов для пользователя.
Полноценный помощник с возможностью живого общения.
Реализация
Я добавил новый файл HalChatRAG.js, где будет находиться система RAG. Сделана она на базе библиотеке transformers.js и модели Xenova/all-mpnet-base-v2.
Также обновил код LocalLLMHalSM.js для взаимодействия с RAG. А именно добавил отображение RAG как сообщение от пользователя, чтобы он его воспринимал как контекст.
И написал ИИ-плагин на HalSM, где уже прописан промпт и взаимодействие с пользователем, и ещё вызов техподдержки, если он не знает ответа, или пользователь сам запросил, в таком случае он приглашает в чат меня. Для этого пользователю появляется окошко с предложением пригласить пользователя (для безопасности и согласованности действия).
Модель: https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct
Библиотеки:
https://github.com/ngxson/wllama
https://huggingface.co/docs/transformers.js/en/index
Код: https://github.com/halwarsing/Halwashka-AI1

Демо
Создаём чат с ИИ, дожидаемся загрузки модели, и пишем наши запросы. Получаем ответы)

Итог
У меня получилось реализовать — локального ИИ помощника, с загрузкой дополнительной информации без переобучения модели. Это создаёт потенциал и для поиска в интернете благодаря RAG системе.
Жду ваших вопросов связанной с этой статьёй, так и про мою экосистему и язык программирования HalSM.