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.cppserver. -
Web-интерфейс на Next.js:
- страница
/answerдля вопросов; - история чатов;
- удаление чатов;
- кликабельные источники
[S1],[S2]; - preview источников;
- просмотр PDF внутри сайта;
- каталог документов
/documents; - ручное редактирование метаданных документов.
- страница
-
Локальный статус-навигатор ГОСТов:
- действует;
- действует с изменениями;
- заменён;
- отменён;
- статус не подтверждён.
-
Возможность подключать несколько локальных файлов-навигаторов статусов.
-
Поддержка ручных overrides для метаданных документов.
ГОСТы и техническая документация часто обновляются, заменяются, отменяются или получают изменения. Поэтому факты должны храниться в обновляемой локальной базе, а не в весах модели.
Такой подход даёт:
- обновление базы без переобучения 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
- 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
- Next.js
- React
- TypeScript
- CSS modules / global styling
- Local API client
- 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 installBackend:
cd C:\Projects\GOST_ai
Copy-Item .env.example .envFrontend:
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_thinkPostgreSQL:
cd C:\Projects\GOST_ai
.\scripts\dev_postgres_docker.ps1Qdrant:
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Пример запуска 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 8080cd C:\Projects\GOST_ai
py -3.12 -m uvicorn app.main:app --reload --host 127.0.0.1 --port 8000FastAPI docs:
http://127.0.0.1:8000/docs
cd C:\Projects\GOST_ai\web
npm.cmd run devFrontend:
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Без 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Основные 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 appFrontend build:
cd C:\Projects\GOST_ai\web
npm.cmd run buildapp/ 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 зафиксирован tag:
v0.1-baseline
Это стабильная версия до экспериментов с LoRA.
LoRA-эксперименты планируется вести отдельно от основной ветки, чтобы не смешивать production-local RAG baseline и исследовательское дообучение.
- Улучшить визуальный слой PDF/source preview.
- Добавить больше regression/evaluation сценариев.
- Добавить демонстрационные screenshots в README.
- Подготовить demo corpus без лицензионных ограничений.
- Экспериментально проверить LoRA для стиля ответа и формата инженерных объяснений.
- Подготовить Docker Compose для полного локального запуска.
- Добавить CI для lint/test/build.