Skip to content

Savier/zb-test

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Climat-RAG Telegram Бот

RAG (Retrieval-Augmented Generation) система для ответов на вопросы по документации климатического оборудования через Telegram бота.

Возможности

  • Обработка документов: Скачивает и обрабатывает PDF документы по URL
  • Векторный поиск: Использует Qdrant для семантического поиска по фрагментам документов
  • Кэширование: Кэширование на Redis для улучшения производительности
  • Интеграция с Telegram: Удобный интерфейс бота с командами
  • Локальные модели: Использует sentence-transformers для эмбеддингов (без внешних API)

Архитектура

  • Telegram Бот: Обрабатывает взаимодействие с пользователями и сообщения
  • RAG Сервис: Основная логика для поиска документов и генерации ответов
  • Search Boost Сервис: Повышение релевантности результатов поиска через keyword boosting
  • Процессор документов: Скачивание PDF, извлечение текста и разбиение на фрагменты
  • Сервис кэша: Кэширование на Redis для результатов запросов
  • Векторное хранилище: Qdrant для хранения и поиска по эмбеддингам документов

Установка

Предварительные требования

  • Docker и Docker Compose
  • Make (для команд сборки)

Настройка окружения

Скопируйте файл sample.env в .env и настройте переменные:

cp sample.env .env

Затем отредактируйте .env файл и установите ваши значения:

Важно: Получите токен Telegram бота от @BotFather и установите его в переменную TELEGRAM_TOKEN.

# Конфигурация Telegram Бота
TELEGRAM_TOKEN=your_telegram_bot_token_here

# Конфигурация векторной базы данных Qdrant
QDRANT_COLLECTION_NAME=documents

# Конфигурация LLM
LLM_MODEL_NAME=qwen2.5:1.5b

# Конфигурация модели
EMBEDDING_MODEL_NAME=sentence-transformers/all-MiniLM-L6-v2

# Конфигурация обработки документов
CHUNK_SIZE=512
CHUNK_OVERLAP=50

# Конфигурация кэша
CACHE_TTL=3600

# Конфигурация логирования
LOG_LEVEL=INFO

# Пример переопределения (опционально)
# OLLAMA_URL=http://custom-ollama:11434
# QDRANT_URL=http://custom-qdrant:6333
# REDIS_URL=redis://custom-redis:6379

Примечание: URL сервисов (OLLAMA_URL, QDRANT_URL, REDIS_URL) автоматически настраиваются Docker Compose по именам сервисов. Переопределяйте их в .env только если нужна кастомная конфигурация.

Запуск с Docker

  1. Собрать Docker образы:
make build
  1. Настроить модели Ollama (только при первом запуске):
make setup-ollama
  1. Запустить все сервисы:
make up
  1. Бот автоматически начнет опрашивать Telegram сообщения. Примечание: Сначала нужно загрузить документы (см. раздел Загрузка документов ниже).

Загрузка документов

Перед тем как бот сможет отвечать на вопросы, нужно заполнить векторную базу данных документами:

Способ 1: Загрузка из URL командной строки

# Один документ
make exec-ai CMD="python load_documents.py --urls https://example.com/document.pdf"

# Несколько документов  
make exec-ai CMD="python load_documents.py --urls https://example.com/doc1.pdf https://example.com/doc2.pdf"

# Принудительное пересоздание коллекции (замена всех документов)
make exec-ai CMD="python load_documents.py --urls https://example.com/document.pdf --force"

Способ 2: Загрузка из файла

# Сначала создайте файл с URL документов (по одному на строку)
# Можете использовать предоставленный example_documents.txt как шаблон
cp climat-rag/example_documents.txt my_documents.txt

# Отредактируйте my_documents.txt и добавьте ваши URL документов

# Загрузите документы из файла
make exec-ai CMD="python load_documents.py --file my_documents.txt"

Быстрый старт с примерами документов:

# Загрузить примеры климатических документов из файла example_documents.txt (самый простой способ)
make load-example-docs

Примечание: Команда make load-example-docs автоматически загружает предопределенные документы из файла climat-rag/example_documents.txt, который содержит руководства по климатическому оборудованию.

Кастомная загрузка документов:

# Загрузить конкретные климатические документы напрямую
make exec-ai CMD="python load_documents.py --urls https://daichi-aircon.com/upload/iblock/d39/5jta2yrfq6qnds1iigf7bleef3k4r207/IOM-ICE95_DC21_02.02.05.v2.pdf"

# Или вручную загрузить из файла примеров
make exec-ai CMD="python load_documents.py --file example_documents.txt"

Примечания:

  • Документы должны быть публично доступными PDF файлами
  • Скрипт покажет прогресс и результаты для каждого документа
  • Используйте флаг --force для замены существующих документов вместо добавления
  • Большие документы могут обрабатываться несколько минут

