Учебный RAG на TF-IDF: данные → чанки → индекс → поиск → ответ с источниками.
- Python 3.10+
- uv (https://docs.astral.sh/uv/)
# 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 декабря, снял обвинения...
- 🧠 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- Поиск по словам (TF-IDF), не по смыслу — синонимы могут не находиться
- Demo-режим: ответ из найденных чанков, без внешней LLM
- Индексируется только текст описаний, CSV не используется
Учебный проект. Данные Lenta.ru используются для исследовательских целей.







