Документационный чат-бот на локальной LLM. Этот проект представляет Telegram-бота, который отвечает на вопросы по PDF-документации брендов (например, Daichi, Dantex), используя локальную LLM модель и FAISS-индексацию.
project_folder/
│
├── data/ # Папка для хранения документов и промежуточных данных
│ └── documents/ # Документы для парсинга (например, PDF)
│ └── indexes/ # Подготовка индексов для различных брендовс помощью функции build_index,
│ # используя документы в папке data/documents
│
├── src/ # Исходный код
│ ├── __init__.py # Инициализация пакета
│ ├── main.py # Основной исполнимый скрипт
│ ├── parser.py # Скрипт для парсинга документов (например, PDF)
│ ├── vectorizer.py # Скрипт для векторизации текста с помощью модели Sentence-BERT
│ ├── faiss_index.py # Скрипт для работы с FAISS для хранения и поиска векторных представлений
│ ├── telegram_bot.py # Скрипт для реализации Telegram-бота
│ ├── llm_integration.py # Скрипт для интеграции с локальным API (LLM)
│ └── utils.py # Утилиты, например, для конфигурации или логирования
│
├── requirements.txt # Файл зависимостей
├── README.md # Документация проекта
└── config.yaml # Конфигурационные файлы (например, для API ключей)
## Установка
1. Клонируйте репозиторий:
```bash
git clone <repository-url>
cd project_folder
-
Установите зависимости:
pip install -r requirements.txt
-
Локальный запуск
1.Убедитесь, что у вас есть .pdf файлы в папке data/docs.
2.Постройте индексы, раскомментировав блок в main.py:
brands = { "Daichi": "daichi.pdf", "Dantex": "dantex.pdf"}
for brand, filename in tqdm(brands.items()):
parser.build_index(brand, f"data/docs/{filename}", output_dir="data/index")
3. Установите зависимости из requirements.txt.
4.Запустите:
python main.py
Представляет собой основной исполнимый скрипт, который выполняет следующие действия:
- Подготовка окружения: Подавление предупреждений от библиотек, таких как PyTorch и OpenMP. Настройка переменной окружения для устранения ошибок с MKL.
- Построение индексов (закомментировано):
Необходимо выплнить пр первом запускеПодготовка индексов для различных брендов (например, Daichi, Dantex) с помощью функции build_index, используя документы в папке data/documents. - Запуск Telegram-бота: Запускает Telegram-бота, который взаимодействует с пользователем и отвечает на вопросы.
- Загрузка индекса и текстов: Загружается текст и индекс для выбранного бренда, например Dantex, из файлов, сохраненных в папке data/indexes.
- Пример запроса: Выполняется пример запроса, например, на тему «Как включить продув испарителя на сплите Dantex RK-24SVGI?» и выводится ответ, полученный через функцию get_llm_answer.
- Запуск Telegram-бота (закомментировано): Есть возможность запустить Telegram-бота, который взаимодействует с пользователем и отвечает на вопросы.
- Python 3.x: Основной язык программирования для разработки проекта.
- Sentence-BERT: Модель для векторизации текста, использующая трансформеры для создания эмбеддингов предложений.
- FAISS: Библиотека для эффективного поиска по векторным данным.
- Telegram Bot API: Для создания и взаимодействия с Telegram-ботом.
- PyTorch: Для работы с нейронными сетями и моделями, основанными на трансформерах.
- Hugging Face Transformers: Для работы с предобученными моделями на основе архитектуры трансформеров в
llm_integration.py(если предполагается, что используется эта библиотека для нейронной сети). - PDFMiner или PyPDF2 (в зависимости от реализации): Для извлечения текста из PDF-документов.
- Scikit-learn: Для обработки и манипуляции данными, включая векторизацию.
- pandas, numpy: Для работы с данными и вычислений.
Скрипт llm_integration.py использует локально развернутую модель OpenHermes для обработки запросов. Модель обучена для работы с текстами и может генерировать ответы на вопросы, используя векторные представления документов. Вот как работает интеграция:
- Загрузка модели: Модель и токенизатор загружаются с локального пути, что позволяет работать без необходимости обращения к удалённым серверам. Модель использует архитектуру трансформеров и поддерживает выполнение на GPU, если он доступен.
- Обработка запросов: Когда поступает запрос, система сначала извлекает релевантные фрагменты из индекса FAISS, который был создан на основе векторных представлений текста. Затем на основе этих фрагментов формируется контекст, который передается в модель для генерации ответа.
- Генерация ответов: Модель генерирует ответ, основываясь на переданном контексте и запросе, используя форматированную строку запроса, которая включает контекст и сам вопрос.
- PyTorch: Для работы с нейронными сетями.
- Transformers от Hugging Faceh: Для загрузки и использования модели OpenHermes.
- FAISS: Для поиска релевантных фрагментов текста, которые используются в качестве контекста для модели.
-
Запуск бота: Когда пользователь запускает бота через команду /start, бот выводит клавиатуру с двумя вариантами брендов: Daichi и Dantex. Пользователь выбирает один из брендов для дальнейшего общения.
-
Выбор бренда: После выбора бренда, бот сохраняет состояние пользователя, чтобы запомнить выбранный бренд. Затем бот предлагает пользователю задать вопрос о выбранном бренде.
-
Задание вопроса: После того как пользователь задает вопрос, бот проверяет, был ли выбран бренд. Если бренд не выбран, бот напоминает пользователю выбрать бренд сначала.
-
Ответ на вопрос: Если бренд выбран, бот загружает текст и индекс, связанные с выбранным брендом (например, файлы text_{brand}.pkl и index_{brand}.faiss), использует FAISS для поиска релевантных текстов и передает их в нейронную сеть для генерации ответа. Ответ от модели отправляется пользователю в чате.
Важные моменты:
-
Состояние пользователя: Для каждого чата сохраняется состояние, что позволяет отслеживать выбор бренда и корректно обрабатывать запросы пользователя.
-
FAISS: Для быстрого поиска релевантных фрагментов текста используется индекс FAISS, который работает с векторными представлениями текста.
-
Модель для генерации ответов: Для формирования ответов на вопросы используется функция get_llm_answer, которая извлекает текст из индекса и передает его в модель.
Кодовые блоки:
-
start_bot: Стартовая функция, которая предлагает выбрать бренд.
-
choose_brand: Обработка выбора бренда и переход к следующему этапу.
-
ask_question: Обработка введенного вопроса, извлечение релевантных текстов с помощью FAISS, передача их в модель для генерации ответа и отправка этого ответа пользователю.
👤 Пользователь: /start
🤖 Бот: Про какой бренд вы хотите задать вопрос?
[ Daichi ]
[ Dantex ]
👤 Пользователь нажимает: Dantex
🤖 Бот: Теперь задайте ваш вопрос.
👤 Пользователь: Как включить продув испарителя?
🤖 Бот: Для включения продува испарителя на Dantex сделайте следующее...
Этот процесс делает взаимодействие с ботом простым и эффективным для получения ответов на вопросы о продукции.