Доступные команды

make help         # Показать все доступные команды
make build        # Собрать Docker образы
make up           # Запустить все сервисы
make down         # Остановить все сервисы
make logs         # Показать логи всех сервисов
make clean        # Очистить контейнеры и тома

# Управление документами
make load-example-docs # Загрузить примеры документов из example_documents.txt в векторную базу данных
make exec-ai           # Выполнить команду в AI контейнере (использование: make exec-ai CMD='command')

# Команды разработки (все выполняются в Docker)
make test         # Запустить тесты
make format       # Форматировать код с помощью ruff
make ruff-check   # Запустить проверку ruff linting
make lint         # Запустить проверку типов с mypy

# Управление Ollama
make ollama-status              # Проверить модели
make ollama-test               # Протестировать соединение
make ollama-pull MODEL=name    # Установить модель
make ollama-remove MODEL=name  # Удалить модель

Использование

Команды бота

  • /start - Приветственное сообщение и инструкции
  • /help - Показать доступные команды и примеры использования

Примеры запросов

  • "Как включить продув испарителя на сплите Dantex RK-24SVGI?"
  • "Как установить дренажный шланг на Daichi ICE95AVQ1?"
  • "Настройка таймера на кондиционере"

Структура проекта

zb-test/                          # Корневая директория проекта
├── .env                          # Конфигурация окружения (создается из sample.env)
├── sample.env                    # Пример конфигурации окружения
├── docker-compose.yml            # Конфигурация Docker сервисов
├── Makefile                      # Команды сборки и разработки
├── README.md                     # Документация проекта
└── climat-rag/                   # Директория приложения
    ├── config/
    │   ├── __init__.py
    │   └── settings.py           # Настройки приложения
    ├── core/
    │   ├── __init__.py
    │   └── bot.py                # Реализация Telegram бота
    ├── services/
    │   ├── __init__.py
    │   ├── rag_service.py        # Логика RAG и поиск документов
    │   ├── search_boost_service.py # Повышение релевантности поиска через keyword boosting
    │   ├── document_processor.py # Обработка PDF и разбиение на фрагменты
    │   ├── llm_service.py        # Интеграция с LLM
    │   └── cache_service.py      # Слой кэширования Redis
    ├── main.py                   # Точка входа приложения
    ├── load_documents.py         # Утилита загрузки документов
    ├── Dockerfile                # Инструкции сборки контейнера
    ├── pyproject.toml            # Конфигурация Python проекта
    └── uv.lock                   # Файл блокировки зависимостей

Конфигурация

Настройки моделей

  • Модель эмбеддингов: sentence-transformers/all-MiniLM-L6-v2 (384 измерения)
  • LLM модель: qwen2.5:1.5b (через Ollama) - Компактная многоязычная модель с отличной поддержкой русского языка
  • Разбиение текста: 512 символов с перекрытием в 50 символов
  • Векторный поиск: Косинусное сходство с порогом 0.05

Доступные LLM модели

Система поддерживает различные локальные модели через Ollama:

Рекомендуемые модели:

  • qwen2.5:1.5b - Компактная многоязычная модель с отличной поддержкой русского языка (по умолчанию)
  • llama3.2:1b - Альтернативная компактная модель
  • mistral:7b - Более крупная модель с лучшим качеством (требует больше памяти)

Для установки рекомендуемой модели:

make setup-ollama

Для ручного управления моделями:

make ollama-status              # Список установленных моделей
make ollama-pull MODEL=name     # Установить конкретную модель
make ollama-remove MODEL=name   # Удалить конкретную модель

Требования к моделям:

  • Минимум 2GB RAM для моделей 1.5B (рекомендуется)
  • Минимум 4GB RAM для моделей 3B
  • Минимум 8GB RAM для моделей 7B
  • GPU ускорение опционально, но рекомендуется

Настройки производительности

  • TTL кэша: 1 час для результатов запросов
  • Лимит фрагментов: Топ 5 похожих фрагментов на запрос
  • Лимит ответа: Топ 3 фрагмента в ответе

Search Boost Service

SearchBoostService - это специализированный сервис для повышения релевантности результатов поиска через систему keyword boosting. Он анализирует текстовые фрагменты и применяет дополнительные баллы на основе наличия ключевых слов и фраз.

Функциональность

Основные возможности:

  • Keyword Boosting: Автоматическое повышение релевантности для документов с ключевыми словами
  • Группы ключевых слов: Условная логика для сложных комбинаций терминов
  • Модель-специфичные ключевые слова: Учет конкретных моделей оборудования
  • Анализ запросов: Специальная обработка для определенных типов вопросов
  • Конфигурируемость: Полностью data-driven система без хардкода

Типы буста:

1. Простые ключевые слова - базовые термины получают фиксированный буст:

