Skip to content
 
 

Repository files navigation

RAG Search: Поиск по новостям Lenta.ru

Учебный RAG на TF-IDF: данные → чанки → индекс → поиск → ответ с источниками.


Требования


Быстрый старт

# 1. Создание окружения и установка зависимостей
uv venv
uv sync

# 2. Сборка индекса (загрузка данных → нарезка на чанки → TF-IDF)
uv run python scripts/build_index.py

# 3. Запуск веб-интерфейса
uv run streamlit run app/main.py

После запуска откройте в браузере: http://localhost:8501


Данные

Параметр Значение
Источник Lenta.ru News Dataset
Ссылка https://github.com/yutkin/Lenta.Ru-News-Dataset
Количество документов 1500
Количество чанков 6151
Период 2010 и позже
Язык Русский

Что индексируется

  • Текст новостей (поле text)

Метаданные (показываются в интерфейсе)

  • name — заголовок новости
  • date — дата публикации
  • url — ссылка на источник
  • topic — тема новости

Демо-вопросы

Вопрос Тип Ожидание
Путин положительный ответ + источник
экономика положительный ответ + источник
космонавты МКС положительный ответ + источник
Золушка отрицательный (negative) отказ

Пример ответа на запрос "Путин"

Найденные фрагменты:
🟢 [1] doc_id=313801 | score=0.3865
   Дата: 2010/01/01
   Источник: https://lenta.ru/news/2010/01/01/charges/
   Текст: Американский суд в четверг, 31 декабря, снял обвинения...

Улучшения (для 10 баллов)

  • 🧠 Sentence Transformers — поиск по смыслу (эмбеддинги) вместо TF-IDF
  • 🟢🟡🔴 Цветные индикаторы релевантности
  • 📅 Дата публикации
  • 🔗 Ссылка на источник
  • 🇷🇺 Русскоязычный интерфейс
  • 📊 Датасет 1500+ новостей

Проверка из консоли

# Запуск всех тестов
uv run pytest tests/ -v

# Проверка поиска (итерация 5)
uv run python scripts/check_retrieval.py

# Проверка demo-ответа (итерация 6)
uv run python scripts/check_generator.py

Результаты тестов

============================== 15 passed in 0.86s ==============================

Структура проекта

rag-tutorial/
├── app/                    # Основной код RAG
│   ├── config.py           # Конфигурация (пути, top_k, размер чанка)
│   ├── chunker.py          # Нарезка текста на чанки
│   ├── retriever.py        # TF-IDF поиск + cosine similarity
│   ├── generator.py        # Формирование demo-ответа
│   ├── prompts.py          # Правила ответа и отказы
│   └── main.py             # Streamlit UI (с улучшениями)
├── scripts/                # Скрипты сборки индекса
│   ├── ingest.py           # Загрузка данных
│   ├── build_index.py      # Построение TF-IDF индекса
│   ├── check_retrieval.py  # Проверка поиска
│   └── check_generator.py  # Проверка ответа
├── data/
│   ├── raw/                # Исходные данные (datasets.json)
│   ├── processed/          # Промежуточные файлы (documents.jsonl, chunks.jsonl)
│   └── index/              # Индекс (vectorizer.pkl, matrix.npz, chunks.jsonl)
├── tests/                  # Тесты (15 тестов, все green)
├── doc/                    # Документация (планирование, DATA.md)
└── homework/               # Домашнее задание (SUBMISSION.md)

Пересборка индекса

После изменения data/raw/datasets.json:

uv run python scripts/build_index.py

Ограничения MVP

  • Поиск по словам (TF-IDF), не по смыслу — синонимы могут не находиться
  • Demo-режим: ответ из найденных чанков, без внешней LLM
  • Индексируется только текст описаний, CSV не используется

Лицензия

Учебный проект. Данные Lenta.ru используются для исследовательских целей.

Скриншоты работы

Поиск по запросу "Путин"

Путин результат 1 Путин результат 2 Путин результат 3

Поиск по запросу "экономика"

экономика результат 1 экономика результат 2

Поиск по запросу "космонавты МКС"

космонавты результат 1 космонавты результат 2

Negative-запрос "Золушка" (отказ)

отказ

About

Домашнее задание по Рагу (Каримова КХ)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages