7 месяцев назад История
    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 с ошибкой