README.md

Клиент для Telegram использующий LLM для создания подборки уникальных сообщений за день

Основная утилита проекта td-filter собирает все сообщения по заданным каналам Telegram на которые подписан пользователь за текущий день на момент вызова. Для каждого сообщения рассчитывается embedding вектор с помощью модели bert, если сообщение больше заданного размера производится его обобщение с использованием модели llama2 до необходимой длины. На основании заданного порогового значения сообщения с похожими embedding векторами признаются одинаковыми. Утилита выводит по возможности только уникальны сообщения без повторений из разных каналов.

Утилита bert-quantize используется в скриптах для преобразования больших моделей bert.

Утилита sts-example демонстрирует пример использования bert для расчета и сравнения embedding векторов на основе анализа набора данных для задачи Semantic Textual Similarity.

Утилита summary демонстрирует пример создания обобщения(создания краткого содержания) для произвольного файла с текстом.

Проект использует:

  1. библиотеку llama.cpp для преобразования длинных сообщений в короткие

  2. преобразованную версию библиотеки bert.cpp для создания embeddings сообщений

  3. библиотеку ICU для реализации tokenizer с поддержкой русского для bert

  4. библиотеку dlib для работы с векторами

  5. библиотеку TDLib для взаимодействия с Telegram

Модели

Для работы с русским языком используйте русскоязычные модели, несмотря на то что исходные LLM могли тренироваться на разных языках есть проблемы со словарями и tokenizers.

Модели llama2 доступные сразу в формате gguf(не требуют преобразования):

  1. Англоязычная - TheBloke/Llama-2-7B

  2. Русскоязычная - 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 и т.д.

  1. Создаем образ Docker:
cd docker
docker build --force-rm -t tddevenv:1.0 .
  1. Потом просто запускаем контейнер и даем ему доступ к коду проекта:
cd ..
docker run --gpus all -it -v .:/llama-td-analyzer tddevenv:1.0 bash
  1. В контейнере запускаем скрипт build_deps что бы собрать все сторонние зависимости

  2. И в конце для настройки 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 подписок

Конвейеры
0 успешных
0 с ошибкой