Данный проект представляет собой агрегатор новостей с возможностью семантического и классического поиска, переранжировки результатов и генерации итоговых ответов с помощью LLM-моделей. Проект автоматизирует сбор новостей из заданных RSS-источников, последующую индексацию, а также интеграцию со стеком LangChain + Chromadb + VoyageAI Embeddings для реализации продвинутых сценариев поиска и анализа.
-
Сбор новостей из RSS:
Поддерживаются несколько популярных русскоязычных новостных ресурсов (Лента.ру, РБК, ТАСС, РИА Новости, Ведомости). Новости скачиваются, предварительно обрабатываются и сохраняются в формате parquet. -
Преобразование и обработка данных:
- Очистка текстов от лишних символов.
- Хранение данных по датам.
- Индексация новостных документов в Chromadb с использованием VoyageAI Embeddings для дальнейшего семантического поиска.
-
Семантический поиск (Chroma + Embeddings):
Возможность искать документы по смыслу запроса, а не просто по ключевым словам. -
Классический поиск (BM25):
Для сравнения результатов можно использовать классический поиск по терминам. -
Комбинированный поиск:
Объединение результатов из Chroma (семантика) и BM25 (термы) с последующей дедупликацией. -
Переранжировка результатов (Rerank):
С помощью VoyageAIRerank модели можно улучшить порядок выдачи, выбирая самые релевантные документы. -
Генерация итогового ответа (Answer Endpoint):
Использование ChatOpenAI (LangChain chain) для формирования итогового ответа на основе выбранных документов. Запрос может быть:- «Какие сегодня есть события (новости), упоминающие ФИО?»
- «Выведи полный текст новостей о [персоне/событии]»
Итоговый ответ формируется без выдумок и содержит только фактическую информацию из найденных источников.
-
Автоматизация процесса:
Вся логика (от загрузки новостей до получения ответа от LLM) может быть выстроена в автоматическом pipeline, доступном через REST API.
- Язык: Python
- Фреймворк: FastAPI
- База данных векторов: Chromadb
- LLM и эмбеддинги: LangChain, VoyageAI Embeddings, ChatOpenAI
- Классический поиск: BM25
- Хранилище данных: Parquet-файлы
Все эндпоинты доступны под роутером APIRouter
.
GET /rss/{source}
Позволяет загрузить новости из выбранного источника. Параметр {source}
может быть: lenta
, rbc
, tass
, ria
,
vedomosti
, all
.
Пример:
GET /rss/lenta
– загрузка новостей с Ленты.ру.
Ответ: JSON со списком новостей, содержащих поля text
, link
, published
, source
.
POST /search_chroma
Делает поиск по векторному хранилищу с использованием VoyageAI Embeddings.
Формат запроса (JSON):
{
"query": "Запрос пользователя",
"dates": [
"2024-12-19"
],
"sources": [
"rbc",
"tass"
],
"n": 10
}
Ответ: список объектов, каждый из которых содержит text
и link
найденных документов.
POST /search_bm_25
Делает поиск по ключевым словам с использованием BM25.
Формат запроса и ответ: аналогичен /search_chroma
.
POST /search
Объединяет результаты из Chroma и BM25, устраняя дубли.
Формат запроса и ответ: аналогичен вышеописанным эндпоинтам.
POST /search_and_rerank
Сначала ищет расширенный список результатов (n_big
), а затем с помощью VoyageAIRerank отбирает топ-результаты (
n_small
).
Формат запроса (JSON):
{
"query": "Запрос пользователя",
"dates": [
"2024-12-19"
],
"sources": [
"rbc"
],
"n_big": 20,
"n_small": 5
}
Ответ: Список из n_small
наилучших результатов после переранжировки.
POST /answer
Выполняет поиск, затем переранжировку, а затем использует LLM для создания итогового ответа, учитывая факты из найденных
документов.
Формат запроса (JSON): аналогичен /search_and_rerank
.
Ответ:
{
"answer": "Сформированный итоговый ответ",
"results": [
{
"text": "Текст новости",
"link": "URL"
},
]
}
GET /available_dates
Возвращает список дат, за которые есть сохранённые данные.
Ответ: список дат в ISO формате (YYYY-MM-DD).
-
Запустите проект с помощью команды:
docker-compose up
-
После этого потребуется подождать, пока образ соберется, а затем загрузится модель (в зависимости от размера, 8 ГБ или 3 ГБ). Этот процесс может занять некоторое время.
-
В случае недостаточного объема оперативной памяти, добавьте переменную окружения:
export LOWMEM=true
-
После этого перезапустите проект с помощью команды:
docker-compose up
Обратите внимание, что при использовании этой опции качество работы модели может снизиться, и ответы могут быть менее точными.
-
Перейдите на фронтенд проекта, открыв браузер по адресу:
http://127.0.0.1:7860/
Теперь проект готов к использованию!