# RAG Article Explorer

**Streamlit-põhine lokaalne rakendus teadusartiklite RAG (Retrieval-Augmented Generation) töötluseks.**


## 🔧 Omadused
- Arxiv ja DOI-põhine artiklite import PostgreSQL andmebaasi
- PDF-tekstide ekstraktimine ja vektoriseerimine Chroma DB-sse
- Märksõnade ekstraktsioon ja kokkuvõtete tõlkimine eesti keelde
- CLI-skriptid taustatööde jaoks
- Streamlit-põhine kasutajaliides RAG-päringuteks
- Küsimuste logimine ja dokumentide valik vastuste selgitamiseks


## 📦 Paigaldus (python'i virtuaalkeskkond)
```bash
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
pip install -U langchain-chroma
pip install --upgrade --force-reinstall pymupdf
```


## 📁 Kaustastruktuur


```
rag-articles/
├── cli/                  # CLI-skriptid artiklite laadimiseks, vektoriseerimiseks jms
│   ├── load_articles.py
│   ├── build_index.py
│   ├── rag_cli.py
│   └── ...
│
├── ingest/               # Artiklite import, töötlemine ja tõlge
│   ├── arxiv_loader.py
│   ├── openai_translate.py
│   └── keyword_extraction.py
│
├── db/                   # PostgreSQL andmebaasi skeem
│   └── init_db.py
│
├── streamlit_rag_ui.py   # Streamlit kasutajaliides RAG-päringuteks
├── rag_local_demo.py     # Kohalik RAG-testi skript
├── static/               # PDF-failid ja muud staatilised andmed
├── requirements.txt
├── .env                  # Keskkonnamuutujad (nt OpenAI API võti)
└── activate_venv.sh      # Mugav skript virtuaalkeskkonna aktiveerimiseks
```

---



## 🚀 Töövoog


### 1. PostgreSQL ja Chroma DB seadistamine
Käivita `db/init_db.py` andmebaasi skeemi loomiseks.

### 2. Artiklite import
```bash
# 1. Laadi artiklid Arxivist või DOI kaudu
python -m cli.load_articles --query "traffic volume" --limit 5
python -m cli.load_article_by_doi --doi 10.1016/j.jtrangeo.2013.07.008
# Seo pdf-ga
python -m cli.auto_link_pdf_by_doi --doi 10.1016/j.jtrangeo.2013.07.008 --pdf static/pdfs/1-s2.0-S0966692313001361-main.pdf

# 2. Laadi PDF-id ja salvesta tekst + märksõnad. Viimane versioon kirjutab tulemuse documents.pkl faili
python -m cli.load_texts_from_pdfs

# 3. Tõlgi kokkuvõtted eesti keelde
python -m cli.translate_summaries

# 4. Ehita vektorindeks (Chroma)
python -m cli.build_index

# 5. Kasuta CLI-s RAG-päringuteks
python -m cli.rag_cli --question "What is Poisson distribution?"

# 6. Kontrolli indekseerimist ja indekseeri puuduvad artiklid
python -m cli.check_index_status
python -m cli.index_missing_articles
```


### 3. Käsitsi PDF-i sidumine artikliga

```bash
python -m cli.link_pdf_to_article --id 36 --pdf static/pdfs/1-s2.0-S0966692313001361-main.pdf
```

### 4. Automaatne DOI ja PDF sidumine

```bash
python -m cli.auto_link_pdf_by_doi --doi 10.1016/j.jtrangeo.2013.06.011 --pdf static/pdfs/1-s2.0-S096669231300121X-main.pdf
```

### 5. DOI artiklite import CSV failist

```bash
python -m cli.import_dois_from_csv --csv import/imporditavate_doi_failide_nimekiri.csv
```

CSV-fail peaks olema kujul:

```csv
doi,pdf
10.1016/j.trd.2022.103425,static/pdfs/nimi.pdf
10.1016/j.jtrangeo.2013.07.008,static/pdfs/teine.pdf
```

### 6. Arxiv päringu koostaja

```bash
# Lihtne päring:
python -m cli.arxiv_query_builder --topic "transport" --keywords "traffic flow" "local roads" --limit 5

# Keerulisem:
python -m cli.arxiv_query_builder --topics "traffic modeling" "urban mobility" --keywords "vehicle count" --field all --limit 10
```

### 📋 CLI käskude ülevaadetabel ja juhendmaterjalid

| Käsk                     | Kirjeldus                                      |
| ------------------------ | ---------------------------------------------- |
| `arxiv_query_builder`    |                                                |
| `auto_link_pdf_by_doi`   | Seob DOI artikliga käsitsi allalaetud PDF-i    |
| `build_index`            | Loob Chroma vektorbaasi tekstide põhjal        |
| `check_index_status`     | Kontrollib, millised artiklid on indekseeritud |
| `cleanup_keywords`       |                                                |
| `import_doi_pdf_csv`     |                                                |
| `import_dois_from_csv`   | Laeb mitu DOI artiklit CSV failist             |
| `index_missing_articles` | Indeekseerib puuduolevad artiklid              |
| `link_pdf_to_article`    | Seob käsitsi PDF faili olemasoleva artikliga   |
| `load_article_by_doi`    | Laeb DOI alusel artikli CrossRef API-st        |
| `load_articles`          | Laeb artiklid Arxivist andmebaasi              |
| `load_texts_from_pdfs`   | Ekstraktib teksti ja märksõnad PDF-idest       |
| `rag_cli`                | Küsimuste esitamine CLI kaudu                  |
| `translate_summaries`    | Tõlgib kokkuvõtted eesti keelde                |
### 💡 **Käsurea tööriistade näited**

| Käsk                                                                     | Kirjeldus                                    |
| ------------------------------------------------------------------------ | -------------------------------------------- |
| `python -m cli.load_articles --query "climate change" --limit 5`         | Laeb artiklid arXivist                       |
| `python -m cli.load_article_by_doi --doi 10.1016/j.jtrangeo.2013.07.008` | Laeb artikli DOI alusel                      |
| `python -m cli.link_pdf_to_article --id 36 --pdf static/pdfs/nimi.pdf`   | Seob PDF-i artikliga                         |
| `python -m cli.build_index`                                              | Loob Chroma vektorindeksi artiklite tekstist |
| `python -m cli.index_missing_articles`                                   | Indeveerib puuduva tekstiga artiklid         |
| `python -m cli.translate_summaries`                                      | Tõlgib kokkuvõtted eesti keelde              |
| `python -m cli.check_index_status`                                       | Kuvab, millised artiklid on indekseerimata   |
| `python -m cli.import_dois_from_csv --csv import/fail.csv`               | Laeb mitu DOI + PDF paari CSV alusel         |

## 📺 Streamlit kasutajaliides

```bash
streamlit run streamlit_rag_ui.py
```

Avaneb brauseris: http://localhost:8501

Pärast artikli valimist kuvatakse:
- Artikli pealkiri, autorid
- Kokkuvõte inglise ja eesti keeles
- Märksõnad
- Originaallink (DOI või arXiv)

Streamlitis saab ka esitada päringuid valitud artikli kohta ning vaadata eelnevaid küsimusi ja vastuseid logivormis.

| Vaade                                                                                                                             | Kirjeldus                                           |
| --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- |
| ![Artikli valik](https://file+.vscode-resource.vscode-cdn.net/home/ardo/Obsidian/Abiks/RAG/docs/screenshots/select_article.png)   | Vali artikkel ja vaata kokkuvõtet                   |
| ![Küsimus-vastus](https://file+.vscode-resource.vscode-cdn.net/home/ardo/Obsidian/Abiks/RAG/docs/screenshots/qa.png)              | Esita küsimus artikli kohta                         |
| ![PDF allalaadimine](https://file+.vscode-resource.vscode-cdn.net/home/ardo/Obsidian/Abiks/RAG/docs/screenshots/pdf_download.png) | Ava või laadi alla seotud PDF                       |
| ![Logi ja filtrid](https://file+.vscode-resource.vscode-cdn.net/home/ardo/Obsidian/Abiks/RAG/docs/screenshots/log_view.png)       | Filtreeri küsimuste logi kuupäeva ja märksõna järgi |

---
## 🧠 **Virtuaalkeskkonna skript (sh failis `activate_venv.sh`)**

```bash
#!/bin/bash
cd "$(dirname "$0")"
source .venv/bin/activate
```

Seejärel:

```bash
source activate_venv.sh
```

---
## 🧪 Testimine

Projektil on Pytest konfiguratsioon:

```bash
pytest
```
Käivita ainult üks konkreetne testfail:

```bash
pytest tests/test_keywords.py
# Vea korral käivita
python -m cli.cleanup_keywords

pytest tests/test_article_completeness.py
pytest tests/test_load_articles.py
pytest tests/test_pdf_linking.py
pytest tests/test_import_dois_from_csv.py
pytest tests/test_translate_summaries.py
pytest tests/test_build_index.py
pytest tests/test_rag_cli.py

# Ei ole korras
pytest tests/test_load_article_by_doi.py
pytest tests/
pytest tests/
```

Käivita test koos logidega (vajalik veatuvastusel):

```bash
pytest -s -v
```
### 📁 Failide kirjeldused

| Failinimi                          | Kirjeldus                                                                                                                     |
| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| **`test_keywords.py`**             | Kontrollib, et artiklite märksõnad oleksid unikaalsed ja mitte tühjad.                                                        |
| **`test_load_articles.py`**        | Lisab testartikli andmebaasi ja kontrollib selle olemasolu. Testi lõpus eemaldab andmed.                                      |
| **`test_pdf_linking.py`**          | Kontrollib, et PDF-failid oleksid lingitud `static/pdfs/` kausta ja olemas kettal. Samuti testib teksti salvestamist PDF-ist. |
| **`test_article_completeness.py`** | Kontrollib, kas kõik artiklid andmebaasis omavad olulisi veerge (nt `title`, `text`, `summary`).                              |
| **`conftest.py`**                  | Sisaldab `db_engine` fixture’it – loob ühenduse PostgreSQL andmebaasiga kõikide testide jaoks.                                |
