Бенчмарк-система для сравнения конфигураций RAG-пайплайна на датасете vectara/open_ragbench. Оценивается влияние стратегии чанкинга, размера чанка, режима поиска и top-k на качество retrieval и генерации.
HuggingFace Dataset
│
▼
dataset.py ← загрузка и подготовка корпуса (100 запросов + документы)
│
▼
indexing.py ← индексация в Qdrant (dense / hybrid с BM25)
│
▼
pipeline.py ← выполнение RAG-запроса (retrieval → LLM → ответ)
│
▼
evaluation.py ← метрики retrieval (Hit Rate, MRR, nDCG, Precision)
│
▼
ragas_eval.py ← оценка генерации (Factual Correctness, LLM-as-a-Judge)
│
▼
generate_report.py ← PDF-отчёт с таблицами и графиками
| Компонент | Технология |
|---|---|
| Векторная БД | Qdrant (HNSW, гибридный поиск с BM25) |
| Эмбеддинги | intfloat/multilingual-e5-small (384-dim) |
| LLM | Qwen3.5-4B-UD-Q4_K_XL через llama.cpp |
| RAG-фреймворк | LlamaIndex |
| Оценка генерации | RAGAS (Factual Correctness) |
10 конфигураций варьируют параметры:
- Метод чанкинга: token / sentence
- Размер чанка: 256 / 512 / 1024
- Режим поиска: dense / hybrid
- Top-k: 3 / 5 / 10
Конфигурации задаются в configs/experiments.yaml.
- Python >= 3.11
- Docker и Docker Compose
- NVIDIA GPU (для llama.cpp)
python -m venv .venv
source .venv/bin/activate
pip install -e .# Поднять llama.cpp (LLM) и Qdrant (векторная БД)
docker compose up -dСкачать модель в models/:
# ~2.7 ГБ
wget -P models/ https://huggingface.co/unsloth/Qwen3.5-4B-UD-Q4_K_XL-GGUF/resolve/main/Qwen3.5-4B-UD-Q4_K_XL.ggufpython scripts/run_all.pyРезультаты сохраняются в results/ в формате JSON.
Запускается отдельно после экспериментов (требует OpenAI API-ключ в .env):
python -c "from src.ragas_eval import run_ragas_eval; ..."python generate_report.pyPDF-отчёт сохраняется в results/report.pdf.
├── configs/
│ └── experiments.yaml # конфигурации экспериментов
├── data/
│ └── dataset.json # подготовленный датасет
├── models/
│ └── *.gguf # файлы моделей (не в git)
├── notebooks/
│ └── analysis.ipynb # анализ результатов
├── results/ # результаты экспериментов, графики, отчёт
├── scripts/
│ └── run_all.py # точка входа
├── src/
│ ├── dataset.py # загрузка данных
│ ├── indexing.py # индексация в Qdrant
│ ├── pipeline.py # RAG-пайплайн
│ ├── evaluation.py # метрики retrieval
│ ├── ragas_eval.py # метрики генерации
│ └── utils.py # конфигурация моделей
├── docker-compose.yml
└── pyproject.toml
- Гибридный поиск (dense + BM25) превосходит dense на ~15% по section MRR
- Оптимальный размер чанка — 512 токенов (баланс retrieval/generation)
- Sentence-чанкинг улучшает качество генерации для малых размеров чанков