Клиент для Telegram использующий LLM для создания подборки уникальных сообщений за день
Основная утилита проекта td-filter
собирает все сообщения по заданным каналам Telegram на которые подписан пользователь за текущий день на момент вызова. Для каждого сообщения рассчитывается embedding вектор с помощью модели bert
, если сообщение больше заданного размера производится его обобщение с использованием модели llama2
до необходимой длины. На основании заданного порогового значения сообщения с похожими embedding векторами признаются одинаковыми. Утилита выводит по возможности только уникальны сообщения без повторений из разных каналов.
Утилита bert-quantize
используется в скриптах для преобразования больших моделей bert.
Утилита sts-example
демонстрирует пример использования bert для расчета и сравнения embedding векторов на основе анализа набора данных для задачи Semantic Textual Similarity.
Утилита summary
демонстрирует пример создания обобщения(создания краткого содержания) для произвольного файла с текстом.
Проект использует:
-
библиотеку
llama.cpp
для преобразования длинных сообщений в короткие -
преобразованную версию библиотеки
bert.cpp
для создания embeddings сообщений -
библиотеку
ICU
для реализации tokenizer с поддержкой русского для bert -
библиотеку
dlib
для работы с векторами -
библиотеку
TDLib
для взаимодействия с Telegram
Модели
Для работы с русским языком используйте русскоязычные модели, несмотря на то что исходные LLM могли тренироваться на разных языках есть проблемы со словарями и tokenizers.
Модели llama2 доступные сразу в формате gguf
(не требуют преобразования):
-
Англоязычная - TheBloke/Llama-2-7B
-
Русскоязычная - IlyaGusev/saiga2_7B
Модели для bert надо скачивать и преобразовывать используя скрипты get_model.sh
из директорий models/bert
или models/rubert
. Это связано с тем что библиотека bert.cpp
обновляется не регулярно и не совместима с последней версией ggml
. В проекте находится ее адаптированная версия.
Для русскоязычного варианта будет скачана модель Sentence RuBERT
Для англоязычного варианта будет скачана модель sentence-transformers/multi-qa-MiniLM-L6-cos-v1
Настройка окружения для разработки
llama.cpp
и ggml
соответственно умеют использовать CUDA, это существенно ускоряет работу даже на локальном компьютере. Я рекомендую использовать образы Docker от NVidia для разработки что бы без проблем работать с разными версиями PyTorch, CUDA и т.д.
- Создаем образ Docker:
cd docker
docker build --force-rm -t tddevenv:1.0 .
- Потом просто запускаем контейнер и даем ему доступ к коду проекта:
cd ..
docker run --gpus all -it -v .:/llama-td-analyzer tddevenv:1.0 bash
-
В контейнере запускаем скрипт
build_deps
что бы собрать все сторонние зависимости -
И в конце для настройки CMake используем
CMAKE_PREFIX_PATH=/llama_dev/libs
что наши зависимости были видны
Настройка td-filter
Утилита td-filter
запускается следующим образом:
./td-filter config.yaml
где config.yaml
должен выглядеть следующим образом:
llama_model_path : "/llama_dev/models/saiga-13b-q4_K.gguf"
bert_model_path : "/llama_dev/models/rubert/ruBert-base/ggml-model-q4_0.bin"
lang : "ru"
words_predict : 50
channels :
- Название канала 1
- Название канала 2
- Название канала 3
Первые два параметра llama_model_path
и bert_model_path
указывают на расположение файлов моделей. Параметр lang
определяет язык для работы, это важно для tokenizer и для постановки задачи для llama. Параметр words_predict
указывает желаемую длину обобщения текста(на самом деле это просто рекомендация, тексты выходят разной длины). И последний параметр channels
это список названий каналов из которых вы хотите загрузить сообщения. Так же в при первом запуске вам будет предложено авторизоваться в Telegram.
Описание
Применение языковых моделей для анализа telegram подписок