"продув": +0.2,       # Функция продува
"испарител": +0.2,    # Компонент испарителя  
"x-fan": +0.15,       # Техническое название функции
"обдув": +0.15,       # Альтернативное название
"blow": +0.1          # Английский термин

2. Группы ключевых слов - сложная логика с условиями:

  • Детальные описания X-FAN (+0.3): Слова "10 мин", "вращается", "влаги" получают буст только при наличии "x-fan"
  • Режимы работы (+0.2): "охлажден", "осушен" бустятся только при наличии слова "режим"
  • Функции кнопок (+0.15): Требуется минимум 2 совпадения из "кнопк", "нажат", "включ"
  • Описания вентилятора (+0.15): Требуется наличие обоих слов "вентилятор" и "внутренн"

3. Модель-специфичные ключевые слова (+0.1):

  • dantex - бренд климатического оборудования
  • rk-24 - конкретная модель сплит-системы

4. Анализ запросов - специальная обработка для типовых вопросов:

  • Запросы о "продув испарителя" получают детальное логирование и анализ

Архитектура сервиса

SearchBoostService
├── boost_search_result()      # Основной метод буста
├── analyze_query_and_log_results()  # Анализ и логирование
├── get_config()              # Получение конфигурации
├── update_config()           # Обновление конфигурации
└── SEARCH_CONFIG             # Конфигурация буста
    ├── simple_keywords       # Простые ключевые слова
    ├── keyword_groups        # Группы с условиями
    ├── model_keywords        # Модель-специфичные слова
    └── query_analysis        # Анализ типов запросов

Пример работы

Входящий запрос: "Как включить продув испарителя на сплите Dantex RK-24SVGI?"

Обработка фрагмента документа:

Исходный score: 0.4157
+ "продув": +0.2
+ "испарител": +0.2  
+ "x-fan": +0.15
+ "функция_кнопк": +0.15 (группа button_functions)
+ "rk-24": +0.1 (модель из запроса)
= Итоговый score: 1.1157

Результат: Релевантный фрагмент поднимается с 4-го места на 1-е в результатах поиска.

Расширение конфигурации

Для добавления новых правил буста отредактируйте SEARCH_CONFIG в services/search_boost_service.py:

# Добавить новое простое ключевое слово
"simple_keywords": {
    "новое_слово": 0.15,  # Буст +0.15
}

# Добавить новую группу ключевых слов
"keyword_groups": {
    "новая_группа": {
        "keywords": ["слово1", "слово2", "слово3"],
        "boost": 0.2,
        "condition": {
            "type": "min_matches",  # или "requires_keyword"
            "count": 2              # или "keyword": "обязательное_слово"
        }
    }
}

Мониторинг буста

Сервис предоставляет детальное логирование процесса буста:

  • Исходные scores для каждого результата
  • Найденные ключевые слова и примененные бусты
  • Финальные scores после буста
  • Специальные сообщения для важных находок

Логи помогают понять, почему определенные результаты получили высокий или низкий рейтинг, и настроить систему буста для лучшей производительности.

Начальные документы

Система обрабатывает эти документы при запуске:

Мониторинг

Логи

Просмотр логов приложения:

make logs        # Все сервисы
make logs -f     # Следить за логами в реальном времени

Статус сервисов

Векторное хранилище (Qdrant):

LLM Сервис (Ollama):

make ollama-status    # Список установленных моделей
make ollama-test      # Тест соединения

Статистика кэша (Redis):

Информация Redis доступна через методы сервиса кэша.

Разработка

Качество кода

Все команды разработки выполняются в Docker контейнерах для обеспечения консистентности между окружениями.

Форматирование кода с ruff:

make format      # Автоформатирование кода
make ruff-check  # Проверка стилевых проблем

Проверка типов:

make lint        # Запуск проверки типов mypy

Утилитарные команды:

make build       # Пересборка Docker образов
make clean       # Очистка контейнеров и томов
make logs        # Просмотр логов приложения

Стандарты качества

  • Форматтер: Ruff (заменяет Black + isort)
  • Линтер: Ruff для проверки стиля и ошибок
  • Проверка типов: MyPy со строгими настройками
  • Тестирование: Pytest с поддержкой async
  • Версия Python: 3.13+

Рабочий процесс разработки

  1. Внесите изменения в код
  2. Отформатируйте и проверьте качество кода:
    make format ruff-check lint
  3. Протестируйте приложение:
    make up

Вклад в проект

  1. Следуйте существующей структуре кода
  2. Добавляйте аннотации типов ко всем функциям
  3. Используйте рабочий процесс разработки:
    make format ruff-check lint

4.Вся разработка происходит в Docker контейнерах 5.Обновляйте документацию для новых функций

Лицензия

Этот проект предназначен для образовательных целей.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published