Skip to content

Repository files navigation

GOST_AI

GOST_AI — локальная RAG-система для работы с ГОСТами, технической документацией и инженерными запросами.

Проект объединяет ingestion документов, технический chunking, PostgreSQL metadata registry, hybrid search, Qdrant vector search, reranking, локальную LLM через llama.cpp и web-интерфейс с проверяемыми источниками.

Главная идея проекта: LLM не хранит факты из ГОСТов в весах. Все знания остаются в локальной базе документов и индексов, а модель используется для формулирования ответа на основе найденных источников.


Возможности

  • Загрузка и обработка локальных .pdf, .docx, .txt, .html документов.

  • Извлечение технических сущностей: ГОСТы, обозначения деталей, материалы, размеры, резьбы, единицы измерения.

  • PostgreSQL-реестр документов, версий, блоков, chunks, поисковых запросов, ответов и источников.

  • Гибридный поиск:

    • PostgreSQL FTS / lexical search;
    • Qdrant vector search;
    • BGE-M3 embeddings;
    • Reciprocal Rank Fusion.
  • Optional reranker поверх результатов поиска.

  • Локальный LLM-цикл через OpenAI-compatible llama.cpp server.

  • Web-интерфейс на Next.js:

    • страница /answer для вопросов;
    • история чатов;
    • удаление чатов;
    • кликабельные источники [S1], [S2];
    • preview источников;
    • просмотр PDF внутри сайта;
    • каталог документов /documents;
    • ручное редактирование метаданных документов.
  • Локальный статус-навигатор ГОСТов:

    • действует;
    • действует с изменениями;
    • заменён;
    • отменён;
    • статус не подтверждён.
  • Возможность подключать несколько локальных файлов-навигаторов статусов.

  • Поддержка ручных overrides для метаданных документов.


Почему RAG, а не обучение LLM на ГОСТах

ГОСТы и техническая документация часто обновляются, заменяются, отменяются или получают изменения. Поэтому факты должны храниться в обновляемой локальной базе, а не в весах модели.

Такой подход даёт:

  • обновление базы без переобучения LLM;
  • проверяемые ссылки на документ, страницу и фрагмент;
  • контроль источников ответа;
  • возможность явно отказаться от ответа, если подтверждения нет;
  • безопасную основу для локального промышленного ассистента;
  • возможность использовать LoRA только для стиля и формата ответа, а не как источник фактов.

Архитектура

Raw documents
    ↓
Ingestion / Parsing
    ↓
Technical chunking
    ↓
PostgreSQL metadata DB
    ↓
PostgreSQL FTS + Qdrant vector index
    ↓
Hybrid retrieval + RRF
    ↓
Optional reranker
    ↓
Answer context builder
    ↓
Local LLM via llama.cpp OpenAI-compatible API
    ↓
Citation validation
    ↓
FastAPI + Next.js UI

Стек

Backend

  • Python 3.12
  • FastAPI
  • SQLAlchemy
  • Alembic
  • PostgreSQL
  • Qdrant
  • Pydantic Settings
  • PyMuPDF / DOCX parsing fallbacks
  • Sentence Transformers / BGE-M3
  • Optional reranker
  • llama.cpp OpenAI-compatible API

Frontend

  • Next.js
  • React
  • TypeScript
  • CSS modules / global styling
  • Local API client

Infrastructure

  • Docker for PostgreSQL and Qdrant
  • Local filesystem for documents, models and generated artifacts
  • GitHub repository without heavy local artifacts

Основные страницы

/answer       — чат с локальным RAG-ассистентом
/documents    — каталог документов
/documents/id — viewer-first страница документа с PDF-просмотром

Backend по умолчанию:

http://127.0.0.1:8000

Frontend по умолчанию:

http://localhost:3000

Что не входит в репозиторий

Репозиторий содержит код проекта, но не содержит тяжёлые и локальные артефакты:

.env
web/.env.local
web/node_modules
web/.next
models
tools/llama.cpp
tools/_downloads
data/raw_docs
data/cache
data/chunks
data/parsed_docs
data/indexes
data/qdrant

Это сделано специально: модели, ГОСТы, индексы и локальные документы могут быть большими, приватными или зависящими от окружения.

В репозитории остаются только шаблоны:

.env.example
web/.env.example

Установка

cd C:\Projects\GOST_ai

py -3.12 -m venv .venv
.\.venv\Scripts\Activate.ps1

py -3.12 -m pip install -U pip
py -3.12 -m pip install -e ".[dev]"

Optional dependencies:

py -3.12 -m pip install -e ".[parsing]"
py -3.12 -m pip install -e ".[embeddings,qdrant]"
py -3.12 -m pip install -e ".[reranker]"

Frontend:

cd C:\Projects\GOST_ai\web
npm install

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

Backend:

cd C:\Projects\GOST_ai
Copy-Item .env.example .env

Frontend:

cd C:\Projects\GOST_ai\web
Copy-Item .env.example .env.local

Основные backend-переменные:

DATABASE_URL=postgresql+psycopg://gost_ai:gost_ai@localhost:55432/gost_ai
METADATA_DB_ENABLED=true

QDRANT_URL=http://localhost:6335
QDRANT_COLLECTION=gost_ai_chunks

LLM_ENABLED=true
LLM_PROVIDER=openai_compatible
LLM_BASE_URL=http://127.0.0.1:8080/v1
LLM_MODEL=qwen3-14b-q5
LLM_CONTEXT_TOKENS=16384
LLM_MAX_OUTPUT_TOKENS=800
LLM_TEMPERATURE=0.05
LLM_TOP_P=0.9
LLM_TIMEOUT_SEC=300
LLM_REQUIRE_CITATIONS=true
LLM_DEFAULT_THINKING_MODE=no_think

Локальная инфраструктура

PostgreSQL:

cd C:\Projects\GOST_ai
.\scripts\dev_postgres_docker.ps1

Qdrant:

cd C:\Projects\GOST_ai
.\scripts\dev_qdrant_docker.ps1

Проверка Docker-контейнеров:

docker ps

Миграции:

cd C:\Projects\GOST_ai
py -3.12 -m alembic upgrade head

Запуск локальной LLM

Пример запуска llama.cpp server:

cd C:\Projects\GOST_ai

$LLAMA_SERVER = "C:\Projects\GOST_ai\tools\llama.cpp\llama-server.exe"
$env:PATH = "C:\Projects\GOST_ai\tools\llama.cpp;$env:PATH"

& $LLAMA_SERVER `
  -m C:\Projects\GOST_ai\models\llm\qwen3-14b-gguf\Qwen3-14B-Q5_K_M.gguf `
  -c 16384 `
  -ngl 99 `
  --host 127.0.0.1 `
  --port 8080

Если не хватает VRAM:

cd C:\Projects\GOST_ai

$LLAMA_SERVER = "C:\Projects\GOST_ai\tools\llama.cpp\llama-server.exe"
$env:PATH = "C:\Projects\GOST_ai\tools\llama.cpp;$env:PATH"

& $LLAMA_SERVER `
  -m C:\Projects\GOST_ai\models\llm\qwen3-14b-gguf\Qwen3-14B-Q5_K_M.gguf `
  -c 8192 `
  -ngl 99 `
  --host 127.0.0.1 `
  --port 8080

Запуск backend

cd C:\Projects\GOST_ai

py -3.12 -m uvicorn app.main:app --reload --host 127.0.0.1 --port 8000

FastAPI docs:

http://127.0.0.1:8000/docs

Запуск frontend

cd C:\Projects\GOST_ai\web

npm.cmd run dev

Frontend:

http://localhost:3000/answer

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

Локальные ГОСТы и технические документы кладутся в:

data/raw_docs/gosts

Пример ingestion:

cd C:\Projects\GOST_ai

py -3.12 scripts\ingest_folder.py `
  --input data\raw_docs\gosts `
  --recursive `
  --chunker technical `
  --write-db

Если нужно пересобрать уже обработанные документы:

