Гибридная RAG-система для поиска информации и генерации ответов по документам
Интерфейс AURA для поиска информации по документам с использованием гибридного RAG-пайплайна.
AURA — Augmented Universal Retrieval Assistant — гибридная RAG-система для поиска релевантной информации в корпусе документов и генерации ответа на основе найденного контекста.
Проект разработан в рамках хакатона «Альфа-Будущее» от Альфа-Банка.
AURA объединяет несколько подходов к поиску:
- семантический поиск по эмбеддингам;
- лексический поиск с помощью TF-IDF;
- гибридное объединение результатов;
- повторное ранжирование документов с помощью Cross-Encoder;
- генерацию ответа на основе выбранных фрагментов;
- интерактивный интерфейс на Gradio.
Основная идея системы — использовать быстрый поиск для отбора кандидатов, а затем более точную модель для финальной сортировки найденных документов.
- Гибридный поиск по документам: FAISS + TF-IDF.
- Семантический поиск по смыслу пользовательского запроса.
- Лексический поиск по точным совпадениям терминов.
- Cross-Encoder reranking для улучшения порядка найденных фрагментов.
- Генерация ответа на основе релевантного контекста.
- Интерактивный веб-интерфейс на Gradio.
- Настраиваемый retrieval-пайплайн через
.env.
На этапе индексации система:
- загружает исходный корпус документов;
- очищает и нормализует текст;
- разбивает документы на чанки;
- строит плотные векторные представления;
- создаёт FAISS-индекс;
- формирует TF-IDF-представление корпуса.
При обработке пользовательского запроса система:
- строит embedding запроса;
- выполняет поиск в FAISS;
- преобразует запрос через TF-IDF;
- выполняет лексический поиск;
- объединяет результаты двух методов;
- повторно ранжирует кандидатов;
- выбирает Top-K чанков;
- генерирует ответ по найденному контексту.
Исходные документы очищаются и приводятся к единому формату.
На этом этапе выполняются:
- очистка текста;
- удаление лишних символов;
- нормализация строк;
- подготовка данных к дальнейшему разбиению.
Документы разбиваются на небольшие смысловые фрагменты — чанки.
Это позволяет:
- находить конкретные части документов;
- уменьшать объём нерелевантного контекста;
- не передавать в языковую модель весь документ;
- повысить точность retrieval-пайплайна.
Для семантического поиска используется embedding-модель:
ai-forever/ru-en-RoSBERTa
Каждый чанк преобразуется в плотный вектор.
Для поиска ближайших документов используется FAISS.
Dense Retrieval позволяет находить:
- документы, близкие по смыслу;
- перефразированные формулировки;
- тематически связанные фрагменты;
- ответы без полного совпадения ключевых слов.
Для лексического поиска используется TF-IDF из библиотеки Scikit-learn.
TF-IDF учитывает точные совпадения слов между запросом и документами.
Этот подход особенно полезен для поиска:
- названий продуктов;
- финансовых терминов;
- аббревиатур;
- числовых значений;
- точных формулировок.
Результаты FAISS и TF-IDF объединяются в единую оценку релевантности.
hybrid_score =
alpha × dense_score
+ (1 - alpha) × sparse_score
где:
dense_score— оценка семантической близости;sparse_score— оценка TF-IDF;alpha— вес семантического поиска.
Гибридный поиск объединяет преимущества двух подходов.
| Метод | Преимущество | Ограничение |
|---|---|---|
| FAISS | Находит документы по смыслу | Может пропускать точные термины |
| TF-IDF | Находит точные совпадения | Не учитывает перефразирование |
| Hybrid Search | Объединяет оба сигнала | Требует настройки веса alpha |
После первичного поиска лучшие кандидаты передаются Cross-Encoder модели:
DiTy/cross-encoder-russian-msmarco
Модель получает пару:
(query, chunk)
и вычисляет итоговую оценку релевантности.
Cross-Encoder анализирует запрос и документ совместно, поэтому обеспечивает более точную сортировку, чем поиск только по близости эмбеддингов.
Reranking позволяет:
- улучшить порядок документов;
- убрать менее релевантные результаты;
- повысить качество Top-K;
- передать языковой модели более точный контекст.
После reranking выбираются лучшие чанки.
Top-K chunks → Context → LLM → Answer
Найденные документы объединяются в контекст, который передаётся языковой модели.
Ответ формируется на основе информации из выбранных фрагментов корпуса.
ai-forever/ru-en-RoSBERTa
Используется для:
- кодирования документов;
- кодирования пользовательских запросов;
- семантического поиска.
DiTy/cross-encoder-russian-msmarco
Используется для повторной сортировки документов после гибридного поиска.
HuggingFaceTB/SmolLM3-3B
Используется для генерации итогового ответа на основе найденного контекста.
AURA/
│
├── data/
│ ├── raw/
│ ├── processed/
│ └── chunks/
│
├── images/
│ ├── interface.png
│ ├── indexing_pipeline.png
│ └── query_pipeline.png
│
├── scores/
│
├── src/
│ ├── chunking/
│ ├── config/
│ ├── data_preprocessing/
│ ├── embeddings/
│ ├── evaluation/
│ ├── pipeline/
│ │ └── rag_pipeline.py
│ ├── vector_store/
│ └── main.py
│
├── queries_rag_results.csv
├── requirements.txt
└── README.md
| Категория | Технологии |
|---|---|
| Язык | Python |
| NLP | Transformers, Sentence Transformers |
| Vector Search | FAISS |
| Sparse Retrieval | TF-IDF, Scikit-learn |
| Data Processing | Pandas, NumPy |
| Interface | Gradio |
| LLM Integration | Hugging Face |
git clone https://github.com/Eg0Mak/AURA.git
cd AURALinux / macOS:
python3 -m venv .venv
source .venv/bin/activateWindows:
python -m venv .venv
.venv\Scripts\activatepip install --upgrade pip
pip install -r requirements.txtПри первом запуске используемые модели будут загружены автоматически.
Исходные данные необходимо разместить в директории:
data/raw/
Pipeline выполняет:
- загрузку исходного корпуса;
- предварительную обработку;
- сохранение очищенных данных;
- разбиение документов на чанки;
- построение эмбеддингов;
- создание FAISS-индекса;
- построение TF-IDF-представления.
Создайте файл .env в корневой директории проекта.
Пример конфигурации:
# === Пути данных ===
RAW_DATA_DIR=data/raw
PROCESSED_DATA_DIR=data/processed
CHUNKS_DIR=data/chunks
# === Настройки RAG ===
TOP_K_RERANK=5
FAISS_TOP_N=11
TFIDF_TOP_N=11
CHUNK_SIZE=600
CHUNK_OVERLAP=100
HYBRID_ALPHA=0.6
# === Модели ===
EMBEDDING_MODEL_NAME=ai-forever/ru-en-RoSBERTa
RERANK_MODEL_NAME=DiTy/cross-encoder-russian-msmarco
LLM_MODEL_NAME=HuggingFaceTB/SmolLM3-3B| Переменная | Значение по умолчанию | Описание |
|---|---|---|
RAW_DATA_DIR |
data/raw |
Директория с исходными данными |
PROCESSED_DATA_DIR |
data/processed |
Директория с очищенными данными |
CHUNKS_DIR |
data/chunks |
Директория для сохранения чанков |
TOP_K_RERANK |
5 |
Количество документов, возвращаемых после Cross-Encoder reranking |
FAISS_TOP_N |
11 |
Количество кандидатов, получаемых из FAISS |
TFIDF_TOP_N |
11 |
Количество кандидатов, получаемых с помощью TF-IDF |
CHUNK_SIZE |
600 |
Максимальный размер одного чанка |
CHUNK_OVERLAP |
100 |
Размер пересечения между соседними чанками |
HYBRID_ALPHA |
0.6 |
Вес семантической оценки при объединении FAISS и TF-IDF |
EMBEDDING_MODEL_NAME |
ai-forever/ru-en-RoSBERTa |
Модель для построения эмбеддингов документов и запросов |
RERANK_MODEL_NAME |
DiTy/cross-encoder-russian-msmarco |
Cross-Encoder модель для повторного ранжирования кандидатов |
LLM_MODEL_NAME |
HuggingFaceTB/SmolLM3-3B |
Языковая модель для генерации итогового ответа |
Значение HYBRID_ALPHA=0.6 означает, что при гибридном поиске больший вес получает семантическая оценка FAISS, а оставшаяся часть приходится на TF-IDF:
hybrid_score =
0.6 × dense_score
+ 0.4 × sparse_score
Размер чанка и пересечение между соседними фрагментами задаются параметрами CHUNK_SIZE и CHUNK_OVERLAP.
Запустите Gradio-интерфейс из корневой директории проекта:
python -m src.mainПосле инициализации моделей в терминале появится адрес локального веб-интерфейса.
Через интерфейс можно:
- вводить пользовательские запросы;
- получать ответы от RAG-системы;
- просматривать историю диалога;
- очищать текущий чат.
import asyncio
from src.pipeline.rag_pipeline import RAGPipeline
async def main() -> None:
pipeline = RAGPipeline()
pipeline.load()
query = "Какие условия действуют по кредитной карте?"
answer = await pipeline.run_pipeline(query)
print(answer)
if __name__ == "__main__":
asyncio.run(main())Параметр HYBRID_ALPHA определяет баланс между семантическим и лексическим поиском.
Больший вес FAISS:
HYBRID_ALPHA=0.8Равный вклад обоих методов:
HYBRID_ALPHA=0.5Больший вес TF-IDF:
HYBRID_ALPHA=0.3Оптимальное значение зависит от структуры корпуса и типов пользовательских запросов.
В проекте предусмотрен модуль оценки retrieval-пайплайна.
Для анализа качества поиска могут использоваться следующие метрики.
Показывает, найден ли хотя бы один релевантный документ среди первых K результатов.
Hit@K = 1, если релевантный документ найден в Top-K
Hit@K = 0, если релевантный документ не найден
Показывает долю релевантных документов, попавших в Top-K.
Recall@K =
количество найденных релевантных документов
/
общее количество релевантных документов
Показывает долю релевантных документов среди первых K результатов.
Precision@K =
количество релевантных документов в Top-K
/
K
Оценивает позицию первого релевантного документа.
MRR = mean(1 / rank)
где rank — позиция первого релевантного результата.
Семантический поиск хорошо работает с перефразированными запросами, но может пропускать точные термины.
TF-IDF хорошо находит совпадения слов, но не учитывает общий смысл запроса.
Например, запрос:
Льготный период по карте Alfa Travel
содержит одновременно:
- точное название продукта;
- финансовый термин;
- смысловую формулировку вопроса.
FAISS помогает находить документы по смыслу, а TF-IDF сохраняет чувствительность к точным словам.
На первом этапе необходимо быстро найти кандидатов среди большого количества документов.
Для этого используются FAISS и TF-IDF.
На втором этапе Cross-Encoder более точно оценивает уже ограниченный набор найденных чанков.
Fast Retrieval → Accurate Reranking
Такой подход позволяет сохранить приемлемую скорость поиска и повысить качество финальной выдачи.
AURA реализует полный RAG-пайплайн: от подготовки документов и построения индексов до гибридного поиска, reranking и генерации ответа.
Проект демонстрирует практическое применение современных NLP-подходов для поиска информации в документах и построения интерактивного ассистента на базе retrieval-augmented generation.


