Это репозиторий продвинутого RAG-агента, разработанного в рамках хакатона AI for Finance Hack 2025. Наше решение — это не просто чат-бот, а полноценный фреймворк для построения надежных и точных ассистентов, способных решать сложные, многоэтапные ("multi-hop") вопросы.
Система показала высокую производительность, обрабатывая 500 вопросов в среднем за ~15 минут и укладываясь в ~10% от выделенного API-бюджета, при этом генерируя ответы экспертного качества.
Ключевые особенности:
- Агентская Архитектура (FAIR-RAG): Система работает в итеративном цикле, анализируя полноту информации и уточняя поиск.
- Гибридный Поиск (Ensemble Retriever): Использует 4-головый поисковый движок для максимальной полноты и точности.
- Управляемые Стратегии: Поддерживает несколько режимов работы (
ITERATIVE,DECOMPOSE,SIMPLE) для гибкого баланса между скоростью и качеством. - Встроенная Телеметрия: Включает
ResourceManagerдля детального мониторинга производительности и затрат.
В основе системы лежит агентский цикл, управляемый "главным рубильником" в config.py, который позволяет выбрать одну из двух основных стратегий: ITERATIVE (итеративное уточнение) или DECOMPOSE (декомпозиция-и-поиск).
Обе стратегии используют наш кастомный 4-головый EnsembleRetriever:
- Голова A: Семантический поиск (FAISS) с MMR для разнообразия.
- Голова B: Поиск по ключевым словам (TF-IDF).
- Голова C: Поиск по метаданным (FAISS) с MMR.
- Голова D: Иерархический Граф Концептов (NetworkX + KMeans).
Наша архитектура не случайна — она построена на идеях из нескольких state-of-the-art исследовательских работ в области RAG:
-
FAIR-RAG: Faithful Adaptive Iterative Refinement for RAG
- Идея: Превратить RAG в итеративный, агентский цикл, который анализирует "пробелы" в знаниях и уточняет поиск.
- Наш Вклад: Это основа нашей
ITERATIVEстратегии.SeaAgent(аудит доказательств) иRefinementAgent(уточнение запросов) являются прямой реализацией этих идей.
-
GlobalRAG: Enhancing Global Reasoning in Multi-hop QA
- Идея: Для сложных вопросов модель должна сначала составить "глобальный план" (декомпозировать вопрос).
- Наш Вклад: Это основа нашей
DECOMPOSEстратегии.DecompositionAgentсоздает такой "план" в самом начале, что резко повышает качество поиска.
-
Graph-Guided Concept Selection (G2ConS)
- Идея: Построить дешевый, но эффективный граф из "концептов" (ключевых слов) для поиска скрытых связей.
- Наш Вклад: Это прямая основа для нашей "Головы D", которая использует TF-IDF для извлечения концептов и
networkxдля построения графа.
-
LLM-GUIDED HIERARCHICAL RETRIEVAL (LATTICE)
- Идея: Организовать корпус в семантическое дерево и использовать LLM для навигации.
- Наш Вклад: Мы адаптировали эту идею, реализовав Иерархический Граф Концептов — сначала мы находим релевантные "темы" (кластеры), а потом ищем связи внутри них.
-
Chain-of-Conceptual-Thought (CoCT)
- Идея: Заставить LLM думать "концепциями" (
<ТЕЗИС>,<ДЕТАЛИ>), а не просто "шагами". - Наш Вклад: Это стало нашим главным инструментом для улучшения промптов. Все наши агенты и финальный генератор используют CoCT для более структурированных и надежных рассуждений.
- Идея: Заставить LLM думать "концепциями" (
- Python 3.12+
- Зависимости из
requirements.txt - Данные
train_data.csvиquestions.csvв корне проекта.
-
Клонируйте репозиторий и установите зависимости:
git clone [URL-репозитория] cd [название-папки] python -m venv venv source venv/bin/activate # Для Linux/macOS .\venv\Scripts\activate # Для Windows pip install -r requirements.txt
-
Настройте API-ключи:
- Создайте файл
.envв корне проекта. - Пропишите в него ключи:
LLM_API_KEY="sk-..." EMBEDDER_API_KEY="sk-..."
- Создайте файл
-
Для отладки на одном вопросе (рекомендуется):
python debug_single_question.py
Первый запуск будет долгим, так как он создает все поисковые индексы в папке
storage/. -
Для полного прогона (генерация
submission.csv):python main.py
Скрипт поддерживает возобновление работы. Если его прервать, при следующем запуске он продолжит с того же места.
Все основные настройки и "тумблеры" для управления архитектурой находятся в файле config.py. Вы можете изменять его для проведения экспериментов:
STRATEGY:'ITERATIVE'или'DECOMPOSE'. Выбор основной стратегии работы.MAX_ITERATIONS: Количество итераций дляITERATIVEрежима.ENABLE_..._HEAD: Включение/выключение "голов" ретривера.ANALYST_MODEL/GENERATOR_MODEL: Выбор LLM для разных ролей.
main.py: Точка входа для финального прогона.debug_single_question.py: Наш главный инструмент для отладки.prepare_logic.py: Логика создания всех поисковых индексов.build.py: Скрипт для сборки проекта в один файл для сдачи.config.py: Центральный конфигурационный файл.rag_components/: Ядро нашего решения (пайплайн, агенты, ретриверы).utils/: Вспомогательные модули (мониторинг, промпты).
- Не работаем в
developилиmain. - Для каждой задачи создаем новую ветку:
feature/название-задачи. - Коммиты делаем атомарные, по правилам Conventional Commits.
- Изменения вливаем в
developчерез Pull Request с обязательным ревью.
Этот проект — прочный, высокопроизводительный фундамент. Мы видим несколько ключевых направлений для его дальнейшего развития, превращающих его в полноценную SOTA-платформу для агентского RAG.
-
🧠 Гибридный Агентский Пайплайн (Decompose + Iterative):
- Идея: Создать "супер-стратегию", которая сначала декомпозирует сложный вопрос на под-запросы (
Decomposition), а затем для каждого под-запроса запускает наш итеративный FAIR-RAG цикл (Iterative Refinement). - Влияние: Потенциально самый высокий уровень качества и полноты ответов за счет комбинации двух мощных подходов. Основной вызов — оптимизация производительности для укладывания в производственные лимиты.
- Идея: Создать "супер-стратегию", которая сначала декомпозирует сложный вопрос на под-запросы (
-
🤖 Адаптивный Маршрутизатор Стратегий:
- Идея: Вместо ручного переключения
STRATEGYв конфиге, создать "Агента-Маршрутизатора". Этот LLM-агент будет на первом шаге анализировать вопрос и автоматически выбирать, какую из наших стратегий (SIMPLE,DECOMPOSEилиITERATIVE) использовать. - Влияние: Превратит фреймворк в полностью автономную, адаптивную систему, которая сама выбирает оптимальный баланс "скорость/качество" для каждого вопроса.
- Идея: Вместо ручного переключения
-
📊 Динамический Выбор Контекста (Агент-Селектор):
- Идея: Заменить фиксированный
MAX_CONTEXT_DOCSна "Агента-Селектора". Этот LLM будет анализировать топ-50 найденных документов и генерировать список номеров тех, которые являются минимально необходимыми для ответа (идея из статьи DPS). - Влияние: Сделает размер контекста адаптивным и еще более "чистым".
- Идея: Заменить фиксированный
-
🔎 Внедрение Нейросетевого Реранкера:
- Идея: Добавить дополнительный шаг "тонкой очистки" после
EnsembleRetriever. Использовать либо разрешенные API-реранкеры, либо реализовать свой легковесный реранкер наtorch(вдохновляясь статьей EBCAR). - Влияние: Значительно повысит точность (precision) поиска и качество финального контекста, подаваемого в агенты.
- Идея: Добавить дополнительный шаг "тонкой очистки" после
-
🕸️ Обучаемый Граф Концептов:
- Идея: Вместо TF-IDF использовать более продвинутые методы для построения графа, например, эмбеддинги графов (Graph Embeddings) или обучать веса ребер на основе обратной связи от
SeaAgent. - Влияние: Сделает "Голову D" еще более мощным инструментом для multi-hop рассуждений.
- Идея: Вместо TF-IDF использовать более продвинутые методы для построения графа, например, эмбеддинги графов (Graph Embeddings) или обучать веса ребер на основе обратной связи от
-
⚡️ Полный Переход на
asyncio:- Идея: Переписать весь I/O-bound код (API-вызовы, файловые операции) с
ThreadPoolExecutorна нативныйasync/await. - Влияние: Потенциальное ускорение параллельной обработки, особенно при масштабировании до десятков и сотен одновременных запросов. Снижение потребления ресурсов по сравнению с потоками.
- Идея: Переписать весь I/O-bound код (API-вызовы, файловые операции) с
-
🧪 Расширение Системы Тестирования:
- Идея: Реализовать полноценный фреймворк для юнит-тестирования с
unittest.mock. Создать "золотой" датасет для регрессионного тестирования качества ответов. Настроить CI/CD для автоматического прогона тестов. - Влияние: Повысит стабильность и надежность проекта при дальнейших доработках.
- Идея: Реализовать полноценный фреймворк для юнит-тестирования с
- [Роман/Runoi] - Архитектор, ML Engineer
- [Никита] - AI Quality & Prompt Lead
Этот проект был создан с любовью и большим количеством API-вызовов в рамках AI for Finance Hack 2025.