DocClassifier
Описание
Языки
- Python72,4%
- HTML25,9%
- Shell1%
- Dockerfile0,7%
README.md
DocClassifier - Поиск и Ответы по Документам
Этот проект представляет собой веб-приложение на FastAPI, предназначенное для:
- Подключение к MongoDB.
- Загрузки и обработки текстовых данных из указанной коллекции.
- Векторизации загруженного текста с использованием моделей
.sentence-transformers - Сохранения векторов и метаданных в векторной базе данных Qdrant.
- Выполнения семантического поиска по векторизованным документам.
- Генерации ответов на вопросы пользователя с помощью локально запущенной 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:
-
Клонируйте репозиторий:
-
Запустите контейнеры через Docker Compose:
Это запустит:
- Контейнер с веб-приложением FastAPI (доступен на http://localhost:8000)
- Контейнер с Ollama (доступен на http://localhost:11434)
-
Откройте приложение в браузере: http://localhost:8000
При первом запуске Ollama использует модель . Если модель не обнаружена в директории llama3.1:8b, вам нужно будет загрузить ее вручную:OllamaModels
Запуск без Docker
-
Клонируйте репозиторий:
-
Установите зависимости:
-
Настройте и запустите Ollama:
- Установите Ollama: https://ollama.com/
- Скачайте модель Llama 3.1 8B:
- Убедитесь, что сервер Ollama запущен (обычно запускается автоматически после установки).
-
Запустите приложение FastAPI:
Приложение будет доступно по адресу
.http://127.0.0.1:8000
Использование
-
Настройка подключения:
- Откройте
.http://localhost:8000/connect - Введите параметры вашей базы данных MongoDB.
- Для MongoDB: Укажите
(или имя базы данных, если отличается от 'test') в поле "Путь к базе данных". Заполните хост, порт (обычно 27017), и, если нужно, пользователя/пароль. Имя коллекции указывается в поле "Название таблицы".mongodb
- Для MongoDB: Укажите
- Укажите имя коллекции, из которой нужно загрузить данные.
- Укажите имя столбца, содержащего текст для обработки.
- Нажмите "Сохранить настройки".
- Нажмите "Подключиться к базе данных", чтобы проверить соединение.
- Откройте
-
Загрузка и обработка данных:
- После успешной проверки подключения нажмите кнопку "Выкачать и преобразовать данные".
- Начнется фоновый процесс: данные будут загружены из БД, векторизованы и сохранены в Qdrant.
- Прогресс будет отображаться на прогресс-баре.
-
Поиск и Ответы:
- Перейдите на страницу
(или простоhttp://localhost:8000/search)./ - Введите ваш поисковый запрос в текстовое поле.
- Настройте лимит результатов и порог схожести (от 0.0 до 1.0).
- Нажмите кнопку "Поиск".
- Результаты (наиболее похожие текстовые фрагменты из вашей базы) будут отображены ниже.
- Найденные документы будут переданы в качестве контекста локальной модели LLM (через Ollama).
- Сгенерированный LLM ответ на ваш запрос (основанный на контексте) будет показан в поле "Результат от нейросети".
- Перейдите на страницу
Описание компонентов
- app/run.py: Основной файл приложения FastAPI, содержит все маршруты, логику обработки запросов и запуск фоновых задач.
- app/utils/llama_worker.py: Класс
для взаимодействия с Ollama.LlamaWorker - app/utils/vector_db_worker.py: Класс
для взаимодействия с Qdrant (создание коллекции, добавление векторов, поиск).VectorDBWorker - 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 - Оптимизировать запросы к векторной базе данных.
- Изучить возможность асинхронной обработки батчей без использования
- Управление моделями: Добавить возможность выбора модели
и модели Ollama через интерфейс.sentence-transformer - Обработка больших файлов/БД: Реализовать более устойчивую к памяти потоковую обработку данных.