Локальная RAG-система (Retrieval-Augmented Generation) для интеллектуального поиска по документам, веб-страницам или изображениям с ответами на естественном языке.
- Индексация документов: PDF, DOCX, TXT, MD
- Индексация изображений: JPG, PNG
- Индексация веб-страниц: URL или HTML-файл
- RAG-поиск: поиск по смыслу + генерация ответа LLM на основе найденных фрагментов
- Векторный поиск без LLM: поиск по смыслу в векторной базе данных без вызова LLM
- Источники: каждый ответ сопровождается ссылками на конкретные файлы
- Интерфейса: веб-интерфейс, CLI, REST API
- Локальные эмбеддинги: модель
multilingual-e5-largeработает локально, данные не уходят внешним сервисам при индексации - Локальный image-to-text: модель
Huihui-Qwen3.5-0.8B-abliteratedработает локально, данные не уходят внешним сервисам при индексации. Модель на базе легковесной QWEN3.5 с ослабленой цензурой - Фоновая индексация: документы индексируются в фоновом потоке, не блокируя API
- Python 3.10+
- CUDA (опционально, для ускорения эмбеддингов)
- LLM API с OpenAI-совместимым интерфейсом
# Клонирование репозитория
git clone https://github.com/eugenegantz/rag-search.git ./rag
cd rag
# Установка зависимостей
pip install -r requirements.txtМодели эмбеддингов должны скачаться самостоятельно при первом запуске.
Файлы модели расположены в директори models/
Пустой файл конфигурации создается при первом запуске app_config/config.py.
В нем необходимо настроить параметры веб-сервера и параметры подключения к поставщику LLM. Подробные комментарии будут внутри.
config = {
"openai": {
"base_url": "https://api.provider.ai/coding/v1/",
"api_key": "akjznak...kzmqu",
"default_headers": {
"User-Agent": "MyAppName/1.0"
}
},
"daemon": {
"host": "127.0.0.1",
"port": 8367,
}
}python cli.py daemon startWindows: чтобы работала команда rag необходимо внести директорию в переменную PATH.
Демон запустится на http://127.0.0.1:8367 и загрузит модели эмбеддингов (~10-30 сек).
# Проверить статус
python cli.py daemon status
# Индексация документов
python cli.py index add document.pdf report.docx notes.txt
# Список индексированных файлов
python cli.py index list
# Поиск по смыслу среди индексированных файлов
python cli.py index query "Запрос"
# Удалить файл из индекса
python cli.py index remove document.pdf
# Поиск (RAG)
python cli.py ask "Какие инструменты ИИ используются в компании?"
# Вывод в JSON
python cli.py ask "вопрос" --json
# Остановка демона
python cli.py daemon stopОткройте http://127.0.0.1:8367 в браузере:
- Поиск (
/): задавайте вопросы и получайте ответы с источниками - Добавление документов (
/add): добавляйте файлы по пути (можно несколько, по одному на строку)
| Метод | Эндпоинт | Описание |
|---|---|---|
| GET | /api/v1/health |
Проверка состояния |
| POST | /api/v1/search |
RAG-поиск |
| POST | /api/v1/context/query |
Векторный поиск чанков без LLM |
| POST | /api/v1/index/add |
Добавить файл в индексацию |
| GET | /api/v1/index/get |
Список проиндексированных файлов |
| GET | /api/v1/index/query |
Векторный поиск по файлам |
| POST | /api/v1/index/remove |
Удалить файл из индексации |
| POST | /api/v1/shutdown |
Остановить демон |
# RAG-поиск
curl -X POST http://localhost:8367/api/v1/search \
-H "Content-Type: application/json" \
-d '{"query": "вопрос", "top_k": 10}'
# Добавление документа
curl -X POST http://localhost:8367/api/v1/index/add \
-H "Content-Type: application/json" \
-d '{"filepath": ["/path/to/file.pdf"]}'| Формат | Описание |
|---|---|
.txt, .md |
Текстовые файлы UTF-8 |
.docx |
Документы Microsoft Word |
.pdf |
PDF-документы |
.html |
HTML-страницы |
.png, .jpeg, .jpg |
Изображения |
https://domain.com/page |
Веб-страницы |
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ CLI │ │ Web │ │ API │
│ (Typer) │ │ (HTML/JS) │ │ (HTTP) │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
└───────────────────┼───────────────────┘
│ HTTP
┌──────┴──────┐
│ Daemon │
│ (FastAPI) │
└──────┬──────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ ChromaDB │ │ e5-large │ │ │
│ (векторная │ │ (эмбеддинги,│ │ LLM │
│ база) │ │ локально) │ │ │
└─────────────┘ └─────────────┘ └─────────────┘
rag-test-01/
├── app_config/ # Конфигурация
├── core/ # Классы, утилиты и т.д.
├── db/ # База данных ChromaDB
├── models/ # Локальные ML-модели
├── static/ # Веб-интерфейс
├── cli.py # CLI-клиент
├── client.py # HTTP-клиент
├── daemon.py # Backend (FastAPI)
└── index.py # Точка входа для веба
- Индексация: документ разбивается на чанки (<=1024 символа), каждый чанк векторизуется моделью e5-large и сохраняется в ChromaDB
- Поиск: запрос пользователя векторизуется той же моделью, в ChromaDB ищутся ближайшие чанки
- Контекст: найденные чанки дополняются соседними для лучшего понимания
- Генерация: LLM получает промпт с контекстом и вопросом, генерирует ответ
- Источники: ответ содержит markdown + JSON-ссылки на использованные документы