https://github.com/ark2016/alfa-mfti-rag
Альфа-Банк × МФТИ — RAG по базе знаний (Recall-L). Пайплайн retrieval→rerank→HyDE→LoRA Qwen3.6-27B + разбор вырожденной метрики.
https://github.com/ark2016/alfa-mfti-rag
Last synced: 12 days ago
JSON representation
Альфа-Банк × МФТИ — RAG по базе знаний (Recall-L). Пайплайн retrieval→rerank→HyDE→LoRA Qwen3.6-27B + разбор вырожденной метрики.
- Host: GitHub
- URL: https://github.com/ark2016/alfa-mfti-rag
- Owner: ark2016
- Created: 2026-06-18T16:03:50.000Z (about 1 month ago)
- Default Branch: main
- Last Pushed: 2026-06-18T16:26:55.000Z (about 1 month ago)
- Last Synced: 2026-06-18T18:15:37.358Z (about 1 month ago)
- Language: Python
- Size: 25.4 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# RAG-ответы по базе знаний
Вопросно-ответная система над базой знаний alfabank.ru: по 6977 вопросам нужно сгенерировать ответы, опираясь на 1937 страниц сайта (`websites.csv`). Метрика — **Recall-L = BERTScore-Recall × штраф за длину**.
## Идея решения
Полный open-source RAG-пайплайн, целиком работающий на одной H100:
1. **Чанкинг** страниц (~700 символов с перекрытием) → ~25 тыс. фрагментов.
2. **Гибридный retrieval**: BM25 + плотные эмбеддинги `bge-m3` (FAISS), объединение кандидатов → top-100.
3. **Реранкинг** кросс-энкодером `bge-reranker-v2-m3` → top-10.
4. **HyDE**: LLM генерит гипотетический ответ и переформулировки запроса, затем повторный retrieval по расширенному набору поисковых строк и финальный реранк.
5. **Генерация** — `Qwen3.6-27B` zero-shot через vLLM (ngram speculative decoding для скорости), reasoning-режим выключен, чтобы длинные ``-блоки не раздували длину. В коде предусмотрена опциональная ветка дообучения лёгкой 9B-модели (LoRA-SFT для формы ответа и детекции «нет ответа») с каскадным объединением её с 27B (скрипты `06`–`07` и `orchestrate` в постобработке); финальные ответы получены на 27B без дообучения.
6. **Постобработка**: answerability-гейт по score реранкера, нормализация формулировок отказа, срез по длине, чистка разметки.
Все модели open-source (Qwen — Apache 2.0; bge). Бюджет первого прогона на H100 — около $7.
## Что важно для качества
Метрика поощряет полноту ответа и штрафует избыточную длину — отсюда инженерные приоритеты пайплайна:
- высокая полнота за счёт гибридного retrieval (BM25 + dense) и реранкинга, плюс HyDE для «кривых» формулировок;
- контроль длины ответа в постобработке (срез по длине, smart-truncate);
- отказ «Нет ответа» только тогда, когда retrieval действительно не дал релевантных фрагментов.
## Запуск
На H100 (Ubuntu 22.04, CUDA 12.4+):
```bash
bash setup_env.sh
source .venv/bin/activate
python src/01_chunk.py
python src/02_build_indexes.py
python src/03_retrieve.py
python src/04_rerank.py
python src/05_query_rewrite_hyde.py
python src/05b_retrieve_hyde.py
python src/04_rerank.py # повторный реранк по hyde-расширенным кандидатам
python src/06_prepare_lora_data.py
python src/07_train_lora.py
python src/08_inference.py
python src/09_postprocess.py # → artifacts/submission.csv
```
Пути и модели переопределяются через ENV (см. `src/config.py`): `GENERATOR_MODEL`, `ENSEMBLE_BIG_MODEL`, `EMBEDDER_MODEL`, `TAU_RERANK`, `ENABLE_THINKING`. `run_chain.sh` запускает хвост пайплайна (с повторного реранка 04) одной командой.
## Соответствие ТЗ
- Только open-source модели и библиотеки (Qwen, bge, FlagEmbedding, vLLM, PEFT/TRL).
- В качестве знаний — предоставленная база (`websites.csv`), внешних источников нет.