Решение для домашнего задания RAG-Challenge, моделирующего участие в Enterprise RAG Challenge.
Система реализует Retrieval-Augmented Generation (RAG) для ответов на вопросы по годовым отчётам компаний в формате PDF.
Лучший результат:
- Score: 90.9
- Submission:
Khrisankova_v6 - Метрика: автоматическая проверка leaderboard’а
Решение построено как классический RAG-пайплайн:
-
Извлечение текста из PDF
- Используется
PyMuPDF (fitz) - Текст извлекается постранично
- Для каждой страницы сохраняются
pdf_sha1иpage_index
- Используется
-
Чанкинг
- Каждая страница режется на смысловые чанки
- Размер чанка: ~1500 символов
- Overlap: ~250 символов
- Это улучшает recall и точность ссылок
-
Индексирование
- Sentence embeddings:
sentence-transformers/all-MiniLM-L6-v2 - Векторный индекс:
FAISS (IndexFlatIP) - Используется cosine similarity (через нормализацию эмбеддингов)
- Sentence embeddings:
-
Retrieval + Rerank
- Первичный поиск: FAISS (top-N кандидатов)
- Переранжирование:
cross-encoder/ms-marco-MiniLM-L-6-v2 - Это значительно повышает precision на сложных вопросах
-
Answer extraction
- Числовые вопросы: извлечение чисел с учётом масштабов (
thousands / millions / billions) - Boolean-вопросы:
yes / noбез угадывания - Name-вопросы: выбор компании
- Поддержка сравнений (
highest / lowest / max / min) между компаниями
- Числовые вопросы: извлечение чисел с учётом масштабов (
-
Формирование сабмишна
- Автоматическая генерация
submission_<surname>_<version>.json - Без ручных правок
- Автоматическая генерация
- Использование cross-encoder rerank поверх FAISS
- Якоря финансовых метрик (
revenue,net income,earnings,income attributable) - Корректная стратегия для вопросов вида
“Which company had the highest …” - Строгие fallback-правила (лучше вернуть
no/N/A, чем угадывать) - References берутся только из реально использованных чанков
rag_challenge/
├── data/
│ ├── pdfs/ # PDF-документы (годовые отчёты)
│ └── questions.json # список вопросов
├── work/
│ ├── chunks.jsonl
│ ├── chunks_v2.jsonl
│ ├── index.faiss
│ ├── index_v2.faiss
│ ├── meta.jsonl
│ └── meta_v2.jsonl
├── main.py # основной скрипт
├── requirements.txt
└── README.md
версия:
Python 3.10+
pip install -r requirements.txtfaiss-cpu
sentence-transformers
torch
numpy
tqdm
pymupdfpython main.py --mode extractpython main.py --mode chunk_v2python main.py --mode index_v2python main.py --mode retrieve_v2_rr --query "Which company had the highest net income in 2022?"python main.py --mode submit \
--email your_email@example.com \
--surname Khrisankova \
--version v6На выходе будет создан файл:
submission_Khrisankova_v6.json
Сабмишн отправляется через API:
http://5.35.3.130:800/docs
- OCR не используется (все PDF текстовые)
- Не используются LLM для генерации текста — только extraction
- Решение полностью воспроизводимо локально
- Ответы формируются строго на основе retrieval
- Score: 90.9
- Стабильная работа без ручных правок
- Соответствие всем требованиям задания
Khrisankova Enterprise RAG Challenge (Home Assignment)