py -3.12 scripts\ingest_folder.py `
  --input data\raw_docs\gosts `
  --recursive `
  --chunker technical `
  --write-db `
  --force

Метаданные ГОСТов

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

  • обозначение ГОСТ;
  • название;
  • дату введения;
  • редакцию;
  • область применения;
  • заменённые документы;
  • изменения и поправки.

Backfill метаданных:

cd C:\Projects\GOST_ai

py -3.12 scripts\backfill_gost_metadata.py --dry-run --limit 20
py -3.12 scripts\backfill_gost_metadata.py

Локальный статус-навигатор ГОСТов

Текущий статус документа не равен дате введения. Для актуальности используется отдельный локальный слой — status navigator.

Файлы-навигаторы кладутся в:

data/raw_docs/gost_status

Поддерживаются:

.md
.txt
.docx

Dry-run:

cd C:\Projects\GOST_ai

py -3.12 scripts\ingest_gost_status_navigator.py `
  --input data\raw_docs\gost_status `
  --recursive `
  --dry-run `
  --show-text-preview

Запись в БД:

py -3.12 scripts\ingest_gost_status_navigator.py `
  --input data\raw_docs\gost_status `
  --recursive

Система поддерживает несколько navigator-файлов. Повторная загрузка одного файла обновляет только записи из этого же файла.


Пересборка индекса

Для полноценного semantic retrieval:

cd C:\Projects\GOST_ai

py -3.12 scripts\rebuild_index.py `
  --force `
  --vector qdrant `
  --embedding-provider sentence_transformers `
  --embedding-model BAAI/bge-m3 `
  --qdrant-mode server `
  --batch-size 16

Для smoke-тестов без тяжёлой embedding-модели можно использовать hashing provider:

py -3.12 scripts\rebuild_index.py `
  --force `
  --vector qdrant `
  --embedding-provider hashing `
  --qdrant-mode server

Генерация ответа через CLI

Без LLM:

cd C:\Projects\GOST_ai

py -3.12 scripts\generate_answer.py "электронная аппаратура" --mode fast

С локальной LLM:

py -3.12 scripts\generate_answer.py "электронная аппаратура" --mode fast --use-llm

API

Основные endpoints:

GET  /health
POST /ask
POST /api/answer/generate
GET  /api/sources/{chunk_id}/preview
GET  /api/documents/{doc_id}/raw
GET  /api/documents/{doc_id}/pages/{page}/image
PATCH /api/documents/{doc_id}/metadata
POST /api/documents/{doc_id}/metadata/reset
DELETE /api/chats/{chat_id}

Пример запроса:

{
  "query": "ГОСТ 2.702 правила выполнения электрических схем",
  "answer_mode": "fast",
  "rerank": true
}

Проверки

Backend tests:

cd C:\Projects\GOST_ai

py -3.12 -m pytest
py -3.12 -m ruff check .
py -3.12 -m mypy gost_ai app

Frontend build:

cd C:\Projects\GOST_ai\web

npm.cmd run build

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

app/                    FastAPI application and API routes
gost_ai/answering/      answer building, context formatting, quality checks
gost_ai/db/             SQLAlchemy models and repositories
gost_ai/domain/         ГОСТ metadata and technical domain logic
gost_ai/embeddings/     embedding providers
gost_ai/indexing/       chunking and indexing logic
gost_ai/ingestion/      document parsing and ingestion
gost_ai/llm/            LLM providers and prompt building
gost_ai/reranking/      optional reranker layer
gost_ai/search/         PostgreSQL FTS, Qdrant and hybrid search
gost_ai/sources/        source preview, highlighting and PDF rendering
gost_ai/standards/      ГОСТ designation and status registry logic
scripts/                local CLI and maintenance scripts
tests/                  pytest test suite
web/                    Next.js frontend
alembic/                database migrations

Типовой полный запуск

Окно 1 — LLM:

cd C:\Projects\GOST_ai

$LLAMA_SERVER = "C:\Projects\GOST_ai\tools\llama.cpp\llama-server.exe"
$env:PATH = "C:\Projects\GOST_ai\tools\llama.cpp;$env:PATH"

& $LLAMA_SERVER `
  -m C:\Projects\GOST_ai\models\llm\qwen3-14b-gguf\Qwen3-14B-Q5_K_M.gguf `
  -c 16384 `
  -ngl 99 `
  --host 127.0.0.1 `
  --port 8080

Окно 2 — backend:

cd C:\Projects\GOST_ai

py -3.12 -m uvicorn app.main:app --reload --host 127.0.0.1 --port 8000

Окно 3 — frontend:

cd C:\Projects\GOST_ai\web

npm.cmd run dev

Открыть:

http://localhost:3000/answer

Текущий baseline

Текущий публичный baseline зафиксирован tag:

v0.1-baseline

Это стабильная версия до экспериментов с LoRA.

LoRA-эксперименты планируется вести отдельно от основной ветки, чтобы не смешивать production-local RAG baseline и исследовательское дообучение.


Roadmap

  • Улучшить визуальный слой PDF/source preview.
  • Добавить больше regression/evaluation сценариев.
  • Добавить демонстрационные screenshots в README.
  • Подготовить demo corpus без лицензионных ограничений.
  • Экспериментально проверить LoRA для стиля ответа и формата инженерных объяснений.
  • Подготовить Docker Compose для полного локального запуска.
  • Добавить CI для lint/test/build.

About

Local RAG assistant for ГОСТ documents with citations, PDF source preview, status registry and manual metadata editing

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages