DocClassifier

0

Описание

Языки

  • Python72,4%
  • HTML25,9%
  • Shell1%
  • Dockerfile0,7%
README.md

DocClassifier - Поиск и Ответы по Документам

Этот проект представляет собой веб-приложение на FastAPI, предназначенное для:

  1. Подключение к MongoDB.
  2. Загрузки и обработки текстовых данных из указанной коллекции.
  3. Векторизации загруженного текста с использованием моделей
    sentence-transformers
    .
  4. Сохранения векторов и метаданных в векторной базе данных Qdrant.
  5. Выполнения семантического поиска по векторизованным документам.
  6. Генерации ответов на вопросы пользователя с помощью локально запущенной LLM (через Ollama), используя найденные документы в качестве контекста.

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

DocClassifier/ ├── app/ │ ├── Dockerfile │ ├── __init__.py │ ├── run.py # Основной файл приложения │ ├── requirements.txt # Зависимости проекта │ ├── log.txt # Лог-файл приложения │ ├── db_settings.json # Настройки подключения к БД │ ├── static/ # Статические файлы │ │ └── __init__.py │ ├── templates/ # HTML-шаблоны │ │ ├── base.html │ │ ├── connect.html │ │ └── search.html │ └── utils/ # Вспомогательные модули │ ├── __init__.py │ ├── bd_to_vector.py │ ├── embedder.py │ ├── llama_worker.py │ ├── log.py │ └── vector_db_worker.py │ ├── ollama/ # Файлы для контейнера Ollama │ ├── Dockerfile │ └── start-ollama.sh # Скрипт запуска Ollama │ ├── progress_data/ # Данные о прогрессе обработки ├── qdrant_data/ # Данные Qdrant ├── OllamaModels/ # Директория для моделей Ollama ├── docker-compose.yml # Конфигурация Docker Compose ├── db_settings.json # Глобальные настройки подключения к БД └── .gitignore

Функционал

  • Веб-интерфейс: Реализован с использованием FastAPI и Jinja2.
    • Страница подключения (
      /connect
      ):
      • Отображение и изменение настроек подключения к базе данных (хост, порт, пользователь, пароль, имя/путь БД, таблица/коллекция, столбец).
      • Проверка статуса подключения к указанной базе данных.
      • Запуск процесса загрузки, векторизации и сохранения данных в Qdrant с отображением прогресса в реальном времени.
    • Страница поиска (
      /search
      ):
      • Поле для ввода поискового запроса.
      • Настройки поиска (лимит результатов, порог схожести).
      • Отображение результатов семантического поиска (найденные тексты и их оценка схожести).
      • Генерация ответа на запрос с помощью локальной LLM (Ollama), использующей найденные документы как контекст.
  • Бэкенд (FastAPI):
    • Обработка запросов от веб-интерфейса.
    • Управление настройками БД (сохранение/загрузка в
      db_settings.json
      ).
    • Взаимодействие с БД (SQLite, MongoDB) для получения данных.
    • Запуск фоновой задачи для обработки данных (чтобы не блокировать интерфейс).
    • Использование Server-Sent Events (SSE) для передачи прогресса обработки на фронтенд.
    • Взаимодействие с Qdrant для сохранения векторов и выполнения поиска.
    • Взаимодействие с Ollama для генерации ответов LLM.
  • Обработка данных:
    • Использование
      sentence-transformers
      для создания векторных представлений текста.
    • Пакетная обработка данных для эффективности.
  • Логирование: Запись событий и ошибок в
    log.txt
    с использованием кастомной функции.

Зависимости

Основные зависимости проекта:

  • Python 3.10+
  • FastAPI: Веб-фреймворк.
  • Uvicorn: ASGI-сервер для запуска FastAPI.
  • Jinja2: Шаблонизатор для HTML.
  • Pandas: Для обработки данных, загруженных из БД.
  • Ollama: Python-клиент для взаимодействия с локальным сервером Ollama.
  • Qdrant-client: Клиент для векторной базы данных Qdrant.
  • Sentence-transformers: Библиотека для получения эмбеддингов текста.
  • Pymongo: Драйвер для MongoDB (если используется MongoDB).
  • Requests: Для взаимодействия с API Ollama (альтернативный вариант, если
    ollama
    не используется).

Установка зависимостей:

Запуск c использованием Docker

Самый простой способ запуска проекта — использовать Docker Compose:

  1. Клонируйте репозиторий:

  2. Запустите контейнеры через Docker Compose:

    Это запустит:

  3. Откройте приложение в браузере: http://localhost:8000

При первом запуске Ollama использует модель

llama3.1:8b
. Если модель не обнаружена в директории
OllamaModels
, вам нужно будет загрузить ее вручную:

Запуск без Docker

  1. Клонируйте репозиторий:

  2. Установите зависимости:

  3. Настройте и запустите Ollama:

    • Установите Ollama: https://ollama.com/
    • Скачайте модель Llama 3.1 8B:
    • Убедитесь, что сервер Ollama запущен (обычно запускается автоматически после установки).
  4. Запустите приложение FastAPI:

    Приложение будет доступно по адресу

    http://127.0.0.1:8000
    .

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

  1. Настройка подключения:

    • Откройте
      http://localhost:8000/connect
      .
    • Введите параметры вашей базы данных MongoDB.
      • Для MongoDB: Укажите
        mongodb
        (или имя базы данных, если отличается от 'test') в поле "Путь к базе данных". Заполните хост, порт (обычно 27017), и, если нужно, пользователя/пароль. Имя коллекции указывается в поле "Название таблицы".
    • Укажите имя коллекции, из которой нужно загрузить данные.
    • Укажите имя столбца, содержащего текст для обработки.
    • Нажмите "Сохранить настройки".
    • Нажмите "Подключиться к базе данных", чтобы проверить соединение.
  2. Загрузка и обработка данных:

    • После успешной проверки подключения нажмите кнопку "Выкачать и преобразовать данные".
    • Начнется фоновый процесс: данные будут загружены из БД, векторизованы и сохранены в Qdrant.
    • Прогресс будет отображаться на прогресс-баре.
  3. Поиск и Ответы:

    • Перейдите на страницу
      http://localhost:8000/search
      (или просто
      /
      ).
    • Введите ваш поисковый запрос в текстовое поле.
    • Настройте лимит результатов и порог схожести (от 0.0 до 1.0).
    • Нажмите кнопку "Поиск".
    • Результаты (наиболее похожие текстовые фрагменты из вашей базы) будут отображены ниже.
    • Найденные документы будут переданы в качестве контекста локальной модели LLM (через Ollama).
    • Сгенерированный LLM ответ на ваш запрос (основанный на контексте) будет показан в поле "Результат от нейросети".

Описание компонентов

  • app/run.py: Основной файл приложения FastAPI, содержит все маршруты, логику обработки запросов и запуск фоновых задач.
  • app/utils/llama_worker.py: Класс
    LlamaWorker
    для взаимодействия с Ollama.
  • app/utils/vector_db_worker.py: Класс
    VectorDBWorker
    для взаимодействия с Qdrant (создание коллекции, добавление векторов, поиск).
  • app/utils/embedder.py: Класс
    Embedder
    для векторизации текста (использует
    sentence-transformers
    ).
  • app/utils/bd_to_vector.py: Содержит логику преобразования данных из БД в вектора.
  • app/utils/log.py: Кастомная функция логирования.
  • app/db_settings.json: Файл для хранения настроек подключения к базе данных.
  • app/templates/: Директория с HTML-шаблонами Jinja2.

Особенности работы

  • Фоновая обработка: Загрузка и векторизация выполняются в отдельном потоке, чтобы не блокировать основной процесс FastAPI и пользовательский интерфейс.
  • SSE для прогресса: Обновления прогресса передаются клиенту через Server-Sent Events, позволяя обновлять прогресс-бар без перезагрузки страницы.
  • Локальная LLM: Запросы обрабатываются локально установленной моделью через Ollama, что обеспечивает приватность данных. Ответы модели строго ограничены предоставленным контекстом.
  • Гибкость БД: Поддерживается работа как с файловыми БД (SQLite), так и с серверными (MongoDB).
  • Docker-интеграция: Полная конфигурация для запуска всех компонентов в контейнерах.

Перспективы развития

  • Поддержка других БД: Добавить коннекторы и логику для PostgreSQL, MySQL и других реляционных/NoSQL баз данных.
  • Расширенное взаимодействие с LLM:
    • Реализовать "память" диалога.
    • Добавить возможность настройки системного промпта через интерфейс.
    • Использовать стриминг ответа от LLM для отображения по мере генерации.
  • Улучшение UI/UX:
    • Более информативное отображение ошибок.
    • Визуализация процесса обработки данных.
    • Пагинация для больших списков результатов поиска.
  • Оптимизация:
    • Изучить возможность асинхронной обработки батчей без использования
      ProcessPoolExecutor
      (например, с
      asyncio
      ).
    • Оптимизировать запросы к векторной базе данных.
  • Управление моделями: Добавить возможность выбора модели
    sentence-transformer
    и модели Ollama через интерфейс.
  • Обработка больших файлов/БД: Реализовать более устойчивую к памяти потоковую обработку данных.