Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions IMPROVEMENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Улучшения MVP

## Реализованные улучшения (для оценки "Отлично")

| Улучшение | Описание | Статус |
|-----------|----------|--------|
| 🟢🟡🔴 Цветные индикаторы | Зеленый (score ≥ 0.3), желтый (score ≥ 0.15), красный (score < 0.15) | ✅ Реализовано |
| 📅 Дата публикации | Отображение даты каждого источника | ✅ Реализовано |
| 🔗 Ссылка на источник | Прямая ссылка на оригинал новости | ✅ Реализовано |
| 🇷🇺 Русскоязычный интерфейс | Полная локализация на русский язык | ✅ Реализовано |
| 📊 Большой датасет | 1500 документов вместо 9 демо-записей | ✅ Реализовано |

## План внедрения дополнительных улучшений

### 1. Автообновление данных
- **Зачем:** Для работы с актуальными новостями
- **Что менять:** Добавить скрипт `scripts/update_data.py`
- **Как проверить:** Запустить скрипт и убедиться, что новые новости добавились

### 2. Векторная база (ChromaDB)
- **Зачем:** Для быстрого поиска по большим коллекциям
- **Что менять:** Слой хранения и retrieval
- **Как проверить:** Сравнить скорость поиска до и после

| 🧠 Sentence Transformers | Поиск по смыслу (эмбеддинги) вместо TF-IDF | ✅ Реализовано |
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 Каримова Камила Харисовна

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
171 changes: 128 additions & 43 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,81 +1,138 @@
# RAG Tutorial
# RAG Search: Поиск по новостям Lenta.ru

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

**Документы разработки:** [doc/tasklist.md](doc/tasklist.md) · **Данные:** [doc/DATA.md](doc/DATA.md) · **Домашнее задание:** [homework/README.md](homework/README.md) · **Слайды:** [Seminar_Big_data.pdf](Seminar_Big_data.pdf) · **Kaggle:** [Consumer Complaint Database](https://www.kaggle.com/datasets/datasnaek/consumer-complaint-database)
---

## Требования

- Python 3.10+
- [uv](https://docs.astral.sh/uv/)
- uv (https://docs.astral.sh/uv/)

---

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

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

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

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

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

---

## Данные

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

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

## Demo-вопросы
- Текст новостей (поле `text`)

В sidebar приложения или в поле ввода:
### Метаданные (показываются в интерфейсе)

| Вопрос | Ожидание |
|--------|----------|
| **Ипотека - закрытие ипотечной сделки** | ответ, doc_id=2, score > 0.4 |
| Какие переменные в датасете про безработицу? | отказ (нет таких данных) |
| За какой период данные об инфляции? | отказ |
| Как приготовить борщ? | отказ |
- `name` — заголовок новости
- `date` — дата публикации
- `url` — ссылка на источник
- `topic` — тема новости

Другие рабочие запросы: `студенческий кредит`, `Capital One`, `Wells Fargo закрытие счёта`.
---

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

| Вопрос | Тип | Ожидание |
|--------|-----|----------|
| **Путин** | положительный | ответ + источник |
| **экономика** | положительный | ответ + источник |
| **космонавты МКС** | положительный | ответ + источник |
| **Золушка** | отрицательный (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+ новостей

---

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

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

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

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

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

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

---

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

```
rag-tutorial/
├── app/
│ ├── config.py # пути, top_k, размер чанка
│ ├── chunker.py # нарезка текста
│ ├── retriever.py # TF-IDF + cosine top-k
│ ├── generator.py # demo-ответ
│ ├── prompts.py # правила и отказы
│ └── main.py # Streamlit UI
├── scripts/
│ ├── ingest.py
│ ├── build_index.py
│ ├── check_retrieval.py
│ └── check_generator.py
├── 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 (генерируются)
├── tests/
└── doc/
│ ├── 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`:
Expand All @@ -84,11 +141,39 @@ rag-tutorial/
uv run python scripts/build_index.py
```

---

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

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


---

## Лицензия

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

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

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

![Путин результат 1](screenshots/putin_1.png)
![Путин результат 2](screenshots/putin_2.png)
![Путин результат 3](screenshots/putin_3.png)

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

![экономика результат 1](screenshots/economy_1.png)
![экономика результат 2](screenshots/economy_2.png)

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

![космонавты результат 1](screenshots/cosmonauts_1.png)
![космонавты результат 2](screenshots/cosmonauts_2.png)

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

## Контакты
Подписывайтесь на канал: @Marat_notes
![отказ](screenshots/negative.png)
Loading