Монорепозиторий системы вопрос-ответ по нормативным документам (ГОСТ, СП, СНиП и др. — типы задаются в document_types.yaml): преобразование PDF/DOCX в структурированный Markdown, построение гибридного поискового индекса в Qdrant и веб-интерфейс RAG с чатом.
PDF/DOCX ──create_markdown──▶ Markdown ──build_search_index──▶ Qdrant (dense + sparse)
│
Telegram-бот / веб-чат ◀──генерация ответа (LLM + реранк) ◀─┘
▲
interface_rag (веб-панель управления всем конвейером)
| Каталог | Устанавливается как | Назначение |
|---|---|---|
create_markdown/ |
Create_Markdown_YA |
Распознавание PDF/DOCX → Markdown: Yandex Vision OCR (модель math-markdown), таблицы с двойной обработкой (текстовый слой + vision по ID-маркерам), AI-постобработка (DeepSeek / Gemini через Provod) |
build_search_index/ |
Build_Search_index |
Индексация Markdown в Qdrant и QA-система: гибридный поиск (dense + sparse BM25), реранк, LangGraph-граф с LLM-генерацией ответов, Telegram-бот |
interface_rag/ |
interface_RAG |
Веб-интерфейс (FastAPI): чат с базой, загрузка и регистрация документов, перечень и удаление документов в базе, настройки провайдеров/поиска/папок, управление Telegram-ботом |
Основное распознавание документов выполняет YandexOCR. Для его работы нужно:
- Завести аккаунт на https://aistudio.yandex.ru/.
- Получить API-ключ (и ID каталога
folder_id). Для аутентификации в AI Studio необходим идентификатор каталога. Чтобы его получить, в интерфейсе AI Studio наведите указатель на название каталога, расположенное в верхней части экрана, и нажмите . Идентификатор будет скопирован в буфер обмена. - Вписать их в переменные
YANDEX_API_KEYиYANDEX_FOLDER_ID— через веб-интерфейс (Настройки, раздел переменных окружения) или прямо в общий.env.
Без ключа конвертация PDF/DOCX не запустится (только AI-постобработка готовых .md доступна без OCR).
Скрипт firmware/src/create_markdown.py распознаёт текст, таблицы, формулы и изображения из документов и собирает структурированный Markdown.
- Вход:
.pdf,.docx,.doc(DOCX/DOC предварительно конвертируются в PDF через LibreOffice) или готовый.md. - OCR: основное распознавание — YandexOCR (Yandex Vision OCR, модель math-markdown); заголовки разделов восстанавливаются из структуры JSON.
- Таблицы: двойная обработка — распознавание из текстового слоя + vision-распознавание из картинок; AI сверяет обе версии по ID-маркерам и возвращает исправленную таблицу на исходное место.
- AI-постобработка (
--ai): единый проход LLM (DeepSeek / Gemini через Provod) — коррекция таблиц, очистка OCR-артефактов, LaTeX, подписи и примечания. - RAG-подготовка (
--rag): генерацияrag_chunks.jsonlдля индексации; метаданные документа — в per-document<stem>_reg.yaml(--reg). - Выход:
<корень>/Markdown/<документ>/— итоговыйdocument.mdс картинками и временными артефактами; временные данные — в<корень>/tmp/.
Пример:
cd create_markdown/firmware/src
python3 create_markdown.py -i document.pdf --ai --ragКорень базы задаётся флагом --base-dir или переменной BASE_DIR (по умолчанию — папка с входным файлом).
Набор скриптов firmware/src/:
create_index.py— индексация Markdown-документа в Qdrant: чанкинг, dense-векторы (fastembed/SiliconFlow) + sparse BM25, метаданные изrag_chunks.jsonlи<stem>_reg.yaml.search.py— гибридный поиск: dense + sparse с взаимным ранжированием, реранк модели с рольюrerank, фильтры по типу/домену документа.qa_graph.py— QA-система на LangGraph: анализ запроса → (при неоднозначности) уточняющий вопрос → поиск → самооценка результатов (ре-поиск при необходимости) → генерация ответа с цитатами (ID чанков) и иллюстрациями. Конфигурация узлов (temperature, max_tokens) — вsearch_config.yaml, редактируется через веб-панель.telegram_bot/request_bot.py— Telegram-бот поверхQAGraph: тот же RAG-ответ в чате Telegram. Запускается systemd-юнитомinterface-rag-bot.service, ключи — из общего.env.
FastAPI-приложение (firmware/src/app.py), объединяющее оба пайплайна под единым UI: приёмка и регистрация документов, конвертация, индексация, семантический поиск и чат по базе.
Ответы по базе с потоковой отдачей (WebSocket), уточняющими вопросами при неоднозначном запросе, цитатами (ID чанков), списком источников и релевантными иллюстрациями из документов.
Загрузка PDF → авторегистрация: vision-LLM извлекает с титульного листа метаданные (document_id, title, domain_hint, document_type, date_enacted) с возможностью ручной правки; далее — конвертация и индексация одним кликом с прогрессом и журналом событий. Типы документов — только из конфига document_types.yaml (сид с дефолтами ставится установщик; новый тип, введённый вручную, дописывается в конфиг автоматически).
Таблица проиндексированных документов из Qdrant: document_id, название, область, тип, статус и число фрагментов — с сортировкой по колонкам и фильтром по типу документа. Кнопка «Удалить» убирает чанки выбранного документа из базы (.md и регистрация сохраняются — документ можно переиндексировать); удаление доступно при разрешённой записи в Qdrant (qdrant.write_enabled).
- Провайдеры: список LLM-провайдеров, роли (chat / embedding / rerank / vision), проверка доступности, добавление и удаление.
- Папки: корень документов (
BASE_DIR) и путь к базе Qdrant (QDRANT_PATH) — выбор папки на сервере через обзорник, размер и очистка временных файловtmp/. - Поиск: параметры узлов QA-графа (temperature, max_tokens), конфигурация конвертации, переменные окружения (
.env). - Телеграм: статус и перезапуск бота.
Все настройки сохраняются в общий .env и конфиги, которые читают оба пайплайна и бот, — менять их можно на лету без правки файлов на сервере.
scripts/install.sh ставит всё на чистую машину с Debian/Ubuntu и systemd: системные пакеты, venv с зависимостями всех трёх компонентов, прод-макет в каталоге установки (<install>/{interface_RAG,Create_Markdown_YA,Build_Search_index,config,venv}), генерацию config.yaml, .env с плейсхолдерами ключей (права 0600), systemd-юниты веб-интерфейса и Telegram-бота с автозапуском. В конце печатает адрес веб-интерфейса.
Опции:
| Опция | По умолчанию | Описание |
|---|---|---|
--install-dir |
/opt/rag-pipeline |
Каталог установки (всего пайплайна) |
--base-dir |
/mnt/sdb/!База_ГОСТ |
Корневая папка документов (BASE_DIR) |
--host |
127.0.0.1 |
Адрес, на котором слушает веб-интерфейс: 127.0.0.1 (только локально) или 0.0.0.0 (все адреса) |
--port |
8081 |
Порт веб-интерфейса |
Без флагов скрипт спрашивает те же параметры интерактивно. Дефолт базы Qdrant при установке — <install-dir>/qdrant.
git clone https://github.com/dimbas80/rag-pipeline.git
cd rag-pipeline
sudo scripts/install.sh
# или с явными параметрами:
sudo scripts/install.sh --install-dir /opt/rag-pipeline \
--base-dir /mnt/sdb/!База_ГОСТ --host 0.0.0.0 --port 8081cd /path/to/rag-pipeline
sudo scripts/install.sh --install-dir /opt/rag-pipeline --host 127.0.0.1 --port 8081- Откройте веб-интерфейс (адрес печатает скрипт), раздел Настройки → Телеграм: введите
TELEGRAM_BOT_TOKEN, а в переменных окружения — ключиYANDEX_API_KEY/YANDEX_FOLDER_ID(см. «Регистрация YandexOCR») и остальные API-ключи; нажмите «Перезапустить бота». - Корень документов уже записан (
BASE_DIR); меняется в Настройки → Папки (кнопка «Добавить» открывает обзор папок на сервере). - После смены папок перезапустите бота в разделе «Телеграм».
Ключи из .env читают все компоненты: веб-интерфейс, пайплайны (запускаются им как дочерние процессы) и бот (systemd EnvironmentFile).
# веб-интерфейс
pip install -r interface_rag/firmware/src/requirements.txt
cd interface_rag/firmware/src
python -m uvicorn firmware.src.app:app --host 127.0.0.1 --port 8081
# тесты
python -m pytest interface_rag/firmware/tests/
python -m pytest create_markdown/firmware/tests/test_base_dir.pyКонфигурация dev/prod — interface_rag/config.yaml (active: dev|prod). Деплой на прод-хост: interface_rag/scripts/deploy.sh (по умолчанию dry-run, реальный деплой — --apply; подключение — interface_rag/scripts/deploy.conf, шаблон: deploy.conf.example).
Каждый каталог перенесён со своей полной git-историей через git subtree (merge-коммиты subtree: в логе). История конкретного компонента: git log --follow <каталог>.




